文档章节

pyspider爬虫学习-API-self.crawl.md

sijinge
 sijinge
发布于 2017/09/07 22:19
字数 2155
阅读 69
收藏 0
self.crawl
===========

self.crawl(url, **kwargs)
-------------------------
'self.crawl'是告诉pyspider哪些页面需要爬取的主要接口
`self.crawl` is the main interface to tell pyspider which url(s) should be crawled.
#参数
### Parameters:
#url
##### url
the url or url list to be crawled.#这个url或者url列表将被爬取
#回调函数
##### callback
#解析响应的方法 _default: `__call__`
the method to parse the response. _default: `__call__` _

```python
def on_start(self):
    self.crawl('http://scrapy.org/', callback=self.index_page)
```
#以下参数是可选的
the following parameters are optional
#年龄
##### age
#任务的有效期限,在此期间,该页将被视为没有修改。_default:-1(不重新抓取)_
the period of validity of the task. The page would be regarded as not modified during the period. _default: -1(never recrawl)_ 

```python
@config(age=10 * 24 * 60 * 60)
def index_page(self, response):
    ...
```
#回调'index_page'解析的每个页面在10天内都不会改变。如果你在10天内提交任务,那么它将被丢弃。
> Every pages parsed by the callback `index_page` would be regarded not changed within 10 days. If you submit the task within 10 days since last crawled it would be discarded.
#优先级
##### priority
#任务要根据优先级调度,越高越好。 _default:0 _
the priority of task to be scheduled, higher the better. _default: 0_ 

```python
def index_page(self):
    self.crawl('http://www.example.org/page2.html', callback=self.index_page)
    self.crawl('http://www.example.org/233.html', callback=self.detail_page,
               priority=1)
```
  #'233.html'将在'page2.html'之前被爬取,使用此参数可以做(BFS)(http://en.wikipedia.org/wiki/Breadth-first_search)和减少任务队列的数量(可能花费更多内存资源)
