pyspider 爬虫教程 (2):AJAX 和 HTTP

优采云 发布时间: 2022-05-07 07:05

  pyspider 爬虫教程 (2):AJAX 和 HTTP

  编译:足兆叉虫,英文:pyspider

  /a/77870

  在上一篇教程《》中,我们使用 self.crawl API 抓取豆瓣电影的 HTML 内容,并使用 CSS 选择器解析了一些内容。不过,现在的网站通过使用 AJAX 等技术,在你与服务器交互的同时,不用重新加载整个页面。但是,这些交互手段,让抓取变得稍微难了一些:你会发现,这些网页在抓回来后,和浏览器中的并不相同。你需要的信息并不在返回 HTML 代码中。

  在这一篇教程中,我们会讨论这些技术 和 抓取他们的方法。

  AJAX

  AJAX 是 Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)的缩写。AJAX 通过使用原有的 web 标准组件,实现了在不重新加载整个页面的情况下,与服务器进行数据交互。例如在新浪微博中,你可以展开一条微博的评论,而不需要重新加载,或者打开一个新的页面。但是这些内容并不是一开始就在页面中的(这样页面就太大了),而是在你点击的时候被加载进来的。这就导致了你抓取这个页面的时候,并不能获得这些评论信息(因为你没有『展开』)。

  AJAX 的一种常见用法是使用 AJAX 加载 JSON 数据,然后在浏览器端渲染。如果能直接抓取到 JSON 数据,会比 HTML 更容易解析。

  当一个网站使用了 AJAX 的时候,除了用 pyspider 抓取到的页面和浏览器看到的不同以外。你在浏览器中打开这样的页面,或者点击『展开』的时候,常常会看到『加载中』或者类似的图标/*敏*感*词*。例如,当你尝试抓取:

  

  你会发现电影是『载入中…』

  找到真实的请求

  由于 AJAX 实际上也是通过 HTTP 传输数据的,所以我们可以通过 Chrome Developer Tools 找到真实的请求,直接发起真实请求的抓取就可以获得数据了。

  打开一个新窗口

  按 Ctrl+Shift+I (在 Mac 上请按 Cmd+Opt+I) 打开开发者工具。

  切换到网络( Netwotk 面板)

  在窗口中打开

  在页面加载的过程中,你会在面板中看到所有的资源请求。

  

  AJAX 一般是通过 XMLHttpRequest 对象接口发送请求的,XMLHttpRequest 一般被缩写为 XHR。点击网络面板上漏斗形的过滤按钮,过滤出 XHR 请求。挨个查看每个请求,通过访问路径和预览,找到包含信息的请求:%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0

  

  在豆瓣这个例子中,XHR 请求并不多,可以挨个查看来确认。但在 XHR 请求较多的时候,可能需要结合触发动作的时间,请求的路径等信息帮助在大量的请求中找到包含信息的关键请求。这需要抓取或者前端的相关经验。所以,有一个我一直在提的观点,学习抓取的最好方法是:学会写网站。

  现在可以在新窗口中打开 %E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0,你会看到包含电影数据的 JSON 原始数据。推荐安装 JSONView(Firfox版)插件,这样可以看到更好看的 JSON 格式,展开折叠列等功能。然后,我们根据 JSON 数据,编写一个提取电影名和评分的脚本:

  classHandler(BaseHandler):

  def on_start(self):

  self.crawl('',

  callback=self.json_parser)

  def json_parser(self,response):

  return[{

  "title":x['title'],

  "rate":x['rate'],

  "url":x['url']

  }forxinresponse.json['subjects']]

  你可以使用 response.json 将结果转为一个 python 的 dict 对象

  你可以在 获得完整的代码,并进行调试。脚本中还有一个使用 PhantomJS 渲染的提取版本,将会在下一篇教程中介绍。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线