Pyspider框架(一)
一、pyspider框架的介绍
1.简介
pyspider官方文档:http://docs.pyspider.org/en/latest/
pyspider 是个强大的爬虫系统框架,并且只用python代码来写的。
- 纯python的爬虫系统框架
- 具有强大的webui界面,并且支持脚本编辑,任务监控,项目管理和结果查看
- 数据后台支持MySQL,MongoDB,Reids,SQLite,Elasticsearch,PostgreSQL和SQLAlchemy数据库
- 消息队列支持RabbitMQ,Beanstalk,Redis以及Kombu
- 支持任务优先级,定时,失败重试等调度方案
- 支持分布式架构,抓取js页面
- 支持Python2和3版本
2.安装
(1)在ubuntu下安装
如果使用ubuntu
,首先要安装一些依赖库,请先运行sudo apt update
再运行sudo apt upgrade
更新,再执行下面的命令。
apt-get install python python-dev python-distribute python-pip \
libcurl4-openssl-dev libxml2-dev libxslt1-dev python-lxml \libssl-dev zlib1g-dev
(上面的操作直接在ubuntu上操作,不需要进入虚拟环境下进行)然后在相应的虚拟环境下进行·pip install pyspider
命令进行安装;最后删除wsgidav
然后重新安装2.4.1
版本,运行pyspider。
(2)在windows下安装
首先去https://www.lfd.uci.edu/~gohlke/pythonlibs/下载依赖包。
下载pycurl
进行安装(pip insatll 下载文件的路径
即可进行安装)。
windows 下安装成功(
pip insatll pyspider
),运行报如下错误:
Deprecated option 'domaincontroller': use
'http_authenticator.domain_controller' instead
解决方案:
删除wsgidav
然后重新安装2.4.1
版本。(在自己创建的虚拟环境下进行操作)
二、pyspider框架入门
1.启动pyspider
安装好pyspider
后,创建一个项目文件夹用来存放相关文件,进入文件夹后运行pyspider
命令(这个时候就会在这个文件夹下面创建一个data文件夹
),默认情况下会运行一个web服务端监听5000端口,通过http://localhost:5000
即可访问pyspider的web管理界面,它看起来是这样的:
注意:用ctrl+c来停止运行
2.创建一个项目
点击右边的Create
按钮,在弹出框里,填写项目名称,和起始url
。
注意:要进行运行的时候,先设置
status
为DEBUG
状态,然后才进行运行脚本。
3.第一个脚本
from pyspider.libs.base_handler import *
class Handler(BaseHandler):
crawl_config = {
}
@every(minutes=24 * 60)
def on_start(self):#脚本的入口,当我们开始点击run进行运行的时候,就会执行此函数(或者说是这个函数被调用)。
self.crawl('http://scrapy.org/', callback=self.index_page)#和Scrapy.Request是一样的作用,它的作用是添加一个带爬取的任务(参数含有任务地址和回调函数),
@config(age=10 * 24 * 60 * 60)#代表10天重复爬取(调用此函数)-----即对于相同的页面10天就会重新爬取一次。
def index_page(self, response):#接受上一个函数带来的响应,并且对响应做相应的操作。
for each in response.doc('a[href^="http"]').items():
self.crawl(each.attr.href, callback=self.detail_page)
@config(priority=2)
def detail_page(self, response):
return {
"url": response.url,
"title": response.doc('title').text(),
}
-
def on_start(selef)
是脚本的入口。当你点击run
按钮时,它会被调用。 -
self.crawl(url, callback=self.index_page)
是最重要的接口。它会添加一个新的待爬取任务。大部分的设置可以通过self.crawl
的参数去指定。 -
def index_page(self, response)
接收一个response对象。response.doc
是一个pyquery
对象,它有一个类似jQuery
选择器(解析库)一样的接口,去解析页面元素。 -
def detail_page(self, response)
返回一个字典结果。这个结果默认会被写入resultdb
(结果数据库)。你可以通过复写on_result(self, result)
方法来按照你自己的需求处理结果。 -
@every(minutes=24 * 60)
这个装饰器会告诉调度器,on_start
方法将会每天被调用一次(每天自动启动一次)。 -
@config(age=10 * 24 * 60 * 60)
指定当self.crawl
爬取的页面类型为index_page
(当callback=self.index_page
)时age参数的默认值。参数age
可以通过self.crawl(url, age=10*24*60*60)
和crawl_config
来指定,直接在方法参数中指定具有最高的优先级。 -
age=10*24*60*60
告诉调度器抛弃10天内爬取过的请求。默认情况下,相同URL不会被爬取两次,甚至你修改了代码。对于初学者来说,第一次运行项目然后修改它,在第二次运行项目的情况非常常见,但是它不会再次爬行(阅读itag
了解解决方案) -
@config(priority=2)
标志着,detail page
将会被优先爬取(index_page
优先级低于detail page
)。
你可以通过点击绿色的run
按钮,一步一步的调试你的脚本。切换到follows
面板,点击play
按钮前进。(以下链接相当于就是一个任务)
注意:如果遇到数字证书错误的话记得在self.crawl()里加入参数validate_cert=False即可忽略
4.运行项目
- 保存脚本
- 返回后台首页,找到你的项目
- 改变
status
为DEBUG
或RUNNING
- 点击按钮
run