> The page `233.html` would be crawled before `page2.html`. Use this parameter can do a [BFS](http://en.wikipedia.org/wiki/Breadth-first_search) and reduce the number of tasks in queue(which may cost more memory resources).
#执行时间
##### exetime
#在unix时间戳中执行任务的时间。_default:0(立即)_
the executed time of task in unix timestamp. _default: 0(immediately)_ 

```python
import time
def on_start(self):
    self.crawl('http://www.example.org/', callback=self.callback,
               exetime=time.time()+30*60)
```
#这个页面将在30分钟后被抓取
> The page would be crawled 30 minutes later.
#重试
##### retries
#失败而重试的次数。 _default: 3_
retry times while failed. _default: 3_ 

#itag
##### itag
#一个来自前端页面的标记,以显示该任务的潜在修改。它将与它的最后一个值进行比较,当它改变时,recrawl。_default:None_
a marker from frontier page to reveal the potential modification of the task. It will be compared to its last value, recrawl when it's changed. _default: None_ 

```python
def index_page(self, response):
    for item in response.doc('.item').items():
        self.crawl(item.find('a').attr.url, callback=self.detail_page,
                   itag=item.find('.update-time').text())
```
  #在示例中,'update-time'被当做itag。如果没有更改,请求将被丢弃。
> In the sample, `.update-time` is used as itag. If it's not changed, the request would be discarded.

或者你可以在'Handler.crawl_config'中指定'itag'脚本版本,如果您想要重新启动所有的任务。
Or you can use `itag` with `Handler.crawl_config` to specify the script version if you want to restart all of the tasks.

```python
class Handler(BaseHandler):
    crawl_config = {
        'itag': 'v223'
    }
```
#修改脚本并再次单击run按钮后,更改itag的值。如果没有设置,就无所谓了
> Change the value of itag after you modified the script and click run button again. It doesn't matter if not set before. 
#动态重新抓取
##### auto_recrawl
#当启用时,任务将在每一个'age'的时间内重新启动。_default:False_
when enabled, task would be recrawled every `age` time. _default: False_ 

```python
def on_start(self):
    self.crawl('http://www.example.org/', callback=self.callback,
               age=5*60*60, auto_recrawl=True)
```
#该页面将在每隔5小时重新启动。
> The page would be restarted every `age` 5 hours.

##### method
#使用HTTP方法。_default:GET_
HTTP method to use. _default: GET_ 

##### params
#URL参数的字典,附加到URL后面
dictionary of URL parameters to append to the URL. 

```python
def on_start(self):
    self.crawl('http://httpbin.org/get', callback=self.callback,
               params={'a': 123, 'b': 'c'})
    self.crawl('http://httpbin.org/get?a=123&b=c', callback=self.callback)
```
> The two requests are the same. #这两种请求方式效果相同

##### data
#附在请求上的主体。如果提供了字典,就会发生表单编码。
the body to attach to the request. If a dictionary is provided, form-encoding will take place. 

```python
def on_start(self):
    self.crawl('http://httpbin.org/post', callback=self.callback,
               method='POST', data={'a': 123, 'b': 'c'})
```

##### files
#字典格式'{字段: {文件名: '内容'}}'多文件上传
dictionary of `{field: {filename: 'content'}}` files to multipart upload.` 

##### user_agent
#请求的用户代理
the User-Agent of the request

##### headers
#要发送的头文件字典。
dictionary of headers to send. 

##### cookies
将cookies字典附在请求上
dictionary of cookies to attach to this request. 

##### connect_timeout
#首次连接超时秒。_default:20_
timeout for initial connection in seconds. _default: 20_

##### timeout
#获取页面的最大时间秒数。_default:120_
maximum time in seconds to fetch the page. _default: 120_ 

##### allow_redirects
#遵循'30x'重定向._default:True_
follow `30x` redirect _default: True_ 

##### validate_cert
#对于HTTPS请求,验证服务器的证书?_default:True_
For HTTPS requests, validate the server’s certificate? _default: True_ 

##### proxy
#使用'用户名:密码@主机名:端口'格式代理服务器,目前只支持http代理。
proxy server of `username:password@hostname:port` to use, only http proxy is supported currently. 

```python
class Handler(BaseHandler):
    crawl_config = {
        'proxy': 'localhost:8080'
    }
```
  #'Handler.crawl_config'可以用'proxy'来为整个项目设置代理
> `Handler.crawl_config` can be used with `proxy` to set a proxy for whole project.

##### etag 
#如果页面的内容没有改变,使用HTTP Etag机制传递进程。_default:True_
use HTTP Etag mechanism to pass the process if the content of the page is not changed. _default: True_ 

###### last_modified
#如果页面的内容没有改变,使用HTTP last-modified头机制传递进程。_default:True_
use HTTP Last-Modified header mechanism to pass the process if the content of the page is not changed. _default: True_ 

##### fetch_type
#设置为'js'以启用JavaScript fetcher。_default:None_
set to `js` to enable JavaScript fetcher. _default: None_ 

##### js_script
#在加载页面之前或之后运行的JavaScript,应该包装成一个函数就像'function() { document.write("binux"); }'
JavaScript run before or after page loaded, should been wrapped by a function like `function() { document.write("binux"); }`. 


```python
def on_start(self):
    self.crawl('http://www.example.org/', callback=self.callback,
               fetch_type='js', js_script='''
               function() {
                   window.scrollTo(0,document.body.scrollHeight);
                   return 123;
               }
               ''')
```
  #脚本会将页面滚动到底部。函数返回的值可以通过'Response.js_script_result'捕获。
> The script would scroll the page to bottom. The value returned in function could be captured via `Response.js_script_result`.

##### js_run_at
#在'document-start'或'document-end'中运行由'js_script'指定的JavaScript。_default:document-end _
run JavaScript specified via `js_script` at `document-start` or `document-end`. _default: `document-end`_ 

##### js_viewport_width/js_viewport_height
#为布局过程的JavaScript fetcher设置viewport的大小。
set the size of the viewport for the JavaScript fetcher of the layout process. 

##### load_images
#当JavaScript fetcher启用时加载图像。_default:False_
load images when JavaScript fetcher enabled. _default: False_ 

##### save
#一个对象传递给回调方法,可以通过“response.save”来访问
a object pass to the callback method, can be visit via `response.save`. 


```python
def on_start(self):
    self.crawl('http://www.example.org/', callback=self.callback,
               save={'a': 123})

def callback(self, response):
    return response.save['a']
```
   'callback'将返回'123'
> `123` would be returned in `callback`

##### taskid
#识别任务的惟一id,默认是URL生成的MD5代码,可以被方法'def get_taskid(self,task)'覆盖
unique id to identify the task, default is the MD5 check code of the URL, can be overridden by method `def get_taskid(self, task)` 

```python
import json
from pyspider.libs.utils import md5string
def get_taskid(self, task):
    return md5string(task['url']+json.dumps(task['fetch'].get('data', '')))
```
  #在默认情况下,只有url是md5 -ed,上面的代码添加了POST请求的'data'作为taskid的一部分。
> Only url is md5 -ed as taskid by default, the code above add `data` of POST request as part of taskid.

##### force_update
#即使任务处于'ACTIVE'状态,也可以强制更新任务。
force update task params even if the task is in `ACTIVE` status. 

##### cancel
#取消任务,应该用'force_update'来取消一个活动任务。要取消'auto_recrawl'任务,您应该设置'auto_recrawl = False'。
cancel a task, should be used with `force_update` to cancel a active task. To cancel an `auto_recrawl` task, you should set `auto_recrawl=False` as well.

cURL command
------------

`self.crawl(curl_command)`
#cURL是一个用于创建HTTP请求的命令行工具。它可以很容易地获得Chrome Devtools 到网络面板,右击请求并“复制为cURL”。
cURL is a command line tool to make a HTTP request. It can easily get form Chrome Devtools > Network panel,  right click the request and "Copy as cURL".
#您可以使用cURL命令作为'self.crawl'的第一个参数。它将解析该命令,并使HTTP请求类似curl。
You can use cURL command as the first argument of `self.crawl`. It will parse the command and make the HTTP request just like curl do.

@config(**kwargs)
-----------------
#'self.crawl'的默认参数,当使用装饰方法作为回调时。例如:
default parameters of `self.crawl` when use the decorated method as callback. For example:

```python
@config(age=15*60)
def index_page(self, response):
    self.crawl('http://www.example.org/list-1.html', callback=self.index_page)
    self.crawl('http://www.example.org/product-233', callback=self.detail_page)
    
@config(age=10*24*60*60)
def detail_page(self, response):
    return {...}
```
#'list1.html'的'age'是15分钟,而'product-233.html'的'age'是10天。因为'product-233.html'的回调是'detail_page',这意味着它是一个'detail_page',所以它共享'detail_page'的配置。
`age` of `list-1.html` is 15min while the `age` of `product-233.html` is 10days. Because the callback of `product-233.html` is `detail_page`, means it's a `detail_page` so it shares the config of `detail_page`.

Handler.crawl_config = {}
-------------------------
#整个项目'self.crawl'的默认参数。调度器的'crawl_config'中的参数(priority, retries, exetime, age, itag, force_update, auto_recrawl, cancel)将在任务创建时加入,fetcher和processor的参数将在执行时加入。您可以使用此机制来更改之后的fetch配置(例如cookie)。
default parameters of `self.crawl` for the whole project. The parameters in `crawl_config` for scheduler (priority, retries, exetime, age, itag, force_update, auto_recrawl, cancel) will be joined when the task created, the parameters for fetcher and processor will be joined when executed. You can use this mechanism to change the fetch config (e.g. cookies) afterwards.

```python
class Handler(BaseHandler):
    crawl_config = {
        'headers': {
            'User-Agent': 'GoogleBot',
        }
    }
    
    ...
```
  #crawl_config设置一个项目级别的用户代理
> crawl_config set a project level user-agent.

© 著作权归作者所有

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

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

某杰
2017/02/22
0
0
手把手教你写网络爬虫(3):开源爬虫框架对比

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

拓海
04/28
0
0
pyspider + RabbitMQ 使用记 - 上

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

xh4n3
2015/08/04
0
0
用PySpider搜集2017年高校招生章程

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

临江仙卜算子
05/15
0
0
网络爬虫08: PySpider爬虫框架

爬虫的基础知识到这里,已经可以暂时告一段落,接下来就是学会使用框架来写爬虫,用框架会使爬虫代码更加简洁。在这之前,我也了解了一下关于Python爬虫都有哪些框架 Python常用爬虫框架 1....

代码打碟手
09/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

JSCH会大量使用服务器内存吗?会

java实现一个需求用到了jsch,发现服务器内存会被占满。 写了个50进程的jsch-sftp测试连接 put一个文件 ExecutorService fixedThreadPool = Executors.newFixedThreadPool(50);for (int j =...

just-coding
3分钟前
0
0
聊聊redis的数据结构的应用

序 本文主要研究一下redis的数据结构的应用 string 最常用的就是incr操作,比如可以用来维护用户在某个抽奖活动的剩余抽奖次数 setnx方法可以用来实现分布式锁 hashmap 可以用来存储session...

go4it
4分钟前
0
0
《将博客搬至CSDN》

搬到csdn

我风依旧
7分钟前
1
0
源码编译安装最新版 Subversion 1.10.x

一、使用包管理器自动安装 官方网站提供了常见 Linux 发行版的安装命令,此处仅以 CentOS、Debian 及 Ubuntu 为例进行说明,其它系统详见官网:https://subversion.apache.org/packages.html...

whoru
10分钟前
0
0
liquibase

今天在看springboot源码时发现一个好东西。 LiquibaseServiceLocatorApplicationListener Liquibase是一个用于跟踪、管理和应用数据库变化的开源的数据库重构工具。它将所有数据库的变化(包...

jack_peng
14分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部