1.存儲在redis數(shù)據(jù)庫中,每個item都要加一個tableName,這樣取出來處理數(shù)據(jù)時(shí),可以根據(jù)tableName進(jìn)行判斷
import redis
import pymongo
import json
def get_data_to_mongodb():
#redis數(shù)據(jù)庫連接
redis_cli = redis.StrictRedis(host='127.0.0.1',port=6379,db=0)#如果是遠(yuǎn)端的改成遠(yuǎn)端的地址
#mongodb數(shù)據(jù)庫連接
mongo_cli = pymongo.MongoClient(host='127.0.0.1',port=27017)
#獲取要操作的數(shù)據(jù)庫和集合
db = mongo_cli['xcfdb']
col = db['xcfcol']
while True:
# blpop參數(shù):keys:key名, timeout=0設(shè)置阻塞時(shí)間
source,data = redis_cli.blpop('xcf:items',timeout=3)
#data是bytes類型的數(shù)據(jù)
print(source,data)
data_str = data.decode('utf-8')#轉(zhuǎn)成字典里面字符串
document = json.loads(data_str)#轉(zhuǎn)換成json數(shù)據(jù)類型
try:
result = col.insert(document)
print('存儲成功',result)
except Exception as err:
print(err)
if __name__ == '__main__':
get_data_to_mongodb()
如果代碼報(bào)錯回調(diào)方法錯誤,打開爬蟲文件,需要修改yield,不添加回調(diào)函數(shù),直接把需要回調(diào)的函數(shù)改成parse
def start_requests(self):
"""
重寫這個方法的目的可以根據(jù)自己的需求發(fā)起請求
: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.將數(shù)據(jù)導(dǎo)出存入 MySQL 首先啟動mysql 創(chuàng)建數(shù)據(jù)庫和表
# -*- coding: utf-8 -*-
import json
import redis
import pymysql
def main():
# 指定redis數(shù)據(jù)庫信息
rediscli = redis.StrictRedis(host='localhost', port = 6379, db = 0)
# 指定mysql數(shù)據(jù)庫
mysqlcli = pymysql.connect(host='localhost', user='用戶', passwd='密碼', db = '數(shù)據(jù)庫', port=3306, use_unicode=True)
# 使用cursor()方法獲取操作游標(biāo)
cur = mysqlcli.cursor()
while True:
# FIFO模式為 blpop,LIFO模式為 brpop,獲取鍵值
source, data = rediscli.blpop("redis中對應(yīng)的文件夾:items")
item = json.loads(data.decode('utf-8'))
try:
# 使用execute方法執(zhí)行SQL INSERT語句
cur.execute(“插入語句",['數(shù)據(jù)'])
# 提交sql事務(wù)
mysqlcli.commit()
print("inserted successed")
except Exception as err:
#插入失敗
print("Mysql Error",err)
mysqlcli.rollback()
if __name__ == '__main__':
main()
Scrapy爬蟲的部署
本地部署
運(yùn)行scrapy爬蟲的服務(wù)程序,支持以http命令方式發(fā)布、刪除、啟動、停止爬蟲程序
pip3 install scrapyd()
將代碼打包,上傳到遠(yuǎn)程主機(jī)上
pip3 install scrapyd-client(打包)
開啟scrapyd服務(wù)
首先需要修改scrapy.cfg項(xiàng)目配置文件
本地部署url寫成如下
[deploy]
url = http://localhost:6800/
project = xiachufang
添加項(xiàng)目
在項(xiàng)目下包含scrapy.cfg的下面運(yùn)行
scrapyd-deploy -p xiachufang --version 1.0(版本號)
需要安裝curl
sudo apt-get install curl
開啟redis服務(wù)
運(yùn)行爬蟲
curl http://localhost:6800/schedule.json -d project=項(xiàng)目名稱 -d spider=爬蟲名稱關(guān)閉爬蟲
curl http://localhost:6800/cancel.json -d project=myproject -d job=6487ec79947edab326d6db28a2d86511e8247444獲取部署的項(xiàng)目列表
curl http://localhost:6800/listprojects.json獲取項(xiàng)目版本信息(列表)
curl http://localhost:6800/listversions.json?project=myproject獲取當(dāng)前項(xiàng)目下有多少個項(xiàng)目文件
curl http://localhost:6800/listspiders.json?project=myproject獲取爬蟲的運(yùn)行狀態(tài)
curl http://localhost:6800/listjobs.json?project=myproject | python -m json.tool根據(jù)版本刪除項(xiàng)目
curl http://localhost:6800/delversion.json -d project=myproject -d version=r99根據(jù)項(xiàng)目刪除
curl http://localhost:6800/delproject.json -d project=myproject
遠(yuǎn)端部署
連接服務(wù)器
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
啟動服務(wù)scrapyd
修改
127.0.0.1:6800只能本地訪問,要修改配置文件,允許外網(wǎng)訪問
find -name default_scrapyd.conf
會返回一個路徑
sudo vim 上面的路徑,把bind_address改成0.0.0.0
這時(shí)外網(wǎng)還是不能訪問
進(jìn)入騰訊云的安全組->新建->點(diǎn)進(jìn)去剛建的安全組->添加規(guī)則:來源0.0.0.0/0,協(xié)議端口TCP:6800完成;->實(shí)例->更多->配置安全組->選擇剛才新建的安全組(打鉤)->確認(rèn)
現(xiàn)在重新啟動服務(wù)scrapyd 就可以外網(wǎng)訪問了
測試一下,看是否能打開
http://118.24.255.176:6800/
部署代碼
打開項(xiàng)目,如果之前有打包過的話,最好刪掉之前打包的文件build,project.egg-info,setup文檔
setting.py修改指定要存儲的redis數(shù)據(jù)庫的主機(jī)ip
REDIS_HOST = '118.24.255.176'
scrapy.cfg改url,改成服務(wù)器的地址
[deploy]
url = http://118.24.255.176:6800/
project = xiachufang
在scrapy.cfg同級目錄下開始部署>scrapy-deploy -p xiachufang
然后在http://118.24.255.176:6800/看看有沒有部署上
啟動服務(wù)scrapyd
添加項(xiàng)目
在項(xiàng)目下包含scrapy.cfg的下面運(yùn)行
scrapyd-deploy -p xiachufang --version 1.0(版本號)
沒有curl需要安裝curl
sudo apt-get install curl
開啟redis服務(wù)
運(yùn)行爬蟲
curl http://localhost:6800/schedule.json -d project=項(xiàng)目名稱 -d spider=爬蟲名稱關(guān)閉爬蟲
curl http://localhost:6800/cancel.json -d project=myproject -d job=6487ec79947edab326d6db28a2d86511e8247444獲取部署的項(xiàng)目列表
curl http://localhost:6800/listprojects.json獲取項(xiàng)目版本信息(列表)
curl http://localhost:6800/listversions.json?project=myproject獲取當(dāng)前項(xiàng)目下有多少個項(xiàng)目文件
curl http://localhost:6800/listspiders.json?project=myproject獲取爬蟲的運(yùn)行狀態(tài)
curl http://localhost:6800/listjobs.json?project=myproject | python -m json.tool根據(jù)版本刪除項(xiàng)目
curl http://localhost:6800/delversion.json -d project=myproject -d version=r99根據(jù)項(xiàng)目刪除
curl http://localhost:6800/delproject.json -d project=myproject
如果涉及到數(shù)據(jù)庫,則需要在遠(yuǎn)程服務(wù)器中安裝mysql
sudo apt-get install mysql-server mysql-client
不要忘記設(shè)置mysql密碼
修改配置文件允許外網(wǎng)訪問
找到mysql配置文件并做如下修改:允許遠(yuǎn)程連接
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
將
bind-address= 127.0.0.1
注釋掉或則修改為
bind-address= 0.0.0.0
讓外網(wǎng)可以訪問mysql數(shù)據(jù)庫需要修改權(quán)限
授權(quán)root賬戶允許遠(yuǎn)程訪問:
grant all privileges on . to root@'%' identified by '1234' with grant option;
刷新權(quán)限
flush privileges;
注意:如果還是不能遠(yuǎn)程訪問就重啟mysql服務(wù)
sudo service mysql stop
sudo service mysql start
在遠(yuǎn)程服務(wù)器中安裝mongdb
sudo apt-get install mongodb
啟動:
sudo service mongodb start 連接客戶端報(bào)錯參考如下網(wǎng)址: (輸入: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數(shù)據(jù)庫的安裝
在遠(yuǎn)端服務(wù)器上安裝redis數(shù)據(jù)庫
- step1:
cd ~?。ㄟM(jìn)入指定的目錄)
- step2:
下載redis數(shù)據(jù)庫壓縮包: wget http://download.redis.io/releases/redis-4.0.10.tar.gz
- step3:
解壓下載的文件:
tar -zxvf redis-4.0.10.tar.gz
- step4:
復(fù)制,放到/usr/local目錄下面( 先創(chuàng)建文件夾/usr/local/redis/ 沒有的化先創(chuàng)建redis文件夾)
mv ./redis-4.0.11/* /usr/local/redis/
- step5:進(jìn)入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:
修改配置文件,允許外網(wǎng)訪問 sudo vim redis.conf
將配置文件中的bind修改為:
bind=0.0.0.0
protected-mode no
daemonize yes
- step9:
啟動redis服務(wù): sudo redis-server redis.cnf
- step10:重新開啟一個終端,鏈接客戶端
redis-cli -h ip -p 6379