在上两篇教程【pyspider 爬虫教程 (1):HTML 和 CSS 选择、pyspider 爬虫教程(2):AJAX 和 HTTP】中,我们学习了怎么从 HTML 中提取信息,也学习了怎么处理一些请求复杂的页面。但是有一些页面,它实在太复杂了,无论是分析 API 请求的地址,还是渲染时进行了加密,让直接抓取请求非常麻烦。这时候就是 PhantomJS 大显身手的时候了。
在使用 PhantomJS 之前,你需要安装它(安装文档)。当你安装了之后,在运行 all
模式的 pyspider 时就会自动启用了。当然,你也可以在 demo.pyspider.org 上尝试。
当 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()]
你会发现,在上面我们使用 PhantomJS 抓取的豆瓣热门电影只有 20 条。当你点击『加载更多』时,能获得更多的热门电影。为了获得更多的电影,我们可以使用 self.crawl
的 js_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
参数 修改这个行为setTimeout
延迟 1 秒执行。#more
上面两个例子,都可以在 http://demo.pyspider.org/debug/tutorial_douban_explore 中找到。
来源:segmentfault.com/a/1190000002477913
关联推荐 pyspider 爬虫教程 (1):HTML 和 CSS 选择 pyspider 爬虫教程(2):AJAX 和 HTTP