成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Python爬蟲之使用celery加速爬蟲

baihe / 3409人閱讀

摘要:是一個基于分布式消息傳輸?shù)漠惒饺蝿?wù)隊列,它專注于實時處理,同時也支持任務(wù)調(diào)度。本文將介紹如何使用來加速爬蟲。本文爬蟲的例子來自文章爬蟲的種姿勢。雖然沒有這個爬蟲框架和異步框架來的快,但這也可以作為一種爬蟲的思路。

??celery是一個基于分布式消息傳輸?shù)漠惒饺蝿?wù)隊列,它專注于實時處理,同時也支持任務(wù)調(diào)度。關(guān)于celery的更多介紹及例子,筆者可以參考文章Python之celery的簡介與使用。
??本文將介紹如何使用celery來加速爬蟲。
??本文爬蟲的例子來自文章:Python爬蟲的N種姿勢。這里不再過多介紹,我們的項目結(jié)構(gòu)如下:

其中,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為任務(wù)函數(shù),代碼如下:

import re
import requests
from celery import group
from proj.app_test import app

@app.task(trail=True)
# 并行調(diào)用任務(wù)
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)
# 獲取每個網(wǎng)頁的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" # 把任務(wù)結(jié)果存在了Redis

CELERY_TASK_SERIALIZER = "msgpack" # 任務(wù)序列化和反序列化使用msgpack方案

CELERY_RESULT_SERIALIZER = "json" # 讀取任務(wù)結(jié)果一般性能要求不高,所以使用了可讀性更好的JSON

CELERY_TASK_RESULT_EXPIRES = 60 * 60 * 24 # 任務(wù)過期時間

CELERY_ACCEPT_CONTENT = ["json", "msgpack"] # 指定接受的內(nèi)容類型

最后是我們的爬蟲文件,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"}
# 發(fā)送HTTP請求
req = requests.get(url, headers=headers)
# 解析網(wǎng)頁
soup = BeautifulSoup(req.text, "lxml")
# 找到name和Description所在的記錄
human_list = soup.find(id="mw-whatlinkshere-list")("li")

urls = []
# 獲取網(wǎng)址
for human in human_list:
    url = human.find("a")["href"]
    urls.append("https://www.wikidata.org"+url)

#print(urls)

# 調(diào)用get_content函數(shù),并獲取爬蟲結(jié)果
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() # 結(jié)束時間
print("耗時:%s" % (t2 - t1))

??在后臺啟動redis,并切換至proj項目所在目錄,運行命令:

celery -A proj.app_test worker -l info

輸出結(jié)果如下(只顯示最后幾行的輸出):

......
["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中查看數(shù)據(jù),如下:

??在文章Python爬蟲的N種姿勢中,我們已經(jīng)知道,如果用一般的方法來實現(xiàn)這個爬蟲,耗時大約為725秒,而我們使用celery,一共耗時約80秒,大概相當(dāng)于一般方法的九分之一。雖然沒有scrapy這個爬蟲框架和異步框架aiohttp, asyncio來的快,但這也可以作為一種爬蟲的思路。
??本次分享到此結(jié)束,感謝閱讀~
注意:本人現(xiàn)已開通微信公眾號: Python爬蟲與算法(微信號為:easy_web_scrape), 歡迎大家關(guān)注哦~~

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/43138.html

相關(guān)文章

  • 基于Celery的分布式爬蟲管理平臺: Crawlab

    摘要:基于的爬蟲分布式爬蟲管理平臺,支持多種編程語言以及多種爬蟲框架。后臺程序會自動發(fā)現(xiàn)這些爬蟲項目并儲存到數(shù)據(jù)庫中。每一個節(jié)點需要啟動應(yīng)用來支持爬蟲部署。任務(wù)將以環(huán)境變量的形式存在于爬蟲任務(wù)運行的進程中,并以此來關(guān)聯(lián)抓取數(shù)據(jù)。 Crawlab 基于Celery的爬蟲分布式爬蟲管理平臺,支持多種編程語言以及多種爬蟲框架。 Github: https://github.com/tikazyq/...

    legendaryedu 評論0 收藏0
  • 手把手教你如何用Crawlab構(gòu)建技術(shù)文章聚合平臺(一)

    摘要:本文將介紹如何使用和抓取主流的技術(shù)博客文章,然后用搭建一個小型的技術(shù)文章聚合平臺。是谷歌開源的基于和的自動化測試工具,可以很方便的讓程序模擬用戶的操作,對瀏覽器進行程序化控制。相對于,是新的開源項目,而且是谷歌開發(fā),可以使用很多新的特性。 背景 說到爬蟲,大多數(shù)程序員想到的是scrapy這樣受人歡迎的框架。scrapy的確不錯,而且有很強大的生態(tài)圈,有g(shù)erapy等優(yōu)秀的可視化界面。但...

    LinkedME2016 評論0 收藏0
  • 手把手教你如何用Crawlab構(gòu)建技術(shù)文章聚合平臺(一)

    摘要:本文將介紹如何使用和抓取主流的技術(shù)博客文章,然后用搭建一個小型的技術(shù)文章聚合平臺。是谷歌開源的基于和的自動化測試工具,可以很方便的讓程序模擬用戶的操作,對瀏覽器進行程序化控制。相對于,是新的開源項目,而且是谷歌開發(fā),可以使用很多新的特性。 背景 說到爬蟲,大多數(shù)程序員想到的是scrapy這樣受人歡迎的框架。scrapy的確不錯,而且有很強大的生態(tài)圈,有g(shù)erapy等優(yōu)秀的可視化界面。但...

    Jeffrrey 評論0 收藏0
  • 首次公開,整理12年積累的博客收藏夾,零距離展示《收藏夾吃灰》系列博客

    摘要:時間永遠(yuǎn)都過得那么快,一晃從年注冊,到現(xiàn)在已經(jīng)過去了年那些被我藏在收藏夾吃灰的文章,已經(jīng)太多了,是時候把他們整理一下了。那是因為收藏夾太亂,橡皮擦給設(shè)置私密了,不收拾不好看呀。 ...

    Harriet666 評論0 收藏0
  • 如何構(gòu)建一個分布式爬蟲:基礎(chǔ)篇

    摘要:繼上篇我們談?wù)摿说幕局R后,本篇繼續(xù)講解如何一步步使用構(gòu)建分布式爬蟲。到此,我們就實現(xiàn)了一個很基礎(chǔ)的分布式網(wǎng)絡(luò)爬蟲,但是它還不具有很好的擴展性,而且貌似太簡單了下一篇我將以微博數(shù)據(jù)采集為例來演示如何構(gòu)建一個穩(wěn)健的分布式網(wǎng)絡(luò)爬蟲。 繼上篇我們談?wù)摿薈elery的基本知識后,本篇繼續(xù)講解如何一步步使用Celery構(gòu)建分布式爬蟲。這次我們抓取的對象定為celery官方文檔。 首先,我們新建...

    ssshooter 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<