Python学习----pyspider(linux)(一):https://blog.csdn.net/weixin_40132006/article/details/108636549
命令行
pyspider完整的命令行结构如下:
pyspider [OPTIONS] COMMAND [ARGS]
OPTIONS可选参数
-c可以指定配置文件的名称,下面为一个常用的配置
{
"taskdb": "mysql+taskdb://username:password@host:port/taskdb",
"projectdb": "mysql+projectdb://username:password@host:port/projectdb",
"resultdb": "mysql+resultdb://username:password@host:port/resultdb",
"message_queue": "amqp://username:password@host:port/%2F",
"webui": {
"username": "some_name",
"password": "some_password",
"need-auth": true,
"port": xxxx
}
}
最后保存文件为pyspider.json(名字都可以),运行
pyspider -c pyspider.json all
pyspider也单独运行某一个组件,如下
Scheduler 运行单独组件
pyspider scheduler [OPTIONS]
OPTIONS参数如下:
Fetcher 运行单独组件
pyspider fetcher [OPTIONS]
OPTIONS参数如下:
Processor 运行单独组件
pyspider processor [OPTIONS]
OPTIONS参数如下:
Options:
--processor-cls TEXT Processor使用的类
--help 显示帮助信息
WebUI 运行单独组件
pyspider webui [OPTIONS]
OPTIONS参数如下:
如果想要改变WebUI的端口为5001,单独运行
pyspider webui --port 5001
当然也可以在配置文件中修改(前面提到过),然后运行
pyspider -c pyspider.json webui
crawl()方法
详细介绍一下craw()方法的参数配置:官网:http://docs.pyspider.org/en/latest/apis/self.crawlurl
url | 爬取的URL,可以是字符串也可是URL列表 |
callback | 回调函数,指定解析响应内容的方法 |
age | 任务的有效时间,只有在有效时间内并且只能执行一次 |
priority | 爬取任务的优先级,值越大优先级越高,默认值为0 |
exetime | 设置定时任务 |
retries | 定义重复次数,默认值是3 |
itag | 设置标记,如果标记相同会不执行 |
auto_recrawl | 开启时,爬取任务过期后会重新执行,循环时间即定义的age时间长度 |
method | HTTP请求方式,默认是GET |
params | 定义GET请求参数 param={'a' = 123, 'b' = 'c'} |
data | POST表单数据如:data={'a' = 123, 'b' = 'c'} |
user_agent | 爬取使用的User-Agent |
headers | 爬取使用的Headers |
cookies | 爬取使用的Cookies,为字典格式 |
connect_timeout | 初始化连接时的最长等待时间,默认是20秒 |
timeout | 抓取网页时的最长等待时间,默认是120秒 |
allow_redirects | 是否自动处理重定向,默认是true |
validate_cert | 是否验证证书,此选项对HTTPS请求有效,默认是true |
proxy | 爬取时使用的代理,格式为username:password@hostname:port |
fetch_type | 开启PhantomJS渲染 fetch_type='js' |
js_script | 页面加载完后执行的JavaScript脚本, js_script="' function() { window.scrollTo(0,document.body.scrollHeight); return 123; } '" |
js_run_at | JavaScript脚本运行的位置,是页面节点开头还是结尾,默认是结尾,即document-end |
js_viewport_width js_viewport_heigth | JavaScript渲染页面时的窗口大小 |
load_images | 加载JavaScript页面时确认是否加载图片,它默认是否 |
save | 可以传递参数 crawl方法中 save={'page': 1} 回调函数中 response.save['page'] |
cancel | 取消任务,如果一个任务是ACTIVE状态,需将force_update设置为True |
force_update | 即使任务处于ACTIVE状态,也会强制更新状态 |
任务分区
pyspider判断两个任务是否重复,是对该任务对应的URL的MD5值作为任务的唯一ID,如果ID相同,其中一个就不会爬取。
# 这里重写了get_taskid()方法,利用URL和POST的参数来生成ID。这样同一URL不同POST参数,ID不同会被认为两个不同任务
import json
from pyspider.libs.utils import md5string
def get_taskid(self, task):
return md5string(task['url']+json.dumps(task['fetch'].get('data', '')))
全局配置
可以使用crawl_config来指定全局配置,配置中的参数会和crawl()方法创建任务时的参数合并。
class Handler(BaseHandler):
crawl_config = {
'headers': {
'User-Agent': 'GoogleBot',
}
}
定时爬取
通过every属性来设置爬取的时间间隔
#注意有效时间一定要小于重复时间更短
@every(minutes = 24 * 60)
def on_start(self):
self.crawl('http://www.example.org', callback = self.index_page)