ajax抓取网页内容(self.crawlAPI抓取豆瓣电影HTML代码中的并不相同常见用法)
优采云 发布时间: 2021-11-18 10:08ajax抓取网页内容(self.crawlAPI抓取豆瓣电影HTML代码中的并不相同常见用法)
在上一篇教程中,我们使用 self.crawlAPI 抓取豆瓣电影的 HTML 内容,并使用 CSS 选择器解析一些内容。但是,目前的网站通过使用AJAX等技术,在与服务器交互时不需要重新加载整个页面。但是,这些交互方式让爬行变得有些困难:抓取后你会发现这些网页与浏览器中的网页并不相同。您需要的信息不在返回 HTML 代码中。
在本教程中,我们将讨论这些技术和方法来捕获它们。(英文版:AJAX-and-more-HTTP)
AJAX
AJAX 是 Asynchronous JavaScript and XML(异步 JavaScript 和 XML)的缩写。AJAX使用原有的web标准组件,无需重新加载整个页面即可实现与服务器的数据交互。例如,在新浪微博中,您无需重新加载或打开新页面即可展开微博评论。但是内容一开始不在页面上(所以页面太大了),而是在点击时加载。这导致你在爬取这个页面时,获取不到评论信息(因为你没有“展开”)。
AJAX 的一个常见用法是使用 AJAX 加载 JSON 数据,然后在浏览器端呈现它。如果可以直接抓取 JSON 数据,那会比 HTML 更容易解析。
当 网站 使用 AJAX 时,pyspider 获取的页面与浏览器看到的不同。当您在浏览器中打开此类页面或单击“展开”时,您经常会看到“正在加载”或类似的图标/*敏*感*词*。例如,当您尝试抓取时:
你会发现电影是“加载中...”
找到真正的要求
由于AJAX实际上是通过HTTP传输数据,我们可以通过Chrome开发者工具找到真实请求,直接发起对真实请求的爬取获取数据。
打开一个新窗口并按 Ctrl+Shift+I(在 Mac 上按 Cmd+Opt+I)打开开发者工具。切换到网络(网络面板)在一个窗口中打开
在页面加载过程中,您将在面板中看到所有资源请求。
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 数据,我们编写一个脚本来提取电影名称和评分:
class Handler(BaseHandler):
def on_start(self):
self.crawl(\'http://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0\',
callback=self.json_parser)
def json_parser(self, response):
return [{
"title": x[\'title\'],
"rate": x[\'rate\'],
"url": x[\'url\']
} for x in response.json[\'subjects\']]
您可以获得完整的代码并进行调试。脚本中还有一个使用PhantomJS渲染的解压版,下篇教程会介绍。