摘要:是一個基于分布式消息傳輸的異步任務隊列,它專注于實時處理,同時也支持任務調度。本文將介紹如何使用來加速爬蟲。本文爬蟲的例子來自文章爬蟲的種姿勢。雖然沒有這個爬蟲框架和異步框架來的快,但這也可以作為一種爬蟲的思路。
??celery是一個基于分布式消息傳輸的異步任務隊列,它專注于實時處理,同時也支持任務調度。關于celery的更多介紹及例子,筆者可以參考文章Python之celery的簡介與使用。
??本文將介紹如何使用celery來加速爬蟲。
??本文爬蟲的例子來自文章:Python爬蟲的N種姿勢。這里不再過多介紹,我們的項目結構如下:
其中,app_test.py為主程序,其代碼如下:
from celery import Celery app = Celery("proj", include=["proj.tasks"]) app.config_from_object("proj.celeryconfig") if __name__ == "__main__": app.start()
tasks.py為任務函數,代碼如下:
import re import requests from celery import group from proj.app_test import app @app.task(trail=True) # 并行調用任務 def get_content(urls): return group(C.s(url) for url in urls)() @app.task(trail=True) def C(url): return parser.delay(url) @app.task(trail=True) # 獲取每個網頁的name和description def parser(url): req = requests.get(url) html = req.text try: name = re.findall(r"(.+?)", html)[0] desc = re.findall(r"(.+?)", html)[0] if name is not None and desc is not None: return name, desc except Exception as err: return "", ""
celeryconfig.py為celery的配置文件,代碼如下:
BROKER_URL = "redis://localhost" # 使用Redis作為消息代理 CELERY_RESULT_BACKEND = "redis://localhost:6379/0" # 把任務結果存在了Redis CELERY_TASK_SERIALIZER = "msgpack" # 任務序列化和反序列化使用msgpack方案 CELERY_RESULT_SERIALIZER = "json" # 讀取任務結果一般性能要求不高,所以使用了可讀性更好的JSON CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 24 # 任務過期時間 CELERY_ACCEPT_CONTENT = ["json", "msgpack"] # 指定接受的內容類型
最后是我們的爬蟲文件,scrapy.py,代碼如下:
import time import requests from bs4 import BeautifulSoup from proj.tasks import get_content t1 = time.time() url = "http://www.wikidata.org/w/index.php?title=Special:WhatLinksHere/Q5&limit=500&from=0" # 請求頭部 headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36"} # 發送HTTP請求 req = requests.get(url, headers=headers) # 解析網頁 soup = BeautifulSoup(req.text, "lxml") # 找到name和Description所在的記錄 human_list = soup.find(id="mw-whatlinkshere-list")("li") urls = [] # 獲取網址 for human in human_list: url = human.find("a")["href"] urls.append("https://www.wikidata.org"+url) #print(urls) # 調用get_content函數,并獲取爬蟲結果 result = get_content.delay(urls) res = [v for v in result.collect()] for r in res: if isinstance(r[1], list) and isinstance(r[1][0], str): print(r[1]) t2 = time.time() # 結束時間 print("耗時:%s" % (t2 - t1))
??在后臺啟動redis,并切換至proj項目所在目錄,運行命令:
celery -A proj.app_test worker -l info
輸出結果如下(只顯示最后幾行的輸出):
...... ["Antoine de Saint-Exupery", "French writer and aviator"] ["", ""] ["Sir John Barrow, 1st Baronet", "English statesman"] ["Amy Johnson", "pioneering English aviator"] ["Mike Oldfield", "English musician, multi-instrumentalist"] ["Willoughby Newton", "politician from Virginia, USA"] ["Mack Wilberg", "American conductor"] 耗時:80.05160284042358
在rdm中查看數據,如下:
??在文章Python爬蟲的N種姿勢中,我們已經知道,如果用一般的方法來實現這個爬蟲,耗時大約為725秒,而我們使用celery,一共耗時約80秒,大概相當于一般方法的九分之一。雖然沒有scrapy這個爬蟲框架和異步框架aiohttp, asyncio來的快,但這也可以作為一種爬蟲的思路。
??本次分享到此結束,感謝閱讀~
注意:本人現已開通微信公眾號: Python爬蟲與算法(微信號為:easy_web_scrape), 歡迎大家關注哦~~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/43138.html
摘要:基于的爬蟲分布式爬蟲管理平臺,支持多種編程語言以及多種爬蟲框架。后臺程序會自動發現這些爬蟲項目并儲存到數據庫中。每一個節點需要啟動應用來支持爬蟲部署。任務將以環境變量的形式存在于爬蟲任務運行的進程中,并以此來關聯抓取數據。 Crawlab 基于Celery的爬蟲分布式爬蟲管理平臺,支持多種編程語言以及多種爬蟲框架。 Github: https://github.com/tikazyq/...
摘要:本文將介紹如何使用和抓取主流的技術博客文章,然后用搭建一個小型的技術文章聚合平臺。是谷歌開源的基于和的自動化測試工具,可以很方便的讓程序模擬用戶的操作,對瀏覽器進行程序化控制。相對于,是新的開源項目,而且是谷歌開發,可以使用很多新的特性。 背景 說到爬蟲,大多數程序員想到的是scrapy這樣受人歡迎的框架。scrapy的確不錯,而且有很強大的生態圈,有gerapy等優秀的可視化界面。但...
摘要:本文將介紹如何使用和抓取主流的技術博客文章,然后用搭建一個小型的技術文章聚合平臺。是谷歌開源的基于和的自動化測試工具,可以很方便的讓程序模擬用戶的操作,對瀏覽器進行程序化控制。相對于,是新的開源項目,而且是谷歌開發,可以使用很多新的特性。 背景 說到爬蟲,大多數程序員想到的是scrapy這樣受人歡迎的框架。scrapy的確不錯,而且有很強大的生態圈,有gerapy等優秀的可視化界面。但...
摘要:時間永遠都過得那么快,一晃從年注冊,到現在已經過去了年那些被我藏在收藏夾吃灰的文章,已經太多了,是時候把他們整理一下了。那是因為收藏夾太亂,橡皮擦給設置私密了,不收拾不好看呀。 ...
摘要:繼上篇我們談論了的基本知識后,本篇繼續講解如何一步步使用構建分布式爬蟲。到此,我們就實現了一個很基礎的分布式網絡爬蟲,但是它還不具有很好的擴展性,而且貌似太簡單了下一篇我將以微博數據采集為例來演示如何構建一個穩健的分布式網絡爬蟲。 繼上篇我們談論了Celery的基本知識后,本篇繼續講解如何一步步使用Celery構建分布式爬蟲。這次我們抓取的對象定為celery官方文檔。 首先,我們新建...
閱讀 787·2019-08-30 15:55
閱讀 1530·2019-08-30 15:52
閱讀 2695·2019-08-30 15:44
閱讀 2105·2019-08-30 11:14
閱讀 2621·2019-08-29 13:59
閱讀 1817·2019-08-29 13:45
閱讀 1012·2019-08-29 13:21
閱讀 3374·2019-08-26 13:31