一、cookies
cookies和User-Agent都属于header的内容,是爬虫必须要设置的选项。
我们先来看一个获取cookies的示例:
import requests
r = requests.get('https://www.baidu.com/')
print(r.cookies)
for key,value in r.cookies.items():
print(key+'='+value)
运行结果:
<RequestsCookieJar[<Cookie BDORZ=27315 for .baidu.com/>]>
BDORZ=27315
cookies的目的就是维持登录,下面我们来看一下用cookies维持登录的例子。
如果不设置cookies,访问知乎:
import requests
headers={
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
}
r = requests.get('https://www.zhihu.com/',headers=headers)
print(r.text)
上篇已经介绍过,这里需要设置一下User-Agent,不然支付会决绝访问。运行查看结果,此为未登录时的数据。
设置cookies后比较一下,首先登录知乎:
获取到cookies,然后设置到headers中,示例代码如下:
import requests
headers={
'cookie':'q_c1=69766cd339a54727a43c932f88e5219a|1543560937000|1543560937000; d_c0="AIAhXV3tmA6PTh9iKZY7G4EkH8rNoCz8ogU=|1543560939"; _xsrf=yjs42x6pTqP026X8louFX2xQ2oWuDNzC; _zap=2afe039d-3dfa-4e88-ac5b-18a448d02159; tst=r; capsion_ticket="2|1:0|10:1545379051|14:capsion_ticket|44:MDI2ZmM5NjI3ZDNmNGZlYWE2NDM4NGM2MWY5ZTQyNzU=|f6ec55ce01a506e07f52944a7eb4303f4541e1ff7c37b3297ff6bac784c22614"; z_c0="2|1:0|10:1545379059|4:z_c0|92:Mi4xZmJuVEF3QUFBQUFBZ0NGZFhlMllEaVlBQUFCZ0FsVk44LW9KWFFBaTc2bERIZ1F5X2tQM0o3bDA1eWFWU1VMQ2hn|0895c1025a0b494a14cf85e0d6b901828850dd6e5590b75cd4d30dc16d90ca98"; __utma=51854390.970233862.1543560939.1543563512.1545379076.3; __utmz=51854390.1545379076.3.3.utmcsr=zhihu.com|utmccn=(referral)|utmcmd=referral|utmcct=/; __utmv=51854390.100--|2=registration_date=20161218=1^3=entry_date=20161218=1; tgw_l7_route=b3dca7eade474617fe4df56e6c4934a3',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36',
}
r = requests.get('https://www.zhihu.com/',headers=headers)
print(r.text)
此时运行后发现,获取的是正常登录知乎后的数据。
二、会话维持 session
上面的例子,我们只用来一次get方法,在实际中,我们可能会用多次get,每一次的get可能会依赖于上次的get。
按照上面的例子,我们每次get或post都相当于打开了一个新的浏览器,要想实现本次的get依赖于上次的get,每次get都需要设置cookie,这样比较麻烦,session就是为解决此问题而诞生的。
我们先来看一个例子:
import requests
requests.get('http://httpbin.org/cookies/set/number/123456789')
r = requests.get('http://httpbin.org/cookies')
print(r.text)
我们先设置一个cookie,然后再用一个get方法获取cookie,运行结果如下:
{
"cookies": {}
}
获取的cookie为空,是因为第二次get实际上新打开一个浏览器。如果用seesion之后呢?示例如下:
import requests
s = requests.Session()
s.get('http://httpbin.org/cookies/set/number/123456789')
r = s.get('http://httpbin.org/cookies')
print(r.text)
运行结果如下:
{
"cookies": {
"number": "123456789"
}
}
这就是session的作用,可以模拟一个浏览器打开一个站点的不同网页。