依賴環境:
scrapy >= 1.1
redis >= 2.8
分布式爬蟲:將乙個專案拷貝到多台電腦上,同時爬取資料。
1. 必須保證所有電腦上的**是相同的配置。
2. 在其中一台電腦上啟動redis和mysql的資料庫服務。
3. 同時將所有的爬蟲專案執行起來。
4. 在啟動redis和mysql資料庫的電腦上,向redis中新增起始的url。
q = queue()
url = q.get() # 如果佇列是空的,那麼get()方法會一直阻塞,直到能夠獲取乙個url,才會繼續向下執行。
單機爬蟲:一台電腦執行乙個專案。去重採用了set()和queue(),但是這兩個都是在記憶體中存在的。1>其他電腦是無法獲取另外一台電腦記憶體中的資料的。2>程式終止,記憶體消失。
分布式問題:
1. 多台電腦如何統一的對url進行去重?
2. 多台電腦之間如何共用相同的佇列?多台電腦獲取的request,如何在多台電腦之間進行同步?
3. 多台電腦執行同乙個爬蟲專案,如果有機器爬蟲意外終止,如何保證可以繼續從佇列中獲取新的request,而不是從頭開始爬取?
前兩個問題:可以基於redis實現。相當於將set()和queue()從scrapy框架中抽離出來,將其儲存在乙個公共的平台中(redis)。
第三個問題:scrapy_redis已經實現了,重啟爬蟲不會從頭開始重新爬取,而是會繼續從佇列中獲取request。不用擔心爬蟲意外終止。
多台電腦的爬蟲專案連線同乙個redis資料庫。
scrapy_redis第三方庫實現分布的部署:
分布式爬蟲:只需要在眾多電腦中,選擇其中一台開啟redis服務,目的就是在redis中建立公用的queue和公用的set,然後剩餘電腦只需要連線redis服務即可,剩餘電腦不需要開啟redis-server服務。
1>在虛擬環境中安裝pip install redis
2>去github上搜尋scrapy_redis庫,解壓,儲存到專案根目錄下。根據提供的用例,配置我們的專案,大致三部分:
1.settings.py檔案;
scheduler = "scrapy_redis.scheduler.scheduler"
dupefilter_class = "scrapy_redis.dupefilter.rfpdupefilter"
item_pipelines =
# myroot: 自定義的redis鏈結。ip:開啟redis-server服務的這台電腦的ip
redis_url = 'redis:'
2.jobbole.py檔案;
from scrapy_redis.spiders import redisspiderd
class jobbolespider(redisspider):
name = 'jobbole'
allowed_domains = ['jobbole.com']
# start_urls = ['']
# 新增鍵
redis_key = 'jobbole:start_urls'
3.有關資料庫部分;
安裝mysql的時候,預設生成的使用者root只有本地登入許可權localhost,如果需要遠端連線mysql,需要分配乙個擁有遠端連線許可權的新使用者。
第一步:通過mysql -uroot -p登入mysql服務。
第二步:通過grant all privileges on *.* to 'myroot'@'%' identified by '123456';(注意一定要帶上分號)。
# *.* 表示所有資料庫中的所有表,都能夠被遠端連線
# '%' 表示任意ip都可以進行鏈結
# 'myroot' 具有遠端鏈結許可權的使用者名稱,自定義。之後就使用這個user進行鏈結資料庫
mysql->grant all privileges on *.* to 'myroot'@'%' identified by '123456'; 回車即可。
第三步:再去修改爬蟲專案中有關資料庫的配置。
mysql_host = '192.168.40.217'
mysql_dbname = 'article_db'
mysql_user = 'myroot'
mysql_password = '123456'
mysql_charset = 'utf8'
3>將配置好的專案,拷貝到不同的機器中;
4>選擇其中一台機器,開啟redis-server服務,並修改redis.windows.conf配置檔案:
# 配置遠端ip位址,供其他的電腦進行連線redis
bind: (當前電腦ip) 192.168.40.217
# 關閉redis保護模式
protected-mode: no
5>其中一台電腦啟動redis-server服務
6>讓所有爬蟲專案都執行起來,由於沒有起始的url,所有爬蟲會暫時處於停滯狀態
7>所有爬蟲都啟動之後,部署redis-server服務的電腦,通過命令redis-cli lpush jobbole:start_urls 向redis的queue中新增起始的url
8>所有爬蟲開始執行,爬取資料,同時所有的資料都會儲存到該爬蟲所連線的遠端資料庫以及遠端redis中
redis安裝解除安裝服務:
scrapy,redis分布式爬取貓眼電影!
能夠利用redis快取資料庫的優點去重來避免資料的大面積冗餘 1 首先就是要建立貓眼爬蟲專案 2 進入專案內部建立乙個爬蟲檔案 建立完檔案之後就是要爬取的內容,我這邊以爬取貓眼電影的title和link為例 這個完全看個人你可以先去寫爬蟲,然後再來寫items檔案 3 編寫item檔案 python...
10 給予scrapy redis的分布式爬蟲
pip install scrapy redis scrapy redis提供了兩種爬蟲 from scrapy redis.spiders import redisspider class myspider redisspider spider that reads urls from redis...
scrapy redis分布式爬蟲
話不多說,先上scrapy scrapy流程圖 流程圖所示 當客戶端從伺服器端拿去任務進行資料爬取時,客戶端產生的資料,url 會再次提交給伺服器,進行資料抓取,產生新的response,在爬取的時候,產生的大量資料,可能會導致爬蟲的速度變慢,占用redis大量的儲存空間。scrapy redis常...