爬虫部分
首先,我们得爬取百度新闻的信息。
爬虫分为两部分:
- 获取新闻链接
- 通过链接爬取新闻信息
新闻链接爬取(1)
1.获取新闻链接
1.1 分析请求
打开chrome浏览器,输入百度新闻链接,按F12打开开发者工具,依次点击Network->Doc,再刷新一次网页,效果如下:
我们看到了所有返回doc的请求。接着,我们点击Preview选项卡:
通过预览,我们可以看到这个请求热点要闻、热搜新闻词和百家号三个模块的信息,这些蓝色的链接就是我们要的新闻链接。
点击Headers选项,我们可以看到请求的构造:
很好,我们现在就可以通过构造类似请求来获取到热点要闻、热搜新闻词和百家号三个模块的信息了。
构造请求,获取相应,解析html。
但是,事情并不简单。我们滚动页面:
我们发现还有一些模块并不在我们找到的那个请求中。
我们判断,这些内容是在我们滚动页面时通过动态加载上去的。
点击XHR选项卡,我们找到了一些线索:
我们发现这些请求都带着一个 id 属性,而这些属性的中文恰巧对应我们看到的那个模块的名字。
我们看看第一个xhr类型请求:
它比我们找到的第一个请求多了一个Query String Parameters 属性,id表示模块名,t表示时间,ajax表示返回类型。
这个时间如果用 ms 表示49年多,而计算器时间都是从1970年开始算起,所以这个数字表示的是ms。
看完了请求的结构,我们可以看看服务器相应的内容了
这个请求返回了一个json 结构数据,新闻链接就放在键值对内。
除了当地新闻模块,其他模块的请求都返回了一个html,新闻链接放在html中。值得注意的是这些模块的请求的Query String Parameters 属性中没有ajax键。
1.2 构造请求
我们暂时放下第一个请求。
我们首先实现返回json数据的请求:
import requests
import json
url = 'http://news.baidu.com/widget?id=LocalNews&ajax=json&t=1565742671236'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,appli