pyspider 爬虫教程(三):使用 PhantomJS 渲染带 JS 的页面

在上两篇教程【pyspider 爬虫教程 (1):HTML 和 CSS 选择pyspider 爬虫教程(2):AJAX 和 HTTP】中,我们学习了怎么从 HTML 中提取信息,也学习了怎么处理一些请求复杂的页面。但是有一些页面,它实在太复杂了,无论是分析 API 请求的地址,还是渲染时进行了加密,让直接抓取请求非常麻烦。这时候就是 PhantomJS 大显身手的时候了。

在使用 PhantomJS 之前,你需要安装它(安装文档)。当你安装了之后,在运行 all 模式的 pyspider 时就会自动启用了。当然,你也可以在 demo.pyspider.org 上尝试。

使用 PhantomJS

当 pyspider 连上 PhantomJS 代理后,你就能通过在 self.crawl 中添加 fetch_type='js' 的参数,开启使用 PhantomJS 抓取。例如,在教程二中,我们尝试抓取的 http://movie.douban.com/explore 就可以通过 PhantomJS 直接抓取:

class Handler(BaseHandler):
    def on_start(self):
        self.crawl('http://movie.douban.com/explore',
                   fetch_type='js', callback=self.phantomjs_parser)    def phantomjs_parser(self, response):
        return [{            "title": "".join(
                s for s in x('p').contents() if isinstance(s, basestring)
            ).strip(),            "rate": x('p strong').text(),            "url": x.attr.href,
        } for x in response.doc('a.item').items()]

  • 我在这里使用了一些 PyQuery 的 API,你可以在 PyQuery complete API 获得完整的 API 手册。

在页面上执行自定义脚本

你会发现,在上面我们使用 PhantomJS 抓取的豆瓣热门电影只有 20 条。当你点击『加载更多』时,能获得更多的热门电影。为了获得更多的电影,我们可以使用 self.crawljs_script 参数,在页面上执行一段脚本,点击加载更多:

    def on_start(self):
        self.crawl('http://movie.douban.com/explore#more',
                   fetch_type='js', js_script="""
                   function() {
                     setTimeout("$('.more').click()", 1000);
                   }""", callback=self.phantomjs_parser)

  • 这个脚本默认在页面加载结束后执行,你可以通过 js_run_at 参数 修改这个行为
  • 由于是 AJAX 异步加载的,在页面加载完成时,第一页的电影可能还没有加载完,所以我们用 setTimeout 延迟 1 秒执行。
  • 你可以间隔一定时间,多次点击,这样可以加载更多页。
  • 由于相同 URL (实际是相同 taskid) 的任务会被去重,所以这里为 URL 加了一个 #more

上面两个例子,都可以在 http://demo.pyspider.org/debug/tutorial_douban_explore 中找到。

来源:segmentfault.com/a/1190000002477913

关联推荐 pyspider 爬虫教程 (1):HTML 和 CSS 选择 pyspider 爬虫教程(2):AJAX 和 HTTP

原文发布于微信公众号 - PPV课数据科学社区(ppvke123)

原文发表时间:2017-05-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java成神之路

计算机_01_常用快捷键

         Windows+L   : 锁(look)    屏               

10330
来自专栏陈满iOS

Xcode最新及各历史版本安装方法·官方镜像下载地址

个人看法,从重复利用的角度,不推荐用AppStore安装和更新,推荐直接去官网的历史版本下载资源页面下载,这样下载之后还能有版本备份,等下次再需要的时候还能重复...

4.9K20
来自专栏陈纪庚

css加载会造成阻塞吗?

终于考试完了,今天突然想起来前阵子找实习的时候,今日头条面试官问我,js执行会阻塞DOM树的解析和渲染,那么css加载会阻塞DOM树的解析和渲染吗?所以,接下来...

16410
来自专栏Web 开发

JS常用库解密-FastClick

众所周知,移动端在处理点击事件的时候,会有300毫秒的延迟。恰恰是这300毫秒的延迟,会让人有一种卡顿的体验。

12200
来自专栏微信小程序开发

小程序开发注意点儿,新手入门基础

1、域名配置,不配置无法访问 小程序开发,要调用API,就必须把域名填写在配置里面,这点儿一定要记住,万一服务端突然上线一次,发现线上服务出问题了,很有可能就...

550110
来自专栏前端架构与工程

Node.js建站笔记-使用react和react-router取代Backbone

斟酌之后,决定在《嗨猫》项目中引入react,整体项目偏重spa模式,舍弃部分server端的模板渲染,将一部分渲染工作交给前端react实现。 react拥有...

27190
来自专栏iKcamp

微信小程序教学第二章:小程序中级实战教程之预备篇 - 项目结构设计 |基于最新版1.0开发者工具

第二章:小程序中级实战教程之预备篇    项目结构设计 教学视频地址:https://v.qq.com/x/page/q05544lzelw.html ...

23270
来自专栏思考的代码世界

Python网络数据采集之采集JavaScript|第09天

21850
来自专栏河湾欢儿的专栏

wx 小程序

1.首先我们拿到一个新的框架(我感觉wx小程序和框架差不多),先分析里面的东西 例如这个微信小程序 我们先看下面的四个文件[图片上传失败...(image-...

17730
来自专栏君赏技术博客

怎么让APP`iTunes Connect`名字和在设备上显示的名字是一致的

在iTunes Connect和设备上显示的名字是一致的,因为避免混淆。对于WatchKit的app,对于WatchKit应用程序,这意味着在iTunes Co...

30230

扫码关注云+社区

领取腾讯云代金券