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


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

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

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~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM