1.存储在redis数据库中,每个item都要加一个tableName,这样取出来处理数据时,可以根据tableName进行判断
import redis
import pymongo
import json
def get_data_to_mongodb():
#redis数据库连接
redis_cli = redis.StrictRedis(host='127.0.0.1',port=6379,db=0)#如果是远端的改成远端的地址
#mongodb数据库连接
mongo_cli = pymongo.MongoClient(host='127.0.0.1',port=27017)
#获取要操作的数据库和集合
db = mongo_cli['xcfdb']
col = db['xcfcol']
while True:
# blpop参数:keys:key名, timeout=0设置阻塞时间
source,data = redis_cli.blpop('xcf:items',timeout=3)
#data是bytes类型的数据
print(source,data)
data_str = data.decode('utf-8')#转成字典里面字符串
document = json.loads(data_str)#转换成json数据类型
try:
result = col.insert(document)
print('存储成功',result)
except Exception as err:
print(err)
if __name__ == '__main__':
get_data_to_mongodb()
如果代码报错回调方法错误,打开爬虫文件,需要修改yield,不添加回调函数,直接把需要回调的函数改成parse
def start_requests(self):
"""
重写这个方法的目的可以根据自己的需求发起请求
:return:
"""
for url in self.start_urls:
# yield scrapy.Request(url,callback=self.parse_category,dont_filter=True)
yield scrapy.Request(url,dont_filter=True)
# def parse_category(self,response):
def parse(self, response):
"""
2.将数据导出存入 MySQL 首先启动mysql 创建数据库和表
# -*- coding: utf-8 -*-
import json
import redis
import pymysql
def main():
# 指定redis数据库信息
rediscli = redis.StrictRedis(host='localhost', port = 6379, db = 0)
# 指定mysql数据库
mysqlcli = pymysql.connect(host='localhost', user='用户', passwd='密码', db = '数据库', port=3306, use_unicode=True)
# 使用cursor()方法获取操作游标
cur = mysqlcli.cursor()
while True:
# FIFO模式为 blpop,LIFO模式为 brpop,获取键值
source, data = rediscli.blpop("redis中对应的文件夹:items")
item = json.loads(data.decode('utf-8'))
try:
# 使用execute方法执行SQL INSERT语句
cur.execute(“插入语句",['数据'])
# 提交sql事务
mysqlcli.commit()
print("inserted successed")
except Exception as err:
#插入失败
print("Mysql Error",err)
mysqlcli.rollback()
if __name__ == '__main__':
main()
Scrapy爬虫的部署
本地部署
运行scrapy爬虫的服务程序,支持以http命令方式发布、删除、启动、停止爬虫程序
pip3 install scrapyd()
将代码打包,上传到远程主机上
pip3 install scrapyd-client(打包)
开启scrapyd服务
首先需要修改scrapy.cfg项目配置文件
本地部署url写成如下
[deploy]
url = http://localhost:6800/
project = xiachufang
添加项目
在项目下包含scrapy.cfg的下面运行
scrapyd-deploy -p xiachufang --version 1.0(版本号)
需要安装curl
sudo apt-get install curl
开启redis服务
运行爬虫
curl http://localhost:6800/schedule.json -d project=项目名称 -d spider=爬虫名称关闭爬虫
curl http://localhost:6800/cancel.json -d project=myproject -d job=6487ec79947edab326d6db28a2d86511e8247444获取部署的项目列表
curl http://localhost:6800/listprojects.json获取项目版本信息(列表)
curl http://localhost:6800/listversions.json?project=myproject获取当前项目下有多少个项目文件
curl http://localhost:6800/listspiders.json?project=myproject获取爬虫的运行状态
curl http://localhost:6800/listjobs.json?project=myproject | python -m json.tool根据版本删除项目
curl http://localhost:6800/delversion.json -d project=myproject -d version=r99根据项目删除
curl http://localhost:6800/delproject.json -d project=myproject
远端部署
连接服务器
ssh ubuntu@118.24.255.176
sudo apt-get install python3-pip
pip3 install scrapyd
如果安装失败添加如下依赖,再anzscrapyd:
sudo apt-get install python-dev python-pip libxml2-dev libxslt1-dev zlib1g-dev libffi-dev libssl-dev
pip3 install scrapy
pip3 install scrapy_redis
pip3 install pymysql
pip3 install pymongo
启动服务scrapyd
修改
127.0.0.1:6800只能本地访问,要修改配置文件,允许外网访问
find -name default_scrapyd.conf
会返回一个路径
sudo vim 上面的路径,把bind_address改成0.0.0.0
这时外网还是不能访问
进入腾讯云的安全组->新建->点进去刚建的安全组->添加规则:来源0.0.0.0/0,协议端口TCP:6800完成;->实例->更多->配置安全组->选择刚才新建的安全组(打钩)->确认
现在重新启动服务scrapyd 就可以外网访问了
测试一下,看是否能打开
http://118.24.255.176:6800/
部署代码
打开项目,如果之前有打包过的话,最好删掉之前打包的文件build,project.egg-info,setup文档
setting.py修改指定要存储的redis数据库的主机ip
REDIS_HOST = '118.24.255.176'
scrapy.cfg改url,改成服务器的地址
[deploy]
url = http://118.24.255.176:6800/
project = xiachufang
在scrapy.cfg同级目录下开始部署>scrapy-deploy -p xiachufang
然后在http://118.24.255.176:6800/看看有没有部署上
启动服务scrapyd
添加项目
在项目下包含scrapy.cfg的下面运行
scrapyd-deploy -p xiachufang --version 1.0(版本号)
没有curl需要安装curl
sudo apt-get install curl
开启redis服务
运行爬虫
curl http://localhost:6800/schedule.json -d project=项目名称 -d spider=爬虫名称关闭爬虫
curl http://localhost:6800/cancel.json -d project=myproject -d job=6487ec79947edab326d6db28a2d86511e8247444获取部署的项目列表
curl http://localhost:6800/listprojects.json获取项目版本信息(列表)
curl http://localhost:6800/listversions.json?project=myproject获取当前项目下有多少个项目文件
curl http://localhost:6800/listspiders.json?project=myproject获取爬虫的运行状态
curl http://localhost:6800/listjobs.json?project=myproject | python -m json.tool根据版本删除项目
curl http://localhost:6800/delversion.json -d project=myproject -d version=r99根据项目删除
curl http://localhost:6800/delproject.json -d project=myproject
如果涉及到数据库,则需要在远程服务器中安装mysql
sudo apt-get install mysql-server mysql-client
不要忘记设置mysql密码
修改配置文件允许外网访问
找到mysql配置文件并做如下修改:允许远程连接
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
将
bind-address= 127.0.0.1
注释掉或则修改为
bind-address= 0.0.0.0
让外网可以访问mysql数据库需要修改权限
授权root账户允许远程访问:
grant all privileges on . to root@'%' identified by '1234' with grant option;
刷新权限
flush privileges;
注意:如果还是不能远程访问就重启mysql服务
sudo service mysql stop
sudo service mysql start
在远程服务器中安装mongdb
sudo apt-get install mongodb
启动:
sudo service mongodb start 连接客户端报错参考如下网址: (输入:sudo systemctl enable mongodb) mongo
修改配置文件的路径
sudo vim /etc/mongodb.conf
bind_ip = 0.0.0.0
sudo service mongodb stop
sudo service mongodb start
redis数据库的安装
在远端服务器上安装redis数据库
- step1:
cd ~ (进入指定的目录)
- step2:
下载redis数据库压缩包: wget http://download.redis.io/releases/redis-4.0.10.tar.gz
- step3:
解压下载的文件:
tar -zxvf redis-4.0.10.tar.gz
- step4:
复制,放到/usr/local目录下面( 先创建文件夹/usr/local/redis/ 没有的化先创建redis文件夹)
mv ./redis-4.0.11/* /usr/local/redis/
- step5:进入redis目录
cd /usr/local/redis/redis-4.0.11
- step6:
sudo make
sudo make test
如果有问题 sudo apt install tcl
sudo make install
- step7:
sudo cp /usr/local/redis/redis-4.0.10/
redis.conf /etc/redis/
- step8:
修改配置文件,允许外网访问 sudo vim redis.conf
将配置文件中的bind修改为:
bind=0.0.0.0
protected-mode no
daemonize yes
- step9:
启动redis服务: sudo redis-server redis.cnf
- step10:重新开启一个终端,链接客户端
redis-cli -h ip -p 6379