文档章节

pyspider爬虫学习-教程3-Render-with-PhantomJS.md

sijinge
 sijinge
发布于 2017/09/07 16:15
字数 782
阅读 47
收藏 0
Level 3: Render with PhantomJS
==============================
#有时web页面太复杂,无法找到API请求。现在是时候迎接[PhantomJS]的力量了
Sometimes web page is too complex to find out the API request. It's time to meet the power of [PhantomJS].
#使用PhantomJS,你应该已经安装PhantomJS(http://phantomjs.org/download.html)。如果你运行的是'all'模式的pyspider,如果在“路径”中有excutable,则会启用PhantomJS。
To use PhantomJS, you should have PhantomJS [installed](http://phantomjs.org/download.html). If you are running pyspider with `all` mode, PhantomJS is enabled if excutable in the `PATH`.
#确保phantomjs正在运行
Make sure phantomjs is working by running
```
$ pyspider phantomjs
```
如果输出是Web服务器运行在25555端口上,则继续教程的其余部分
Continue with the rest of the tutorial if the output is
```
Web server running on port 25555
```
#使用PhantomJS
Use PhantomJS
-------------
#
#当pyspider与PhantomJS连接在一起时,您可以通过向'self.crawl'添加一个参数“fetch_type='js'”来启用这个特性。我们使用PhantomJS获取频道列表[http://www.twitch.tv/directory/game/Dota%202](http://www.twitch.tv/directory/game/Dota%202)中使用AJAX加载我们讨论[Level 2](tutorial/AJAX-and-more-HTTP#ajax):
When pyspider with PhantomJS connected, you can enable this feature by adding a parameter `fetch_type='js'` to `self.crawl`. We use PhantomJS to scrape channel list of  [http://www.twitch.tv/directory/game/Dota%202](http://www.twitch.tv/directory/game/Dota%202) which is loaded with AJAX we discussed in [Level 2](tutorial/AJAX-and-more-HTTP#ajax):

```
class Handler(BaseHandler):
    def on_start(self):
        self.crawl('http://www.twitch.tv/directory/game/Dota%202',
                   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来处理流列表。你可以找到完整的API参考[PyQuery完整的API](https://pythonhosted.org/pyquery/api.html)
> I used some API to handle the list of streams. You can find complete API reference from [PyQuery complete API](https://pythonhosted.org/pyquery/api.html)

#在页面运行JavaScript脚本
Running JavaScript on Page
--------------------------
#在这一部分中我们将尝试截取图像[http://www.pinterest.com/categories/popular/](http://www.pinterest.com/categories/popular/)。在开始时,只有25个图像显示,当你滚动到页面底部时,会加载更多的图片。
We will try to scrape images from [http://www.pinterest.com/categories/popular/](http://www.pinterest.com/categories/popular/) in this section. Only 25 images is shown at the beginning, more images would be loaded when you scroll to the bottom of the page.
#我们可以使用[`js_script` parameter](/apis/self.crawl/#enable-javascript-fetcher-need-support-by-fetcher)来对图像进行尽可能多的抓取,设置一些JavaScript代码包装的函数来模拟滚动操作
To scrape images as many as posible we can use a [`js_script` parameter](/apis/self.crawl/#enable-javascript-fetcher-need-support-by-fetcher) to set some function wrapped JavaScript codes to simulate the scroll action: 

```
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` parameter](/apis/self.crawl/#enable-javascript-fetcher-need-support-by-fetcher)进行更改)。
> * Script would been executed after page loaded(can been changed via [`js_run_at` parameter](/apis/self.crawl/#enable-javascript-fetcher-need-support-by-fetcher))
#我们滚动页面加载后,你可以滚动多次在[`setTimeout`]时间内(https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers.setTimeout)。PhantomJS将在超时之前获取尽可能多的项目。
> * We scroll once after page loaded, you can scroll multiple times using [`setTimeout`](https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers.setTimeout). PhantomJS will fetch as many items as possible before timeout arrived.
#在线实例
Online demo: [http://demo.pyspider.org/debug/tutorial_pinterest](http://demo.pyspider.org/debug/tutorial_pinterest)

[PhantomJS]:           http://phantomjs.org/

© 著作权归作者所有

共有 人打赏支持
sijinge
粉丝 0
博文 41
码字总数 37230
作品 0
广州
架构师
使用pyspider抓取起点中文网小说数据

简介 pyspider是国人开发的相当好用的爬虫框架。虽然网上教程不是很多,但是文档详细,操作简单,非常适合用来做爬虫练习或者实现一些抓取数据的需求。 本文就以抓取起点中文小说网的小说作品...

某杰
2017/02/22
0
0
pyspider + RabbitMQ 使用记 - 上

接到一个爬虫任务,项目比较巨大,原来想用 Requests 配合正则做爬虫。后来得知了 pyspider 这个神器,才知道之前的想法 low 爆了。pyspider GitHub 按照 GitHub 上的安装教程安装好以后,我...

xh4n3
2015/08/04
0
0
手把手教你写网络爬虫(3):开源爬虫框架对比

原文出处:拓海 介绍 大家好!我们从今天开始学习开源爬虫框架Scrapy,如果你看过《手把手》系列的前两篇,那么今天的内容就非常容易理解了。细心的读者也许会有疑问,为什么不学出身名门的A...

拓海
04/28
0
0
用PySpider搜集2017年高校招生章程

个人认为PySpider是一个十分容易上手而且功能强大的Python爬虫框架。支持多线程爬取、JS动态解析、出错重试、定时爬取等等的功能。最重要的是,它通过web提供了可操作界面,使用非常人性化。...

临江仙卜算子
05/15
0
0
Centos7-Pyspider单机版安装

安装的centos版本:CentOS-7-x86_64-DVD-1804.iso 安装的python版本:Python3.6.2 系统为最干净的系统,只安装了一个界面,界面不安装也可以 centos7自带版本为: [root@localhost ~]# pyth...

dong66
07/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Confluence 6 使用 Fail2Ban 来限制登录尝试

什么是 Fail2Ban? 我们需要在我们网站中防止密码的暴利破解。Fail2Ban 是一个 Python 的应用来查看日志文件,使用的是正则表达式,同时还可以与Shorewall (或者 iptables)直接工作来来启用...

honeymose
7分钟前
0
0
日期和时间API - 读《Java 8实战》

日期与时间 LocalDate 创建一个LocalDate对象并读取其值 // 根据年月日创建日期LocalDate date1 = LocalDate.of(2014, 3, 18);// 读取System.out.println(date1.getYear()); // 2014Sys...

yysue
7分钟前
0
0
8月15日任务

8月15日任务 Memcached命令行 • telnet 127.0.0.1 11211 • set key2 0 30 2 ab STORED get key2 VALUE key2 0 2 ab END 实例: [root@localhost 02]# telnet 127.0.0.1 11211-bash: te......

寰宇01
20分钟前
0
0
LNMP架构(Nginx访问日志、Nginx日志切割、静态文件不记录日志和过期时间)

Nginx访问日志 1.打开配置文件,搜索log_format vim /usr/local/nginx/conf/nginx.conf 2.访问日志常用变量含义 $remote_addr : 客户端IP(公网IP) $http_x_forwarded_for : 代理服务器的IP ...

蛋黄_Yolks
20分钟前
0
0
lombok 不用再写pojo的getset

java实体类不写get/set方法 1、下载地址https://projectlombok.org/download Myeclipse、eclipse安装lombok Lombok是一种Java实用工具,可以帮助开发人员消除Java的冗长,具体看lombok的官网...

木之下
27分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部