js抓取网页内容( 如何模拟请求和如何解析HTML的链接和标题?(一))
优采云 发布时间: 2021-10-08 20:12js抓取网页内容(
如何模拟请求和如何解析HTML的链接和标题?(一))
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