pyspider爬虫

来源:互联网 发布:考研数据结构 知乎 编辑:程序博客网 时间:2024/05/14 02:59
### pyspider
## 架构
scheduler(调度器)-->fetcher(抓取器)-->processor(脚本执行)-->output  
各个组件间使用消息队列连接,除了scheduler是单点的,fetcher 和 processor 都是可以多实例分布式部署的。 scheduler 负责整体的调度控制。

任务由 scheduler 发起调度,fetcher 抓取网页内容, processor 执行预先编写的python脚本,输出结果或产生新的提链任务(发往 scheduler),形成闭环。  

每个脚本可以灵活使用各种python库对页面进行解析,使用框架API控制下一步抓取动作,通过设置回调控制解析动作。
## 准备
1、由于python已经默认安装所以直接安装pip工具
下载安装包:
wget https://bootstrap.pypa.io/get-pip.py  --no-check-certificate  
执行安装文件:  
sudo python get-pip.py  

2、ubuntu安装scrapy,pyspider基于scrapy所以要先安装scrapy  
使用pip安装scrapy:  
sudo pip install scrapy

问题:  
error: command 'x86_64-linux-gnu-gcc' failed with exit status 1  
解决:  
安装以下依赖:(大部分python的错误都是由于依赖没有安装全)
sudo apt-get install libxml2-dev libxslt1-dev python-dev  
sudo apt-get install zlib1g-dev  
sudo apt-get install libevent-dev  
sudo apt-get install python-pip python-dev libffi-dev libssl-dev libxml2-dev libxslt1-dev libjpeg8-dev zlib1g-dev  
安装pip组件:
sudo pip install lxml  

安装以上依赖包,然后重新安装scrapy   



大家看的好就顶一下,我写这个文章就是在技术学习的时候遇到许多坑,我想让大家绕过这些坑(百度排行不知道怎么排的,前面的都是些没用的,标题看着挺像,进去一看什么玩意)


3、安装pyspider  
首先安装依赖包:  
sudo apt-get install python python-dev python-distribute python-pip libcurl4-openssl-dev libxml2-dev libxslt1-dev python-lxml  
使用pip安装pyspider:
sudo pip install pyspider     
ps:另外也可以使用git下载项目,使用python安装,后来发现pip默认安装的是比较旧的版本,所以最好使用这种安装方法。

4、安装mysql  
sudo apt-get install mysql-server mysql-client    
配置mysql  
(1)使用root进入数据库
mysql -uroot -p  
(2)新建数据库  
在mysql在执行
create database taskdb;
create database projectdb;  
create database resultdb;  
(3)新建用户pyspider  
CREATE USER 'pyspider'@'%';  
(4)改用户授权  

GRANT SELECT, INSERT, UPDATE, REFERENCES, DELETE, CREATE, DROP, ALTER, INDEX, TRIGGER, CREATE VIEW, SHOW VIEW, EXECUTE, ALTER ROUTINE, CREATE ROUTINE, CREATE TEMPORARY TABLES, LOCK TABLES, EVENT ON `taskdb`.* TO 'pyspider'@'%';    

GRANT SELECT, INSERT, UPDATE, REFERENCES, DELETE, CREATE, DROP, ALTER, INDEX, TRIGGER, CREATE VIEW, SHOW VIEW, EXECUTE, ALTER ROUTINE, CREATE ROUTINE, CREATE TEMPORARY TABLES, LOCK TABLES, EVENT ON `projectdb`.* TO 'pyspider'@'%';    

GRANT SELECT, INSERT, UPDATE, REFERENCES, DELETE, CREATE, DROP, ALTER, INDEX, TRIGGER, CREATE VIEW, SHOW VIEW, EXECUTE, ALTER ROUTINE, CREATE ROUTINE, CREATE TEMPORARY TABLES, LOCK TABLES, EVENT ON `resultdb`.* TO 'pyspider'@'%';   
(5)修改mysql配置文件  
sudo vi /etc/mysql/my.cnf  
把bind 改为0.0.0.0  
(6)重启数据库
sudo service mysql restart    
(7)安装mysql-python  
apt-get install python-mysqldb  

5、安装redis  
sudo apt-get install redis-server  
(1)修改bind配置
sudo vi /etc/redis/redis.conf    
测试redis  
执行命令:
redis-cli
进入ip+端口> 就是安装成功了。

把bind 改为0.0.0.0  
(2)重启redis
service redis-server restart
## 安装 PhantomJS
下载
wget -O phantomjs_1.9.6-0wheezy_amd64.deb https://github.com/suan/phantomjs-debian/blob/master/phantomjs_1.9.6-0wheezy_amd64.deb?raw=true   
安装
dpkg -i phantomjs_1.9.6-0wheezy_amd64.deb 问题:dpkg: 处理软件包 phantomjs (--install)时出错,有未满足的依赖
解决:  
sudo apt-get -f install

## 单机  
1、启动  
本地需要自己写一个配置文件
sudo vi /pyspider/config.json
内容如下:
{
  "taskdb": "mysql+taskdb://用户:密码@127.0.0.1:3306/taskdb",
  "projectdb": "mysql+projectdb://用户:密码@127.0.0.1:3306/projectdb",
  "resultdb": "mysql+resultdb://用户:密码@127.0.0.1:3306/resultdb",
  "message_queue": "redis://127.0.0.1:6379/db",
  "phantomjs-proxy": "127.0.0.1:25555",
  "scheduler" : {
    "xmlrpc-host": "0.0.0.0",
    "delete-time": 3600
  },
  "webui": {
    "port": 5555,
    "username": "UI登录用户账号",
    "password": "UI登录用户密码",
    "need-auth": true
  }
}

启动命令:  
pyspider -c /pyspider/config.json

安装 python-mysql、python-redis  
sudo apt-get install python-mysqldb  
sudo apt-get install python-redis  

问题:    
ImportError: No module named mysql.connector  
解决:  
sudo pip install mysql-connector    

问题:  
XXX read timeout  
解决:  
sudo pip --default-timeout=100 install XXX  
pip install mysql-connector-python-rf==2.1.3  

问题:  
ImportError: No module named redis  
解决:
sudo pip install redis

打开pyspider进行验证:
访问ip:5555

## 分布式
使用mastor-slave模式:主从模式  
mastor参照以上的配置执行好后,
分布式搭建需要重复以上的  
slave配置:  
安装pip  
安装scrapy  
安装pyspider  
安装 PhantomJS

配置config.json
{
  "taskdb": "mysql+taskdb://用户:密码@mastor的ip:3306/taskdb",
  "projectdb": "mysql+projectdb://用户:密码@mastor的ip:3306/projectdb",
  "resultdb": "mysql+resultdb://用户:密码@mastor的ip:3306/resultdb",
  "message_queue": "redis://mastor的ip:6379/db",
  "phantomjs-proxy": "127.0.0.1:25555",
  "fetcher": {
    "xmlrpc-host": "mastor的ip"
  }
}

启动:
slave机器只启动:
phantomjs、processor、fetcher
命令如下:
# 启动"唯一"的调度器实例
pyspider -c config.json scheduler
# 启动phantomjs
pyspider -c config.json phantomjs
# 启动 fetcher / processor / result_worker 实例,并根据需要可添加启动多个或在多台主机上启动形成分布式
pyspider -c config.json --phantomjs-proxy="localhost:25555" fetcher
pyspider -c config.json processor
pyspider -c config.json result_worker  
# 启动webui, 如果webui和scheduler没在同一台主机上,需要添加参数 `--scheduler-rpc`来指定scheduler
pyspider -c config.json webui
1 0
原创粉丝点击