js提取指定网站内容(用Python编写的JS引擎运行js代码获取你需要的内容)
优采云 发布时间: 2022-01-17 03:31js提取指定网站内容(用Python编写的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。又一个爬北幽门论坛的人。.
文字来源为 gao([emailprotected]@#code(NetArt的方法,使用浏览器引擎,比如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