簡介:給正在學習的小伙伴們分享一下自己的感悟,如有理解不正確的地方,望指出,感謝~
首先介紹一下這個標題吧~
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~