文档章节

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

sijinge
 sijinge
发布于 2017/09/07 16:15
字数 782
阅读 154
收藏 0

精选30+云产品,助力企业轻松上云!>>>

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
博文 48
码字总数 48130
作品 0
广州
架构师
私信 提问
加载中
请先登录后再评论。
【爬虫】进阶修习系列 · 一

本文会涉及以下内容:【不定时修改中。。。】 1. pyspider的介绍; 2. 爬虫架构的典型设计; 3. 垂直搜索引擎的初探。 PySpider 之前的爬虫策略很简单,用得python2.7:urllib2 + Beautiful...

jxfactor
2015/10/22
0
0
使用pyspider抓取起点中文网小说数据

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

某杰
2017/02/22
0
0
pyspider 爬虫教程整理

pyspider 爬虫教程(一):HTML 和 CSS 选择器 http://segmentfault.com/blog/binux/1190000002477863 pyspider 爬虫教程(二):AJAX 和 HTTP http://segmentfault.com/blog/binux/11900000......

鲜橙加冰
2015/01/12
0
0
python Pyspider 的各种爬坑之路

  我觉得我有必要写一下这篇文章,为了学习pyspider,花了一天的时间才把这个环境搭建成功,网上的各种解决办法都是零零碎碎的,今天我把我掉进的所有坑都和大家分享一下。   前面一直在...

osc_3rgq3dae
2019/08/20
9
0
搭建pyspider爬虫服务

环境准备 首先yum更新 yum update -y   安装开发编译工具 yum install gcc gcc-c++ -y   安装依赖库 yum install python-pip python-devel python-distribute libxml2 libxml2-devel py......

osc_7v8xw84w
2018/03/20
2
0

没有更多内容

加载失败,请刷新页面

加载更多

论文赏析[ACL18]一个句子向量表示究竟可以塞进多少语言性质?

原文链接: 论文赏析[ACL18]一个句子向量表示究竟可以塞进多少语言性质?| 韦阳的博客 godweiyang.com 论文地址: What you can cram into a single $&!#* vector: Probing sentence embeddi...

godweiyang
2019/12/27
8
0
如何做到宽容的收

在《unix编程艺术》提到过,Postel规定过:“宽容的收,谨慎的发”。 当时看到这一段话时,并没有多加思考,以为仅仅是对于网络协议多加检查就好了,并没有深想。 然而经过这两年的实践,我发...

findstr
2017/04/12
7
0
MySQL 数据库和表操作

MySQL服务器中的 【数据库】 以文件夹的形式存放在data目录下,本章讲解如何优雅地使用SQL命令操作数据库和数据表。 一、数据库操作 1.连接MySQL服务器 mysql -uroot -p mysql数据库类型有...

技能锦囊
03/20
0
0
纪客老白【每日答疑】白老师,您好!我在一钳形电流互感器放大电路遇到一些情况。

、白老师,您好!我在一钳形电流互感器放大电路遇到一些情况。 (1)目的:把一导线上50uA,0.5Hz电流,通过钳形互感器感应转换后,经过运放处理得出AD可测的0-2.5V的信号。 钳形互感器:电感...

osc_bodzcw38
11分钟前
14
0
【转载】狂暴战车 直流电机转速闭环,增量式pid调试过程

原文地址:https://club.rt-thread.org/ask/question/12262.html 原文作者:sogw 当我们给小车设定速度时,自然是希望它能够按照预设的速度运行,但因为外界阻力,显然轮子的转速会受到影响,...

osc_dh3qbz0a
12分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部