案例需求:
1.爬取该新闻网站——(网易新闻)的数据,包括标题和链接
2.爬取所有数据(翻页参数)
3.利用jsonpath解析数据
分析:
该网站属于异步加载网站——直接网页中拿不到,需要借助fidder抓包工具拿取
可以看到第一页请求网址
https://news.163.com/special/cm_yaowen20200213/?callback=data_callback
第二页请求网址
https://news.163.com/special/cm_yaowen20200213_02/?callback=data_callback
第五页(最后一页)请求网址:
https://news.163.com/special/cm_yaowen20200213_05/?callback=data_callback
所以翻页代码如下:
首页地址为第一页地址
for i in range(2,6):print('==========', '当前是第{}页'.format(i))page_url = 'https://news.163.com/special/cm_yaowen20200213_0{}/?callback=data_callback'.format(i)
利用josnpath解析数据
因为该网页不是常规的josn源码数据,所以需要进行一些处理
text_data=data.split('data_callback(')[1] # print(text_data) text_data1 = text_data.split(')')[0] # print(text_data1) json_data = json.loads(text_data1) title = jsonpath(json_data,'$..title') url = jsonpath(json_data,'$..docurl')
处理解析数据
for i,j in zip(title,url):print(i)print(j)print('=======================================')
示例代码:
import requests
from jsonpath import jsonpath
import json
def get_data(url):headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36'}r = requests.get(url,headers=headers)# print(r.text)return r.text# print(r.text)# print(r.json())
def parse_data(data):text_data=data.split('data_callback(')[1]# print(text_data)text_data1 = text_data.split(')')[0]# print(text_data1)json_data = json.loads(text_data1)title = jsonpath(json_data,'$..title')url = jsonpath(json_data,'$..docurl')for i,j in zip(title,url):print(i)print(j)print('=======================================')# print(title)# print(url)
if __name__ == '__main__':url = "https://news.163.com/special/cm_yaowen20200213/?callback=data_callback "# h = get_data()# parse_data(h)for i in range(2,6):print('==========', '当前是第{}页'.format(i))page_url = 'https://news.163.com/special/cm_yaowen20200213_0{}/?callback=data_callback'.format(i)h = get_data(page_url)parse_data(h)