亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Python爬蟲之使用celery加速爬蟲

baihe / 3448人閱讀

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

??celery是一個(gè)基于分布式消息傳輸?shù)漠惒饺蝿?wù)隊(duì)列,它專注于實(shí)時(shí)處理,同時(shí)也支持任務(wù)調(diào)度。關(guān)于celery的更多介紹及例子,筆者可以參考文章Python之celery的簡(jiǎn)介與使用。
??本文將介紹如何使用celery來(lái)加速爬蟲。
??本文爬蟲的例子來(lái)自文章:Python爬蟲的N種姿勢(shì)。這里不再過(guò)多介紹,我們的項(xiàng)目結(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)
# 獲取每個(gè)網(wǎng)頁(yè)的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ù)過(guò)期時(shí)間

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"
# 請(qǐng)求頭部
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請(qǐng)求
req = requests.get(url, headers=headers)
# 解析網(wǎng)頁(yè)
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é)束時(shí)間
print("耗時(shí):%s" % (t2 - t1))

??在后臺(tái)啟動(dòng)redis,并切換至proj項(xiàng)目所在目錄,運(yùn)行命令:

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"]
耗時(shí):80.05160284042358

在rdm中查看數(shù)據(jù),如下:

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/43138.html

相關(guān)文章

  • 基于Celery的分布式爬蟲管理平臺(tái): Crawlab

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

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

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

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

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

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

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

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

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

    ssshooter 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<