1. 程式人生 > >Scrapy+Scrapy-redis+Scrapyd+Gerapy 分布式爬蟲框架整合

Scrapy+Scrapy-redis+Scrapyd+Gerapy 分布式爬蟲框架整合

sta 端口 pro ron 配置文件 詳情 pre 流程 .py

簡介:給正在學習的小夥伴們分享一下自己的感悟,如有理解不正確的地方,望指出,感謝~

首先介紹一下這個標題吧~

1. Scrapy:是一個基於Twisted的異步IO框架,有了這個框架,我們就不需要等待當前URL抓取完畢之後在進行下一個URL的抓取,抓取效率可以提高很多。

2. Scrapy-redis:雖然Scrapy框架是異步加多線程的,但是我們只能在一臺主機上運行,爬取效率還是有限的,Scrapy-redis庫為我們提供了Scrapy分布式的隊列,調度器,去重等等功能,有了它,我們就可以將多臺主機組合起來,共同完成一個爬取任務,抓取的效率又提高了。

3. Scrapyd:分布式爬蟲完成之後,接下來就是代碼部署,如果我們有很多主機,那就要逐個登錄服務器進行部署,萬一代碼有所改動..........可以想象,這個過程是多麽繁瑣。Scrapyd是專門用來進行分布式部署的工具,它提供HTTP接口來幫助我們部署,啟動,停止,刪除爬蟲程序,利用它我們可以很方便的完成Scrapy爬蟲項目的部署。

4. Gerapy:是一個基於Scrapyd,Scrapyd API,Django,Vue.js搭建的分布式爬蟲管理框架。簡單點說,就是用上述的Scrapyd工具是在命令行進行操作,而Gerapy將命令行和圖形界面進行了對接,我們只需要點擊按鈕就可完成部署,啟動,停止,刪除的操作。

1. 創建Scrapy項目:(之前的博客有提到過)

項目的結構如下:(這個項目裏包含了多個spider,接下來,就以我圈出來的為例講解)

技術分享圖片

因為我這個需要用到固定的代理,在這個講一下代理如何使用:

代理在middlewares.py這個模塊中的process_request方法中進行配置(如果想知道為什麽在這裏配置,可以去google一下scrapy框架爬蟲的整體結構流程),如下:

技術分享圖片

然後在settings.py中指定具體的代理是什麽:如 PROXY_URL=‘http://10.10.10.10:8080‘

如果要設置動態代理,參考這裏:https://github.com/Damon-zln/ProxyPool

2. Scrapy-redis分布式配置:

1. 首先,確認Scrapy-redis庫已經安裝~

未安裝,可以 pip install scrapy-redis 進行安裝。

2. 搭建Redis服務器,如果未安裝redis數據庫的,請自行google~

Redis安裝完成後,就可以遠程連接了,如果不能,可能是服務器上沒有開放端口(redis默認端口6379)

記錄服務器的IP,端口(默認是6379),密碼為foobared,供後面分布式爬蟲使用。

3. 配置Scrapy-redis(只需要修改settings.py文件即可)

將調度器的類和去重的類替換為Scrapy-redis提供的類,在settings.py中配置如下:

SCHEDULER = ‘scrapy_redis.scheduler.Scheduler‘

DUPEFILTER_CLASS = ‘scrapy_redis.dupefilter.RFPDupeFilter‘

Redis連接配置:

REDIS_URL = ‘redis://[:password]@host:port/db‘

其他的都使用默認配置(如:調度對列,持久化,重爬,管道)

5. 配置存儲目標:

搭建一個MongoDB服務,將多臺主機的數據都存在同一個MongoDB數據庫中

配置如下:

MONGO_URI = ‘host‘

MONGO_DB = ‘webscrape‘

所有配置截圖如下:

技術分享圖片

3. Scrapyd的安裝:

1. 安裝:pip install scrapyd

2. 配置:安裝完畢後,需要新建一個配置文件/etc/scrapyd/scrapyd.conf,scrapyd在運行時會讀取此配置文件。

在Scrapyd1.2版本後,不會自動創建該文件,需要我們自行添加。

首先,執行如下命令新建文件:

sudo mkdir /etc/scrapyd

sudo vi /etc/scrapyd/scrapyd.conf

接著寫入如下內容:

[scrapyd]
eggs_dir    = eggs
logs_dir    = logs
items_dir   =
jobs_to_keep = 5
dbs_dir     = dbs
max_proc    = 0
max_proc_per_cpu = 10
finished_to_keep = 100
poll_interval = 5.0
bind_address = 0.0.0.0
http_port   = 6800
debug       = off
runner      = scrapyd.runner
application = scrapyd.app.application
launcher    = scrapyd.launcher.Launcher
webroot     = scrapyd.website.Root

[services]
schedule.json     = scrapyd.webservice.Schedule
cancel.json       = scrapyd.webservice.Cancel
addversion.json   = scrapyd.webservice.AddVersion
listprojects.json = scrapyd.webservice.ListProjects
listversions.json = scrapyd.webservice.ListVersions
listspiders.json  = scrapyd.webservice.ListSpiders
delproject.json   = scrapyd.webservice.DeleteProject
delversion.json   = scrapyd.webservice.DeleteVersion
listjobs.json     = scrapyd.webservice.ListJobs
daemonstatus.json = scrapyd.webservice.DaemonStatus

配置文件內容參見官方文檔:https://scrapyd.readthedocs.io/en/stable/config.html#example-configuration-file

這裏的配置文件有所修改:max_proc_per_cpu官方默認是4,即一臺主機每個CPU最多運行4個Scrapy任務,在此提高為10,另外,bind_address,默認為本地127.0.0.1,在此修改為0.0.0.0,這樣外網可以訪問。

3. 後臺運行scrapyd:

scrapyd > /dev/null &

運行之後,便可在瀏覽器的6800端口訪問WEB UI了,如下:

技術分享圖片

4. Gerapy分布式管理:

1. 安裝:pip install gerapy

2. 使用說明:

利用gerapy命令創建一個項目:

gerapy init

在當前目錄下生成一個gerapy文件夾,進入gerapy文件夾,會發現一個空的projects文件夾,後面後用到。

初始化:

gerapy migrate

這樣會生成一個SQLite數據庫,用於保存各個主機的配置信息等。

啟動Gerapy服務:

gerapy runserver host:port (默認是端口8000)

這樣,我們就可以通過http://host:8000進入Gerapy管理頁面。

在主機管理中添加scrapyd運行的地址和端口,如下:

技術分享圖片

在projects文件夾中,放入你的Scrapy項目:

技術分享圖片

可以點擊上圖中的編輯,在線編輯項目,如果項目沒有問題,可以點擊部署進行打包和部署,在部署之前要打包項目(打包成一個egg文件),可以部署到多臺主機。

技術分享圖片

部署完畢後,可以回到主機管理頁面進行任務調度。點擊調度即可進入任務管理頁面,可以查看當前主機所有任務的運行狀態:

技術分享圖片

通過點擊運行,停止按鈕來實現任務的啟動和停止,同時可以展開任務條目查看日誌詳情。

下面是抓取的數據存入MongoDB數據庫:

技術分享圖片

至此,分布式爬蟲就完成了,可能說的有點簡略,如有不理解的,自行google~

Scrapy+Scrapy-redis+Scrapyd+Gerapy 分布式爬蟲框架整合