爬虫组队学习——task1

2020-04-21  本文已影响0人  migugu

互联网与HTTP

爬虫需要了解的网络连接知识不多,只需要知道最基本的连接原理即可。
HTTP是一个客户端(用户)服务器端(网站)之间进行请求和应答的标准,客户端发出请求(即requests)到服务器,服务器返回响应的文件(即response)。

HTTP请求方法
GET 向指定的资源发出“显示”请求,应该只用于读取数据(GET可能会被网络蜘蛛等随意访问。
HEAD 与GET方法一样,是向服务器发出直顶资源的请求,使用这个方法可以在不必传输内容的情况下,将获取到其中“关于该资源的信息”(元信息或元数据)。
POST 向指定资源提交数据,请求服务器进行处理。数据被包含在请求文本中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。
PUT 向指定资源位置上传输最新内容。
DELETE 请求服务器删除Request-URL所标识的资源。
TRACE 回显服务器收到的请求,主要用于测试或诊断。
OPTIONS 这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用“*”来代表资源名称向Web服务器发送OPTIONS请求,可以测试服务器共能是否正常。
CONNECT HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的连接(经由非加密的HTTP代理服务器)。方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Method Not Allowed),当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码501(Not Implemented)。

网络基础

网页是由 HTML 、 CSS 、JavaScript 组成的。

爬虫原理

爬虫的原理就是模拟浏览器对目标网站发送请求,然后从网站返回的数据中提取有用的数据,并将有用的数据存放于数据库或文件中。

  1. 模拟计算器对服务器发起request请求
  2. 接收服务器端的response内容并解析、提取所需的信息
  3. 存储数据

一个爬虫最普遍的过程:

  1. 访问站点;
  2. 定位所需的信息;
  3. 得到并处理信息。

使用开发者工具检查网页

Chrome的开发者模式为用户提供了下面几组工具。

以python官网的“python之禅”为例,在Chrome中打开https://www.python.org/dev/peps/pep-0020/ ,按f12检查网页。

爬取python之禅

import requests
url = "https://www.python.org/dev/peps/pep-0020/"
r = requests.get(url)
r.status_code # 查看状态码
r.text
print(r.text[r.text.find('<pre')+28:r.text.find('</pre>')-1])

实战—爬取豆瓣电影top50

豆瓣电影top250的url为https://movie.douban.com/top250,250条电影记录分布在10页中,经过简单分析,在换页时,url发生改变。

第一页:https://movie.douban.com/top250?start=0&filter=
第二页:https://movie.douban.com/top250?start=25&filter=
第三页:https://movie.douban.com/top250?start=50&filter=

不难发现,每增加一页,url中的参数start值就增加25,故可以使用循环获得url列表,再根据url获取源码。

# 获取url列表
def get_urllist():
    urllist = []
    for i in range(0,250,25):
        url = 'https://movie.douban.com/top250?start='+str(i)+'&filter='
        urllist.append(url)
    return urllist

接下来分析对源码进行解析,首先获取源码。

在爬取网页时,返回的status_code不是200而是418,原因是被网站的反爬程序返回。因此,在请求时,添加下列语句修改headers。

headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'}
r = requests.get(url,headers=headers)
# 获取源码
def get_html(url):
    headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'}
    r = requests.get(url, headers=headers)
    return r.text

以第一页为例,发现需要的信息都在<li>标签中,所以需要定位li标签提取所需要的信息。


但是,又发现在真正含有所需要信息的<li>标签qian ,还有19个干扰的<li>标签。而这19个标签正好前19个li标签,所以很好办,直接从第20个标签开始提取就行。

接下来再对所需信息进行分析

不难发现,排名为<em标签的文本内容,影片名为<span class="title"标签的文本内容,链接为<a 标签中href属性对应的值,名言为标签<span class=“inq” 的文本内容,评分为<span class=“rating_num” property=“v:average” 的文本内容。
获取这些信息后,就可以利用find方法定位内容,进行提取。

# 解析源码
def prase_html(html):
    soup = BeautifulSoup(html) # 使用lxml解析库
    items = soup.find_all(name = li) # 查询标签为li的元素
    for i in items[19:]: # 排除前19个li标签
        yield {
            'title': item.span.get_text(),
            'index': item.find(name='em').text,
            'image': item.find(name='a')['href'],
            'quote': item.find(class_="inq").text,
            'score': item.find(class_="rating_num").text
        }

接下来将数据转化为json字符串并写入到文件中

def write_to_file(content):
    with open("douban_top250.txt", 'a', encoding='utf-8') as f:
        f.write(json.dumps(content, ensure_ascii=False) + '\n') 
上一篇下一篇

猜你喜欢

热点阅读