js 爬虫抓取网页数据(那些动用浏览器内核(PhantomJS、Selenium等)的方案都太重了)

优采云 发布时间: 2022-01-19 17:11

  js 爬虫抓取网页数据(那些动用浏览器内核(PhantomJS、Selenium等)的方案都太重了)

  那些使用浏览器内核的(PhantomJS、Selenium等)太重了,

  上面链接中的博客通过抓取拉狗网的Ajax请求的数据示例,解释了如何抓取前端渲染的网页,也就是题主所说的“网页的内容是由JavaScript生成的”。摘录如下:

  链接:http://xlzd.me/2015/12/19/python-crawler-04

来源:xlzd 杂谈

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  在爬取网页的时候,有时候我们发现HTML里面没有我们需要的数据,这个时候我们应该怎么办呢?

  

  我们的目的是捕捉拉狗网Python分类下全国目前显示的所有招聘信息。首先,在浏览器中单击它以查看它。如果你足够细心或者网络连接速度很慢,你会发现在点击 Python 类别后跳转到的新页面上,职位发布出现在页面框架之后。至此,我们几乎可以确定招聘信息不在页面的 HTML 源代码中。我们可以通过command+option+u查看网页的源代码(Windows和Linux的快捷键是ctrl+u),在源代码中。页面上显示的招聘信息不会出现。

  至此,我看到的大部分教程都会教用什么库,如何模拟浏览器环境,如何完成网页的渲染,然后拿到里面的信息……永远记住,对于爬虫程序,模拟浏览器往往是最后的手段。只有实在没有办法的时候,才考虑模拟浏览器环境,因为那样的内存开销真的很大,效率很低。

  那么我们该如何处理呢?经验是,这种情况下,大部分浏览器在请求并解析HTML后,会根据js的“指令”再发送一次请求,得到页面显示的内容,然后通过js渲染到界面。好消息是,此类请求的内容往往是 json 格式,因此我们可以省去解析 HTML 的工作,而不是加重爬虫的任务。

  那,继续打开Chrome的开发者工具,当我们点击“下一步”时,浏览器发送如下请求:

  

  注意 positionAjax.json 请求。它的Type是xhr,全称是XMLHttpRequest。XMLHttpRequest 对象可以部分更新网页,而无需将整个页面提交给服务器。好了,既然是最有可能的,那我们就点进去好好看看吧:

  

  点击后,我们在右下角找到了上面的详细信息。几个选项卡的内容表明:

  通过对内容的观察,返回的确实是一个json字符串,内容中收录了这个页面的每一条招聘信息。至少我们这里已经明确了,不用解析html就可以得到hook招募的信息。那么,应该如何模拟请求呢?我们切换到 Headers 列,注意三个地方:

  

  上面的截图显示了这个请求的请求方法、请求地址等信息。

  

  上面的截图显示了这个请求的请求头。一般来说,我们需要注意Cookie/Host/Origin/Referer/User-Agent/X-Requested-With等参数。

  

  上面的截图显示了这个请求的提交数据。根据观察,kd代表我们查询的关键字,pn代表当前页码。

  那么,我们的爬虫需要做的就是根据页码不断的向这个接口发送请求,解析其中的json内容,并存储我们需要的值。这里有两个问题:什么时候结束,如何获取json中有价值的内容。

  让我们返回并重*敏*感*词*返回的 json。格式化后的层次关系如下:

  

  很容易发现,content下的hasNextPage就是是否有下一页,而content下的result是一个列表,每一个都是一个招聘启事。在 Python 中,json 字符串到对象的映射可以通过 json 库来完成:

  import json

json_obj = json.loads("{'key': 'value'}") # 字符串到对象

json_str = json.dumps(json_obj) # 对象到字符串

  json字符串的“[]”映射到Python的类型列表,“{}”映射到Python的dict。至此,分析过程就彻底结束了,可以愉快的写代码了。具体代码这里不给出。我希望你能自己完成。如果您在写作过程中遇到问题,可以联系我寻求帮助。

  概括

  本篇博客介绍一些数据不在HTML源代码中时的爬取方法,适用于某些情况。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线