如何构建一个分布式爬虫:基础篇
繼上篇(如何構建一個分布式爬蟲:理論篇)我們談論了Celery的基本知識后,本篇繼續講解如何一步步使用Celery構建分布式爬蟲。這次我們抓取的對象定為celery官方文檔(Celery - Distributed Task Queue)。
首先,我們新建目錄distributedspider,然后再在其中新建文件workers.py,里面內容如下
from celery import Celery app = Celery('crawl_task', include=['tasks'], broker='redis://223.129.0.190:6379/1', backend='redis://223.129.0.190:6379/2') # 官方推薦使用json作為消息序列化方式 app.conf.update(CELERY_TIMEZONE='Asia/Shanghai',CELERY_ENABLE_UTC=True,CELERY_ACCEPT_CONTENT=['json'],CELERY_TASK_SERIALIZER='json',CELERY_RESULT_SERIALIZER='json', )
上述代碼主要是做Celery實例的初始化工作,`include`是在初始化celery app的時候需要引入的內容,主要就是注冊為網絡調用的函數所在的文件。然后我們再編寫任務函數,新建文件tasks.py,內容如下
import requests from bs4 import BeautifulSoup from workers import app @app.task def crawl(url):print('正在抓取鏈接{}'.format(url))resp_text = requests.get(url).textsoup = BeautifulSoup(resp_text, 'html.parser')return soup.find('h1').text
它的作用很簡單,就是抓取指定的url,并且把標簽為`h1`的元素提取出來
最后,我們新建文件task_dispatcher.py,內容如下
from workers import app url_list = ['Introduction to Celery','Brokers - Celery 4.0.2 documentation','First Steps with Celery','Next Steps - Celery 4.0.2 documentation','Resources - Celery 4.0.2 documentation','Application - Celery 4.0.2 documentation','Tasks - Celery 4.0.2 documentation','Canvas: Designing Work-flows','Workers Guide - Celery 4.0.2 documentation','Daemonization - Celery 4.0.2 documentation','Periodic Tasks - Celery 4.0.2 documentation' ] def manage_crawl_task(urls):for url in urls:app.send_task('tasks.crawl', args=(url,)) if __name__ == '__main__':manage_crawl_task(url_list)
這段代碼的作用主要就是給worker發送任務,任務是`tasks.crawl`,參數是`url`(元祖的形式)
現在,讓我們在節點A(hostname為resolvewang的主機)上啟動worker
celery -A workers worker -c 2 -l info這里 -c指定了線程數為2, -l表示日志等級是info。我們把代碼拷貝到節點B(節點名為wpm的主機),同樣以相同命令啟動worker,便可以看到以下輸出
可以看到左邊節點(A)先是`all alone`,表示只有一個節點;后來再節點B啟動后,它便和B同步了
sync with celery@wpm這個時候,我們運行給這兩個worker節點發送抓取任務
python task_dispatcher.py可以看到如下輸出
可以看到兩個節點都在執行抓取任務,并且它們的任務不會重復。我們再在redis里看看結果
可以看到一共有11條結果,說明 `tasks.crawl`中返回的數據都在db2(backend)中了,并且以json的形式存儲了起來,除了返回的結果,還有執行是否成功等信息。
到此,我們就實現了一個很基礎的分布式網絡爬蟲,但是它還不具有很好的擴展性,而且貌似太簡單了...下一篇我將以微博數據采集為例來演示如何構建一個穩健的分布式網絡爬蟲。
https://zhuanlan.zhihu.com/p/27148037https://zhuanlan.zhihu.com/p/27148037
總結
以上是生活随笔為你收集整理的如何构建一个分布式爬虫:基础篇的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何构建一个分布式爬虫:理论篇
- 下一篇: 如何构建一个分布式爬虫:实战篇