示例网站:雪球首页
示例网站展示:
目的:获取热帖热帖的标题及内容
右键检查一顿判断,找到需要的包,在此不再赘述,下边代码如不理解,可以看之前的博客,详细阐述了如何通过浏览器抓包。(反爬机制:懒加载)
# 爬取一页当中的15条数据
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4292.2 Safari/537.36'
}
# sess = requests.Session()
# sess.get(url = 'https://xueqiu.com/',headers=headers)
url = 'https://xueqiu.com/statuses/hot/listV2.json?since_id=-1&max_id={}&size=15'
page_json = requests.get(url=url.format(132899-page*15),headers=handers).json()
print(page_json)
返回:
{‘error_description’: ‘遇到错误,请刷新页面或者重新登录帐号后再试’, ‘error_uri’: ‘/statuses/hot/listV2.json’, ‘error_data’: None, ‘error_code’: ‘400016’}
有些不太对劲,之前别的网站这样请求之后可以获取到数据,这个网站获取不到了,说明请求模拟的不像,被服务器发现了,查看这个请求信息,里面还有一堆 Cookie 代码中并没有模拟(不知道这一大串 Cookie 表示的什么,所以乱打了一通)
在网页的 Cookies 中找到了请求发的这些数据,这些数据是在第一次请求雪球网站的时候写入进去的。
所以在代码当中需要先请求首页将 Cookies 获取到,然后携带 Cookies 发送给服务器请求页面详情数据。
如何实现携带 Cookie 发送请求?
1. 将 Cookies 数据粘贴到代码的 headers 字典中
这种方法有弊端,Cookies 的值是不断变化的,如果一粘了之,Cookies 变化了,代码就得停下来重新改。
2. 使用 requests.Session()
- 创建一个实例化对象
programmer_plus = requests.Session()
- 使用实例化对象对网站发起请求
# 实例化对象会保存 response 返回的Cookie
programmer_plus.get(url = index ,headers=headers)
- 请求真正获取数据的 URL
page_json = programmer_plus..get(url=url,headers=handers).json()
雪球页面爬取代码
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4292.2 Safari/537.36'
}
sess = requests.Session()
sess.get(url = 'https://xueqiu.com/',headers=headers)
url = 'https://xueqiu.com/statuses/hot/listV2.json?since_id=-1&max_id={}&size=15'
for page in range(1):
page_json = sess.get(url=url.format(132899-page*15),headers=handers).json()
for item in page_json['items']:
print('标题:',item['original_status']['title'])
print('内容:',item['original_status']['text'])
print()