2.2 Python使用Requests库爬取数据

相比于自带的URLlib库,Requests更为强大直观语义化。本文为学习崔庆才的gitbookRequests官网总结输出。

1. 使用Requests抓取网页

强大的Request只需要直接使用get()函数就可以获取网页了,在get()中可以指定各种参数,如proxiesheaders等参数。

如:

import urllib.request
import requests
from urllib import request, error

#构造proxy
proxy="http://x.x.x.x:80"
proxies = {
  "http": proxy,
  "https": proxy,
}
#构造headers
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
}
#定义抓取的网站
url = 'https://www.baidu.com/'

try:
    #使用get函数直接获取网页
    r = requests.get(url=url,headers=headers,proxies=proxies)
    print(type(r))
    print(r.status_code)
    print(type(r.text))
    print(r.text)
    print(r.cookies)
except error.HTTPError as err:
    print(err.reason, err.code, err.headers, sep='\n')
except urllib.error.URLError as err:
    print(err.reason)
else:
    print('ok.')

2. 使用Requests抓取图片、视频等二进制数据

在上面的例子中,我们抓取的是一个页面,实际上它返回的是一个 HTML 文档,那么如果我们想抓去图片、音频、视频等文件的话应该怎么办呢?

其实,图片、音频、视频这些文件都是本质上由二进制码组成的,由于有特定的保存格式和对应的解析方式,我们才可以看到这些形形色色的多媒体。所以想要抓取他们,那就需要拿到他们的二进制码。

下面我们以 GitHub 的站点图标为例来感受一下:

在这里打印了 Response 对象的两个属性,一个是text,另一个是 content。两个属性有什么区别?前者返回的是字符串str类型,如果返回结果是文本文件,那么用这种方式直接获取其内容即可 。如果返回结果是图片、音频、视频等文件,Requests 会为我们自动解码成第二种属性即bytes 类型,即获取字节流数据。

进一步地,我们可以将刚才提取到的图片保存下来。

运行结束之后,可以发现在文件夹中出现了名为 favicon.ico 的图标。

3. 使用Requests判断服务器响应的状态、Hearders、Cookies等

发送 Request 之后,得到的自然就是 Response,在上面的实例中我们使用了 text 和 content 获取了 Response 内容,不过还有很多属性和方法可以获取其他的信息,比如状态码 Status Code、Headers、Cookies 等信息。

下面用一个实例来感受一下:

在这里分别打印输出了 status_code 属性得到状态码, headers 属性得到 Response Headers,cookies 属性得到 Cookies,url 属性得到 URL,history 属性得到请求历史。运行结果如下:

Status Code 常用来判断请求是否成功,Requests 还提供了一个内置的 Status Code 查询对象 requests.codes。 如:

除了OK码以外,还有以下返回码和相应的查询条件:

比如如果我们想判断结果是不是 404 状态,可以用 requests.codes.not_found 来比对。

4. 使用Request保持会话

在 Requests 中,我们如果直接利用 get() 或 post() 等方法的确可以做到模拟网页的请求。但是这实际上是相当于不同的会话,即不同的 Session,也就是说相当于你用了两个浏览器打开了不同的页面。

利用 Session 我们可以做到模拟同一个会话,而且不用担心 Cookies 的问题,通常用于模拟登录成功之后再进行下一步的操作。 如:

5. SSL证书验证

Requests 提供了证书验证的功能,当发送 HTTP 请求的时候,它会检查 SSL 证书,我们可以使用 verify 这个参数来控制是否检查此证书,其实如果不加的话默认是 True,会自动验证,如果设置为False的话,则会跳过证书验证,可以解决大部分SSLError的错误。

提示一个错误,叫做 SSLError,证书验证错误。所以如果我们请求一个 HTTPS 站点,但是证书验证错误的页面时,就会报这样的错误,那么如何避免这个错误呢?很简单,把 verify 这个参数设置为 False 即可。

如:

这样,就会打印出请求成功的状态码。

6. 使用Requests进行身份认证

在访问网站时,我们可能会遇到认证页面需要填入用户名密码。这时可以使用 Requests 自带的身份认证功能,实例如下:

如果用户名和密码正确的话,请求时就会自动认证成功,会返回 200 状态码,如果认证失败,则会返回 401 状态码。

当然如果参数都传一个 HTTPBasicAuth 类,就显得有点繁琐了,所以 Requests 提供了一个更简单的写法,可以直接传一个元组,它会默认使用 HTTPBasicAuth 这个类来认证。

所以上面的代码可以直接简写如下:

运行效果和上面的是一样的。

Requests 还提供了其他的认证方式,如 OAuth 认证,不过需要安装 oauth 包,命令如下:

使用 OAuth1 认证的方法如下:

更多详细的功能就可以参考 requests_oauthlib 的官方文档:https://requests-oauthlib.readthedocs.org/

Last updated