下面是如何在CentOS 7中分布式部署Pyspider的完整攻略,分为以下几个步骤:
第一步:安装基础依赖包和Python环境
在CentOS 7系统中,执行以下命令进行基础依赖包和Python环境的安装:
yum -y install epel-release
yum -y install python-devel python-pip openssl-devel libffi-devel sqlite-devel
pip install --upgrade pip
第二步:安装Pyspider
在安装Pyspider前,我们需要先安装PhantomJS和Libxml2,执行以下命令进行安装:
yum -y install bzip2 fontconfig freetype libfreetype.so.6 libfontconfig.so.1 libstdc++.so.6 libXrender* libXext* libX11* libpng* libjpeg*
curl -O http://cdn.bitbucket.org/ariya/phantomjs/downloads/phantomjs-1.9.8-linux-x86_64.tar.bz2
tar -xvf phantomjs-1.9.8-linux-x86_64.tar.bz2
mv phantomjs-1.9.8-linux-x86_64 /usr/local/share/
ln -sf /usr/local/share/phantomjs-1.9.8-linux-x86_64/bin/phantomjs /usr/local/bin/
yum -y install libxml2-devel libxslt-devel
然后执行以下命令安装Pyspider:
pip install pyspider
第三步:配置Redis
在Pyspider中,需要使用Redis来存储任务队列等数据。使用以下命令安装Redis:
yum install -y redis
systemctl start redis
systemctl enable redis
第四步:配置Pyspider
默认情况下,Pyspider使用的是SQLite数据库,但在分布式部署中,我们需要使用Redis。我们需要编辑Pyspider的配置文件,它的位置在 ~/.config/pyspider/config.json
。将以下代码添加到配置文件中:
{
"scheduler": "pyspider.scheduler.redis_scheduler.RedisScheduler",
"result_queue": "pyspider.result.redis_result.RedisResultWorker",
"task_queue": "pyspider.task.redis_task.RedisTaskQueue",
"projectdb": "pyspider.database.redis.projectdb.RedisProjectDB",
"taskdb": "pyspider.database.redis.taskdb.RedisTaskDB",
"resultdb": "pyspider.database.redis.resultdb.RedisResultDB",
"message_queue": "pyspider.message_queue.redis_queue.RedisQueue"
}
第五步:启动Pyspider
分布式部署需要启动多个Pyspider节点,每个节点都需要运行Pyspider。假设我们需要启动两个节点,执行以下命令:
export PYTHONPATH=$PYTHONPATH:/usr/local/lib/python2.7/site-packages
pyspider --node 9001
export PYTHONPATH=$PYTHONPATH:/usr/local/lib/python2.7/site-packages
pyspider --node 9002
第六步:访问Pyspider的监控页面
在浏览器中输入节点的地址加端口号,例如 http://192.168.1.100:9001
,即可访问Pyspider的监控页面。其中9001指的是第一个节点的端口号,9002指的是第二个节点的端口号。
通过以上步骤,我们就成功地在CentOS 7中分布式部署了Pyspider。接下来,我们举两个具体的示例说明下如何在分布式环境下使用Pyspider:
示例一:爬取豆瓣电影Top250
- 在Pyspider的监控页面中点击“新建项目”,填写项目名称、起始URL和爬虫代码,并点击“创建”。
```
# -- coding: utf-8 --
from pyspider.libs.base_handler import *
class Handler(BaseHandler):
crawl_config = {
'headers': {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'
}
}
@every(minutes=24 * 60)
def on_start(self):
self.crawl('https://movie.douban.com/top250', callback=self.index_page, fetch_type='js')
@config(age=10 * 24 * 60 * 60)
def index_page(self, response):
for each in response.doc('div.info > div.hd > a').items():
self.crawl(each.attr.href, callback=self.detail_page)
if response.doc('#paginator > a.next'):
self.crawl(response.doc('#paginator > a.next').attr.href, callback=self.index_page, fetch_type='js')
@config(priority=2)
def detail_page(self, response):
return {
"title": response.doc('div#content > h1 > span:first-child').text(),
"rating": response.doc('div.rating_self > strong').text(),
"summary": response.doc('div#link-report > span').text(),
}
```
- 点击“运行”,即可开始爬取豆瓣电影Top250。
示例二:使用Pyspider爬取当当网商品信息
- 在Pyspider的监控页面中点击“新建项目”,填写项目名称、起始URL和爬虫代码,并点击“创建”。
```
# -- coding: utf-8 --
from pyspider.libs.base_handler import *
class Handler(BaseHandler):
crawl_config = {
'headers': {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'
}
}
@every(minutes=24 * 60)
def on_start(self):
self.crawl('http://search.dangdang.com/?key=python&act=input', callback=self.index_page)
@config(age=10 * 24 * 60 * 60)
def index_page(self, response):
for each in response.doc('ul.bigimg > li > a').items():
self.crawl(each.attr.href, callback=self.detail_page)
if response.doc('a.next'):
self.crawl(response.doc('a.next').attr.href, callback=self.index_page)
@config(priority=2)
def detail_page(self, response):
return {
"title": response.doc('div.name_info > h1').text(),
"price": response.doc('div.price_s > span.price_n').text(),
"author": response.doc('div.messbox_info > span:last-child > a').text(),
"publisher": response.doc('div.messbox_info > span:nth-last-child(2) > a').text(),
"publish_date": response.doc('div.messbox_info > span:nth-last-child(4)').text(),
"isbn": response.doc('div.messbox_info > span:nth-last-child(3)').text(),
}
```
- 点击“运行”,即可开始爬取当当网上关于Python的商品信息。
希望以上攻略能够对你有所帮助!
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:在centos7中分布式部署pyspider - Python技术站