python抓取网页数据((P.S.你也可以在我的博客阅读这篇文章))

优采云 发布时间: 2021-10-09 00:27

  python抓取网页数据((P.S.你也可以在我的博客阅读这篇文章))

  (PS你也可以在我的博客上阅读这个文章)

  嗯,到上一篇博客,我们已经能够成功地从网站中抓取一些简单的数据并将其存储在一个文件中。但是在抓取网页时,有时会发现HTML中没有我们需要的数据。这个时候我们应该怎么做?

  -------------------------------------

  我们的目的是抓取拉勾Python类下目前全国显示的所有招聘信息。首先,在浏览器中点击查看。如果你够细心或者网速比较慢,那么你会发现在点击Python分类后跳转到的新页面上,招聘信息的出现时间晚于页框的出现时间。至此,我们几乎可以确定招聘信息不在页面的 HTML 源代码中。我们可以通过按“command+option+u”(Windows和Linux上的快捷键是“ctrl+u”)来查看网页的源代码。果然,页面显示的招聘信息并没有出现在源代码中。

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

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

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

  

  注意请求“positionAjax.json”。它的类型是“xhr”,它的全名是“XMLHttpRequest”。XMLHttpRequest 对象可以部分更新网页,而无需将整个页面提交给服务器。所以,它现在的可能性最大,我们点击后仔细观察:

  

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

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

  

  上面的截图展示了本次请求的请求方式、请求地址等信息。

  

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

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

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

  让我们重新审视返回的 json。格式化后的层次关系如下:

  

  很容易发现content下的hasNextPage是是否有下一页,content下的结果是一个列表,里面的每一项都是一个招聘信息。在 Python 中,json 字符串到对象的映射可以通过 json 库来完成:

  import json

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

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

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

  概括

  本篇博客介绍了在HTML源码中没有的时候抓取一些数据的方法,适用于一些情况。对于数据的存储,暂时还在使用文件。在下一篇文章中,我们将使用MongoDB来存储数据,因此在此之间,希望您可以先在本机上安装和配置MongoDB。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线