腾讯新闻
腾讯新闻网页是标准的ajax加载网页,我们要通过chrome的开发者工具,监控网络请求,并分析。目标是爬取https://news.qq.com/ 的热点精选 ,“热点精选”至少爬50个出来,存储成csv 每一行至少包括标号(从1开始),标题,链接,…。
requests和selenium各来一遍~
requests:
首先观察“热点精选”的js,有三个变化的参数,其中expIds像是每一个异步加载区域内图片的id组合,但是我找了一圈没有找到expIds的位置
观察到ajax的js中request url的组成,构建data参数集合,结果却报错
直接组合url,并且忽略找不到的expIds,响应结果包含了异步的html,于是可以开始定位
然后利用正则与json把响应结果变成字典的形式
依据json中的信息,来解析
于是可以得到单个ajax 加载部分的想要摘取的数据,其中要注意global count
最后把一个个部分封装成函数,循环10个异步加载,并将数据写入csv
最后得到10个异步加载共100条“热点精选”信息
selenium:
对于一个异步加载的网页,selenium最重要的是需要操作网页右边的滚动条,对应下方代码的第2-3行,同理用xpath定位文章和图片,获取需要的元素
最后设置循环,累计将滚动条下滑20次,并将需要的元素,写入csv
最后是selenium爬取腾讯新闻的结果展示,也是爬了100项
知乎爬虫
https://www.zhihu.com/search?q=Datawhale&utm_content=search_history&type=content
用requests库实现,不能用selenium,不仅要爬出第一页的内容,而且要爬出所有的内容,给的链接仅仅是第一页的内容,该链接需要登录。ajax加载用requests完成爬取,通过Chrome的开发者工具,分析出ajax。
requests:
我的目标是把知乎上Datawhale相关的所有信息抓取下来,就是把滚动条一直往下滚动,知道没有信息了为止。因为数据量比较大,可以将爬取数据存入mongodb非关系型数据库。
首先打开网页与Chrome检查,并动态地下拉滚动条,分别看看JS和XHR里面有哪些新增项,于是在XHR里看到了一个个batch和一个name形似url的响应,点开一看,里面正好是我要的这一个mini_batch的所有信息,于是对比几个相似响应的request url,发现只有几个参数有变化。
同时这两个参数的变化规律也很简单,开始爬取。我发现,即使加了cookie、设置了代理依旧被反爬了,所以一定是有什么加密参数没有解析出来。
后续根据前辈的介绍,查找了两种解决思路,一种是直接鲁js与设置验证码识别,涉及到很多前端方面的知识,另一种是用DecryptLogin库,目前这两种方案分别存在‘无法识别exports’和‘缺少标识符’的bug没有解决,我会继续努力,争取早日拿下知乎。