爬取过程中经常会遇到多个请求需要同一个session(cookies)的操作。
对于requests 库来说,使用较为简单:
import requests
session = requests.Session()
def get_page(url, model):
try:
data = {
...
}
if model == 'GET':
response = session.get(url=url, headers=headers, verify=False)
else:
response = session.post(url=url, data=data, headers=headers, verify=False)
if response.status_code == 200:
# response.encoding = 'gbk'
return response
return None
except Exception as e:
print(e)
return None
以上代码即可维持同一会话请求。
在scrapy中:
通常第一次请求网站,会在response的headers中返回set-cookie,scrapy中cookie的保存方式为字典,所以需要先将set-cookie转化为字典类型,然后将cookie字典传入请求中。
同时需要在settings中设置 COOKIES_ENABLED = True (默认default_settings 就是true,你不修改也可以)
此时在得到的response 的 request 的headers中,你会发现已有‘cookies:xxxxxxx' (若COOKIES_ENABLED = false 则没有)
至此即实现了同一会话请求。
附:
cookies转成字典实现:
def stringToDict(cookieStr):
itemDict = {}
items = cookieStr.split(';')
for item in items:
key = item.split('=')[0].replace(' ', '')
value = item.split('=')[1]
itemDict[key] = value
return itemDict
带cookies请求实现:
if response.headers.get('Set-Cookie') != None:
cookies = str(response.headers.get('Set-Cookie'), encoding="utf8")
Cookies = stringToDict(cookies)
yield scrapy.Request(url=url,cookies=Cookies, dont_filter=True,callback=self.parse_detail)
----------------------------------------------------我是分割线--------------------------------------------------------------------------------------------
欢迎关注博主个人公众号,一起来嗨皮呀