js 爬虫抓取网页数据(Python和js引擎运行的源代码都是js,几乎没有我想要的)
优采云 发布时间: 2021-09-25 22:00js 爬虫抓取网页数据(Python和js引擎运行的源代码都是js,几乎没有我想要的)
想爬下北京邮报的论坛,但是看到页面的源代码都是js,几乎没有我想要的信息。回复内容:今天偶然发现了PyV8,感觉就是你想要的。
它直接搭建了一个js运行环境,也就是说你可以直接在python中执行页面上的js代码来获取你需要的内容。
参考:
/博客/?p=252
/p/pyv8/ 我直接看js源码,分析了一下,然后爬了。
比如你看页面使用ajax请求JSON文件,我会先爬取那个页面,获取ajax需要的参数,然后直接请求json页面,然后解码,然后处理数据存储它在数据库中。
如果直接运行页面上的所有js(就像浏览器一样),然后得到最终的HTML DOM树,这样的性能很糟糕,不推荐使用这种方式。因为Python和js本身的性能很差,如果这样做的话,会消耗大量的CPU资源,最终只能得到很低的爬取效率。js代码需要js引擎才能运行,Python只能通过HTTP请求获取原创的HTML、CSS、JS代码。
不知道有没有用Python写的JS引擎,估计需求量不大。
我一般使用 PhantomJS 和 CasperJS 等引擎进行浏览器抓取。
直接在其中编写JS代码进行DOM操作和分析,并将结果输出为文件。
让Python调用程序,通过读取文件获取内容。去年,我真的爬过这样的数据,因为我赶时间,而且我的方法更丑陋。
PyQt有专门的库来模拟浏览器的请求和行为(好像是webkit的,算了,查一下,几行代码就够了)。在一个运行的程序中,第一次(只有第一个 次的返回结果)是js运行后的代码。所以我写了一个py脚本来做访问分析,然后写了一个windows脚本,通过传递命令行参数来循环这个py脚本,最后得到数据。
方法有点脏,但是拿到数据还是不错的~对于某个网站,可以看网络请求,找到那些返回实际内容的,有针对性的发送。如果是通用的,则必须使用无头浏览器,例如PhantomJS。另一位爬上北京邮政论坛的人。.
文艺的方法,去浏览器引擎,比如PhantomJS,用它导出html,然后用python解析html。不要直接用PhantomJS解析它,虽然我知道它很容易,为什么?那么它就不叫python爬虫了。因为统一使用python进行解析比较统一,这里我们假设你还在爬非JS页面。
普通方法,分析AJAX请求。即使是JS渲染的,数据还是通过HTTP协议传输的。什么?不能模拟吗?读懂HTTP协议,其实还是有经验的。比如要请求北京邮政论坛的正文
X-Requested-With:XMLHttpRequest
这是一个栗子:
拉勾网职位列表
点击Android后,我们从浏览器上传了几个参数到拉勾服务器
一个是first = true,另一个是kd = android,(关键字),另一个是pn = 1(页码)
所以我们可以模仿这一步构造一个数据包来模拟用户的点击动作。
post_data = {'first':'true','kd':'Android','pn':'1'}
虽然这已经是很久以前的事了,但题目似乎已经解决了这个问题。但是看到很多答案的方法有点太重了,这里提供一个效率更高,消耗资源更少的方法。由于主题没有指定需要什么,这里的示例采用主页上所有帖子的链接和标题。
首先请记住浏览器环境对内存和CPU的消耗非常严重,尽量避免模拟浏览器环境的爬虫代码。请记住,对于一些前端渲染的网页,虽然我们需要的数据在HTML源代码中是看不到的,但更有可能是通过另一个请求(最有可能是JSON格式)得到纯数据。我们不仅不需要模拟浏览器,还可以节省解析HTML的消耗。
然后,我打开北京邮政论坛的首页,发现首页的HTML源代码并没有收录页面显示的文章的内容。那么,很有可能这是通过JS异步加载到页面的。通过浏览器开发工具(OS X下的Chrome浏览器通过command+option+i或Win/Linux下通过F12)分析加载主页时的请求,很容易在下面的截图中找到请求:
截图中选择的请求的响应是首页的文章链接。您可以在预览选项中看到渲染的预览:
至此,我们已经确定这个链接可以拿到首页的文章和链接。
在 headers 选项中,有这个请求的请求头和请求参数。我们可以通过 Python 模拟这个请求,得到同样的响应。配合BeautifulSoup等库解析HTML,就可以得到对应的内容。
关于如何模拟请求以及如何解析HTML,请移步我的专栏。有详细介绍,这里不再赘述。
这样就可以在不模拟浏览器环境的情况下抓取数据,大大提高了内存和CPU的消耗和爬行速度。编写爬虫时请记住,如果没有必要,不要模拟浏览器环境。如果是windows下,可以尝试调用windows系统中的webbrowser控件。另外,ie本身也提供了一个接口。但是这两种方法都要渲染页面,在性能上有些浪费。为了加快速度,可以关闭ie的图片下载显示,然后通过点击等方式模拟真实行为。谷歌幻影JS
免责声明:本文原创发表于php中文网。转载请注明出处。感谢您的尊重!如果您有任何疑问,请与我们联系