【Python3网络爬虫】 requests库的使用

1.requests库可以使Cookies,登陆验证,代理设置更加简单。

一段代码,去对比urllib库的使用:

import requests
r = requests.get('https://wwww.baidu.com')
print(type(r))
print(r.status_code)
print(type(r.text))
print(r.cookies)

这些可以体现在请求上的相对整洁与直白 类似的POST请求与PUT还有DELETE都是直接使用对应的方法。

2.GET请求

import requests
r = requests.get('http://httpbin.org/get')
print(r.text


网页返回类型是str类型,但是它很特殊,是JSON格式,所以如果想解析返回结果,得到一个字典格式的话,可以直接调用json()方法。

但是如果返回结果不是JSON格式,便会出现解析错误,抛出json.decoder.JSONDecodeError异常。

抓取网页 配合正则表达式就可以提取想要的网页了 但是在抓取知乎一样的话一定要添加headers 不然会被拒绝访问

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

import requests

r = requests.get("http://gethub.com/favicon.ico")
with open('favicon','wb') as f:
    f.write(r.content) 

这里使用了open方法,它的第一个参数是文件名称。第二个参数代表以二进制的形式打开,可以想文件里写入二进制数据。

3.POST请求

与GET请求的使用非常相似

4.响应

发送请求后,得到的自然是响应。 有很多对应的属性和方法


高级用法

1.文件上传

我们知道requests可以模拟提交一些数据,假如网站上需要上传文件,我们也可以用它来实现。

import requests

files = {'file':open('favicon.ico','rb')}
r = requests.post('http://httpbin.org/post',files = files)
print(r.text)

上传的文件会在字典  file 键对应下 是二进制数据

2.Cookies

使用urllib库处理过Cookies,写法比较复杂,而使用requests,获取和设置Cookies只需要简单的的一步即可完成。

import requests

r = requests.get('https://www.baidu.com')
print(r.cookies)
for key value in r.cookies.items():
    print(key+'='+value) 

这里首先调用cookies属性既可以成功获取Cookies,可以发现它是RequestCookieJar类型

然后用items()方法将其转化为元组组成列表,遍历输出每一Cookie的名称和值,实现Cookie的遍历解析。


当然我们可以直接用Cookie来维持登陆状态,登陆的时候测试了一下教务在线。发现完全可以复制下Cookies然后在请求的时候添加到Headers中。

3.会话维持

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

    若想维持同一个会话。可以设置一样的cookies但是会比较繁琐,有一个新的利器Session对象。

示例:

import requests

requests.get('http://httpbin.org/cookies/set/number/123456789')
r = requests.get('http://httpbin.orh/cookies')
print(r.text)

这样并不能获取到设置的cookies

import requests

s = requests.Session()
s.get('http://httpbin.org/cookies/set/number/123456789')
r = s.get('http://httpbin.org/cookies')
print(r.text)

成功获取

所以Session可以做到模拟同一个会话而不用担心Cookies的问题,它通常用于模拟登陆成功之后再进行下一步的操作。

Session在平常用得非常广泛,可以用于模拟在一个浏览器中打开同一站点的不同页面,后面会有专门的章节来讲解这部分内容。


4.SSL证书验证

此外,requests还提供了证书验证的功能。当发送HTTP请求的时候,它会检查SSL证书,我们可以使用verify参数控制是否检查此证书。其实如果不加verify参数的话。默认是True ,会自动验证。

前面我们提到过,12306证书没有被官方CA机构信任,会出现证书验证错误的结果,我们现在访问它都可以看到一个证书问题的页面。

import requests
response = requests.get('https://www.12306.cn',verify = False)
print(response.status_code)

【Python3网络爬虫】 requests库的使用_第1张图片

可以发现 报了一个警告,它建议我们给它指定证书。可以通过设置忽略警告的方式来屏蔽警告。

import requests
from requests.packages import urllib3

urllib3.disable_warnings()
response = requests.get('https://www.12306.cn',verify = False)
print(response.status_code)

或者通过捕获警告到日志的方式忽略警告:

import requests
import logging

logging.captureWarnings(True)
response = requests.get('http://www.12306.cn',verify = False)
print(response.status_code)

【Python3网络爬虫】 requests库的使用_第2张图片

当然我们也可以指定一个本地证书 用作客户端证书,这可以是单个文件(包含密钥和证书)或一个包含两个文件路径的元组 :

import requests
response = requests.get('https://12306.cn',cert=('/path/server.crt','/path/key'))
print(response.status_code)

当然上面的代码是演示实例,我们需要crt和key文件,并且指定它们的路径。注意,本地私有证书必须是解密状态,加密状态的key是不支持的。

5.代理设置

大规模爬取的时候,很多网站可能会弹出验证码,或者跳转到登陆页面,更有甚者会直接封禁客户端的IP,导致一定时间段内无法访问。

为了防止这种情况的发生就需要设置代理来解决这个问题,这就需要用到代理来解决这个问题,这就需要用到proxies参数。

可以使用这样的方式设置:

import requests

proxies = {
    "http":"http://10.10.1.10:3128",
    "https":"http://10.10.1.10:1080"
 }
requests.get("https://www.taobao.com",proxies = proxies)

当然直接运行这个实例可能无效,因为这个代理可能是无效的,要换成有效的代理,才可以得到。

若代理需要使用HTTP Basic Auth 可以使用类似http://user:password@host:port这样的语法来设置代理。

示例:

import requests
proxies = {
    "http":"http://user:[email protected]:3128"
    
}
requests.get("https://www.taobao.com",proxies = proxies)

除了基本的HTTP代理外,requests还支持SOCKS协议的代理,示例如下:

import requests

proxies = {
    'http':'socks://user:password@host:port',
    'https':'socks://user:password@host:port'
 }
requests.get("https://www.taobao.com",proxies = proxies)

6.超时设置

和urllib库里的设置类似 ,但是在超时设置中。实际上timeout是可以分为两个阶段的,一个是连接(connect),一个是读取(read),可以传入到一个元组中。如果想永久等待们可以选择不设置或者将timeout设置为None.

7.身份认证

在访问网站的时候。可能会出现认证页面。此时可以使用requests自带的身份认证功能。示例如下:

import requests
from requests.auth import HTTPBasicAuth

r = requests.get('http://localhost:5000',auth=HTTPBasicAuth('username','password'))
print(r.status_code)

如果认证成功,则会返回200状态码,如果认证失败,则返回401状态码。

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

所以上面的代码可以简写为:

import requests

r = requests.get('http://localhost:5000',auth=('username','password'))
print(r.status_code)

此外,requests还提供了其他认证方式,如OAuth认证,不过此时需要安装oauth包。具体等我要用到的时候再去看吧。

8.Prepare Request(不是很懂具体是用来干什么的)

前面介绍urllib时,我们可以将请求表示为数据结构,其中各个参数都可以通过一个Request对象来表示。这在requests里同样可以做到,这个数据结构就叫Prepared Request 。

from requests import Request,Session

url = 'http://httpbin.org/post'
data = {
    'name':'Zen'
 }
headers = {
    'User-Agent':' 超级牛逼的什么什么浏览器,我就不说了'
}
s = Session()
req  = Request('POST',url,data=data,headers = headers)
prepped = s.prepare_request(req)
r = s.send(prepped)
print(r.text)
这里我们引入了Request ,然后用url、data、headers参数构造了一个Request对象,这时需要再调用Session的prepare_request()方法将其转换为一个Prepared Request对象,然后调用send()方法发送即可。

有了Request这个对象,就可以将请求当作独立的对象来看待,这样在进行队列调度时会非常方便。



requests库相比urllib库的话,就方便直白很多了。









你可能感兴趣的:(Python3网络爬虫)