这个案例需要学会滚轮往下拖的时候动态加载的数据如何爬取,区别于豆瓣电影爬取
cookie概述:
cookie
就是存储在客户端的一组键值对cookie
在web
中主要应用有免密登录cookie
和爬虫之间的关联,有时候我们对一张页面进行请求的时候,如果请求的过程中不携带cookie
的话,那么我们是无法请求到正确的页面数据,这是一种非常常见的反爬机制,因此遇到这种情况我们必须,所有的请求必须携带cookie
案例:爬取雪球网中的咨询信息
- 需求:爬取雪球网,推荐栏目下所有文章的标题和内容,练习地址
- 分析:
- 1)判断爬取的咨询数据是不是为动态加载的数据,相关更多的咨询是动态加载的,当滚轮滑动到底部时会动态加载更多的数据
- 2)定位到
ajax
请求的数据包,提取出url
,响应的数据为json
格式的咨询数据
- 3)
get
请求不要封装data
,get
请求要看params
参数,而post
请求必须携带data
- 4)实例代码,遇到了
cookie
反爬机制,阻止了我们拿到想要的json
数据,分析原因在于我们没有严格意义上模拟浏览器发请求,遇到这类情况,我们可以将浏览器发请求携带的头部全部粘贴到headers
字典中,然后将headers
作用到requests
操作中即可,但是通常情况下优先试试将cookie
数据加载到请求头
import requests
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'
}
url = 'https://xueqiu.com/v4/statuses/public_timeline_by_category.json?since_id=-1&max_id=20370842&count=15&category=-1'
page_text = requests.get(url=url, headers=headers).json()
page_text
cookie的两种处理方式:
- 手动处理,即将抓包工具中的
cookie
信息全部粘贴到headers
中,由于cookie
有有效时长且会动态变化,如果过了有效时长或者动态变化了,这种方式就不适用了 - 自动处理,基于
session
对象实现自动处理,使用构造函数requests.Session()
返回一个session
对象
session
对象的作用,该对象可以像requests
一样向服务器发送get
、post
…请求,只不过在使用session
对象在发送请求过程中产生了cookie
,则该session
对象会自动保存cookie
值。那么这就意味着我们下次再使用该session
对象发送请求,则这个请求就会自动携带cookie
。
项目代码:
import requests
headers = {
'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'
}
session = requests.Session() #创建一个session对象
#捕获cookie,大部分网站是第一次对网站进行访问时就会产生cookie
base_url = 'https://xueqiu.com/'
session.get(url=base_url, headers=headers)
url = 'https://xueqiu.com/v4/statuses/public_timeline_by_category.json?since_id=-1&max_id=20370842&count=15&category=-1'
page_text = session.get(url=url, headers=headers).json() #第二次使用session,携带cookie发起请求
page_text
总结:
- 爬虫中遇到动态加载数据,滑动加载数据时,首先要将抓包工具切换到
XHR
栏目下,定位到动态ajax
请求的数据包,进而定位到url
- 爬虫中遇到基于
cookie
反爬的反爬机制时,需要构建session
对象,基于该对象来发送请求 - 爬虫中一旦使用session对象时,session对象至少被使用两次,第一次,使用session对象发请求是为了捕获cookie并且将其存储到session对象中;第二次,使用session对象发请求是为了携带cookie信息发起请求,进而破解网页cookie反爬机制。即第一次拿cookie,第二次带着cookie拿数据
session = requests.Session() #构建一个session对象
...
...
response = session.get(url=url, headers=headers) #然后基于session而不是requests发请求,第一次请求是为了捕获和存储cookie