快就完事了 使用Celery加速你的爬蟲!

2021-09-26 13:04:21 字數 3609 閱讀 5759

一、寫在前面

二、知識補充

1.class celery.group

group這個類表示建立一組要並行執行的任務,不過一組任務是懶惰的,所以你需要執行並對其進行評估。要了解這個類,可以檢視文件,或者在pycharm中直接ctrl+左鍵就能直接檢視原始碼了,如下圖:

python資源共享群:626017123

當然了,直接看原始碼還不夠,最好還是自己動下手。所以先建立乙個test.py,其中**如下:

1 from celery import celery

2 3

5 6

8 def add(x, y):

9 return x + y

10 11

12 if __name__ == '__main__':

然後執行celery伺服器,再在test.py所在目錄下建立乙個test_run.py用於測試,其中**如下:

1 from celery import group

2 from .test import add

3 4

5 lazy_group = group(add.s(2, 2), add.s(4, 4))

6 print(type(lazy_group))

7 result = lazy_group()

8 print(result)

9 print(type(result))

10 print(result.get())

在pycharm中執行test_run.py,得到的結果如下:

fe54f453-eb9c-4b24-87e3-a26fab75967f

[4, 8]

通過檢視原始碼可以知道,是可以往group中傳入乙個由任務組成的可迭代物件的,所以這就進行一下測試,對上面的**進行一點修改:

1 from celery import group

2 from celeryspider.test import add

3 4

5 lazy_group = group(add.s(x, y) for x, y in zip([1, 3, 5, 7, 9], [2, 4, 6, 8, 10]))

6 result = lazy_group()

7 print(result)

8 print(result.get())

執行之後得到了我們想要的結果:

f03387f1-af00-400b-b58a-37901563251d

[3, 7, 11, 15, 19]

2.celer.result.collect()

在celery中有乙個類result,這個類包含了任務執行的結果和狀態等,而在這個類中就有乙個collect()方法,使用該方法能在結果返回時收集結果。和之前一樣的步驟,先看看原始碼:

1 from celery import celery, group, result

2 3

5 6

8 def a(how_many):

9 return group(b.s(i) for i in range(how_many))()

10 11

13 def b(i):

14 return pow2.delay(i)

15 16

18 def pow2(i):

19 return i ** 2

20 21

22 if __name__ == '__main__':

三、具體步驟

1.專案結構

2.主要**

1 from celery import celery

2 3

5 # 匯入配置檔案

7 8

9 if __name__ == '__main__':

下面是tasks.py中的**,其中包含了傳送請求和解析網頁的**:

1 import requests

2 from lxml import etree

3 from celery import group

5 6

7 headers =

12 13

15 def main(urls):

16 # 主函式

17 return group(call.s(url) for url in urls)()

18 19

21 def call(url):

22 # 傳送請求

23 try:

24 res = requests.get(url, headers=headers)

25 parse.delay(res.text)

26 except exception as e:

27 print(e)

28 29

31 def parse(html):

32 # 解析網頁

33 et = etree.html(html)

34 href_list = et.xpath('//*[@id="home"]/div/div[2]/a/@href')

35 result =

36 for href in href_list:

37 href_res = requests.get(href, headers=headers)

38 href_et = etree.html(href_res.text)

39 src_list = href_et.xpath('//*[@class="artile_des"]/table/tbody/tr/td/a/img/@src')

40 result.extend(src_list)

41 return result

最後是crawl.py中的**:

1 import time

2 from celeryspider.tasks import main

3 4

5 start_time = time.time()

6 7

8 url_list = ["".format(i) for i in range(1, 31)]

9 res = main.delay(url_list)

10 all_src =

11 for i in res.collect():

12 if isinstance(i[1], list) and isinstance(i[1][0], str):

13 all_src.extend(i[1])

14 15 print("src count: ", len(all_src))

16 17

18 end_time = time.time()

19 print("cost time: ", end_time - start_time)

四、執行結果

當執行celery服務後,再執行crawl.py檔案,會看到如下資訊列印出來:

這樣求極限 洛就完事了!

再求極限的過程中,有一種很方便的方法叫洛必達法則。可能有的同學高中就接觸過這種方法。但是洛必達法則並不是洛必達發現的,我們先來講講洛必達法則的 1661年洛必達出生於法國的貴族家庭。1704年2月2日卒於巴黎。他曾受襲侯爵銜,並在軍隊中擔任騎兵軍官,後來因為視力不佳而退出軍隊,轉向學術方面加以研究。...

2016就快結束了

粗粗想來記憶竟是如此模糊,猛的一想,又是那麼清晰。而我還是那個我。階段1 北京洛陽兩地跑 1月到五月初 那我開始想到的是元旦,那時應該還在學校準備考試。哈哈,時間過得很快。然後在北京和洛陽兩地來回的跑。還是蠻不錯的經歷。那個後台系統也完成,不過當時還是太過於年少,竟然沒有總結,也導致了後來跳槽找工作...

萬事開頭難,幹就完事兒了

總結今天在學習c語言巨集定義的時候發現了乙個問題。定義是這樣的 define sum a,b a b define sharp a,b a b 我們都知道c c 的巨集定義僅僅是進行字元替換。1.sum a,b 會將代入,然後求和 2.sharp a,b 會將a b組合在一起,成為乙個字串 然後進行...