1.背景使用
因为工作原因的原因去爬取部分政府网站的公开数据,因为政府网站的反爬一直以来是属于比较难的,比如今天就遇到一个比较*蛋的网站:
此网站定眼一看是个post请求,常规方法加上data去请求一般就可以处理了
但是让人头疼的一点是它的下一页不在post的data内,这样的话常规请求只能请求一页就很麻烦了。就没法获取所有的数据了。一般这样的网站使用常规手段就没法用了,所以在这里告诉各位朋友一个非常搞笑的东西——pyppeteer!!!
2.正文
pyppeteer 是一款类似selenium的自动化测试的工具,其是根据puppeteer衍生而来的。因为这个东西很久没有维护了 所以会存在很多的bug。关于pyppeteer的如何安装等等,在这里就不多做介绍了,因为网上有很多大佬对其进行了详细的说明。这里说它的主要目的是为了针对这种特定的网站。
因为pyppeteer使用的浏览器内核是chromium,所以我们需要提前下载该浏览器内核,并进行环境变量的配置。这些都是很容易的操作了。下面说正题。
对于博主遇到的这个网站,它的下一页点击是这个鬼样子的:
这种就很麻烦了,一般好像需要去搞js好像,但是我一直没去弄过 感觉非常的麻烦,那怎么用pyppeteer去处理呢(我感觉自己废话太多 hhhhhhh....)
直接的把代码贴上来,然后一步一步的去解释。
首先前7行都是对包的引用,这里就不做多的解释了。
第十行是对要进行抓取的url进行声明,
第十一行是对pyppeteer的声明,类似seleniume中对浏览器内核的声明,这里有许多的参数,这个想要了解的可以去查看文档哈
这里主要介绍第十三行的page.on()这个方法,page.om类似于对浏览器发送与接收的请求进行拦截,对发送的是request,接收则是response。如果拦截到就会调用自己定义的函数,这里是response_handler,
比如这个函数就可以判断接收的响应内是否存在xhr格式的文件,如果存在就进行下一步的处理,这里涉及到网站进行翻页,可以根据第19行来,page.evaluate()参数就是网页源码的那个js点击下一页的参数。再放到for循环内进行循环,循环多少次就可以点击多少页了,然后我们进行page.content()该参数是打印网页的内容,而不仅仅是源码。然后我们可以通过获得的内容进行数据的抓取,大致就是这样吧,其实说的不详细。
3.结尾
因为现在很多的网站对selenium可以检测出来,所以现在selenium+chrome使用率就非常低了。但是pyppeteer的成功率还是相当高的!