Level 3:使用 PhantomJS 渲染
优质
小牛编辑
133浏览
2023-12-01
有时网页太复杂,无法找到API请求。现在是时候满足PhantomJS的力量了。
要使用PhantomJS,你应该有PhantomJS 安装。如果你正在使用all模式运行pyspider,那么如果可以在中删除,则启用PhantomJS PATH。
确保phantomjs正在运行
$ pyspider phantomjs
如果输出是,继续本教程的其余部分
Web server running on port 25555
使用PhantomJS
当连接PhantomJS的pyspider时,您可以通过添加参数fetch_type='js'来启用此功能self.crawl。我们使用PhantomJS来抓取http://www.twitch.tv/directory/game/Dota 2的频道列表,该列表 加载了我们在第2级中讨论过的AJAX :
```
class Handler(BaseHandler):
def on_start(self):
self.crawl('http://www.twitch.tv/directory/game/Dota 2',
fetch_type='js', callback=self.index_page)
def index_page(self, response):
return {
"url": response.url,
"channels": [{
"title": x('.title').text(),
"viewers": x('.info').contents()[2],
"name": x('.info a').text(),
} for x in response.doc('.stream.item').items()]
}
```
我使用了一些API来处理流列表。您可以从PyQuery完整API中找到完整的API参考
在页面上运行JavaScript
我们将尝试从本节中的http://www.pinterest.com/categories/popular/中删除图像。开头只显示25张图像,滚动到页面底部时会加载更多图像。
要抓取尽可能多的图像,我们可以使用js_script参数来设置一些函数包装的JavaScript代码来模拟滚动操作:
```
class Handler(BaseHandler):
def on_start(self):
self.crawl('http://www.pinterest.com/categories/popular/',
fetch_type='js', js_script="""
function() {
window.scrollTo(0,document.body.scrollHeight);
}
""", callback=self.index_page)
def index_page(self, response):
return {
"url": response.url,
"images": [{
"title": x('.richPinGridTitle').text(),
"img": x('.pinImg').attr('src'),
"author": x('.creditName').text(),
} for x in response.doc('.item').items() if x('.pinImg')]
}
```
页面加载后可以执行脚本(可以通过js_run_at参数更改) 我们在页面加载后滚动一次,您可以使用滚动多次setTimeout。在超时到达之前,PhantomJS将获取尽可能多的项目。
在线演示:http://demo.pyspider.org/debug/tutorial_pinterest