Python爬蟲(chóng)之多線(xiàn)程下載豆瓣Top250電影圖片

爬蟲(chóng)項(xiàng)目介紹

??本次爬蟲(chóng)項(xiàng)目將爬取豆瓣Top250電影的圖片晴弃,其網(wǎng)址為:https://movie.douban.com/top250, 具體頁(yè)面如下圖所示:

豆瓣Top250電影

??本次爬蟲(chóng)項(xiàng)目將分別不使用多線(xiàn)程和使用多線(xiàn)程來(lái)完成,通過(guò)兩者的對(duì)比,顯示出多線(xiàn)程在爬蟲(chóng)項(xiàng)目中的巨大優(yōu)勢(shì)。本文所使用的多線(xiàn)程用到了concurrent.futures模塊科盛,該模塊是Python中最廣為使用的并發(fā)庫(kù),它可以非常方便地將任務(wù)并行化菜皂。在concurrent.futures模塊中土涝,共有兩種并發(fā)模塊,分別如下:

  • 多線(xiàn)程模式:ThreadPoolExecutor幌墓,適合 IO密集型任務(wù)但壮;
  • 多進(jìn)程模式:ProcessPoolExecutor,適合計(jì)算密集型任務(wù)常侣。

具體的關(guān)于該模塊的介紹可以參考其官方網(wǎng)址:https://docs.python.org/3/library/concurrent.futures.html 蜡饵。
??本次爬蟲(chóng)項(xiàng)目將會(huì)用到concurrent.futures模塊中的ThreadPoolExecutor類(lèi),多線(xiàn)程下載豆瓣Top250電影圖片胳施。下面將會(huì)給出本次爬蟲(chóng)項(xiàng)目分別不使用多線(xiàn)程和使用多線(xiàn)程的對(duì)比溯祸,以此來(lái)展示多線(xiàn)程在爬蟲(chóng)中的巨大優(yōu)勢(shì)。

不使用多線(xiàn)程

??首先舞肆,我們不使用多線(xiàn)程來(lái)下載豆瓣Top250電影圖片焦辅,其完整的Python代碼如下:

import time
import requests
import urllib.request
from bs4 import BeautifulSoup

# 該函數(shù)用于下載圖片
# 傳入函數(shù): 網(wǎng)頁(yè)的網(wǎng)址url
def download_picture(url):

    # 獲取網(wǎng)頁(yè)的源代碼
    r = requests.get(url)
    # 利用BeautifulSoup將獲取到的文本解析成HTML
    soup = BeautifulSoup(r.text, "lxml")
    # 獲取網(wǎng)頁(yè)中的電影圖片
    content = soup.find('div', class_='article')
    images = content.find_all('img')
    # 獲取電影圖片的名稱(chēng)和下載地址
    picture_name_list = [image['alt'] for image in images]
    picture_link_list = [image['src'] for image in images]

    # 利用urllib.request..urlretrieve正式下載圖片
    for picture_name, picture_link in zip(picture_name_list, picture_link_list):
        urllib.request.urlretrieve(picture_link, 'E://douban/%s.jpg' % picture_name)


def main():

    # 全部10個(gè)網(wǎng)頁(yè)
    start_urls = ["https://movie.douban.com/top250"]
    for i in range(1, 10):
        start_urls.append("https://movie.douban.com/top250?start=%d&filter=" % (25 * i))

    # 統(tǒng)計(jì)該爬蟲(chóng)的消耗時(shí)間
    t1 = time.time()
    print('*' * 50)

    for url in start_urls:
        download_picture(url)
    t2 = time.time()

    print('不使用多線(xiàn)程,總共耗時(shí):%s'%(t2-t1))
    print('*' * 50)

main()

其輸出結(jié)果如下:

**************************************************
不使用多線(xiàn)程椿胯,總共耗時(shí):79.93260931968689
**************************************************

去E盤(pán)中的douban文件夾查看筷登,如下圖:

下載的電影圖片

??我們可以看到,在不使用多線(xiàn)程的情況下哩盲,這個(gè)爬蟲(chóng)總共耗時(shí)約80s前方,完成了豆瓣Top250電影圖片的下載。

使用多線(xiàn)程

??接下來(lái)廉油,我們使用多線(xiàn)程來(lái)下載豆瓣Top250電影圖片惠险,其完整的Python代碼如下:

import time
import requests
import urllib.request
from bs4 import BeautifulSoup
from concurrent.futures import ThreadPoolExecutor, wait, ALL_COMPLETED

# 該函數(shù)用于下載圖片
# 傳入函數(shù): 網(wǎng)頁(yè)的網(wǎng)址url
def download_picture(url):

    # 獲取網(wǎng)頁(yè)的源代碼
    r = requests.get(url)
    # 利用BeautifulSoup將獲取到的文本解析成HTML
    soup = BeautifulSoup(r.text, "lxml")
    # 獲取網(wǎng)頁(yè)中的電影圖片
    content = soup.find('div', class_='article')
    images = content.find_all('img')
    # 獲取電影圖片的名稱(chēng)和下載地址
    picture_name_list = [image['alt'] for image in images]
    picture_link_list = [image['src'] for image in images]

    # 利用urllib.request..urlretrieve正式下載圖片
    for picture_name, picture_link in zip(picture_name_list, picture_link_list):
        urllib.request.urlretrieve(picture_link, 'E://douban/%s.jpg' % picture_name)


def main():

    # 全部10個(gè)網(wǎng)頁(yè)
    start_urls = ["https://movie.douban.com/top250"]
    for i in range(1, 10):
        start_urls.append("https://movie.douban.com/top250?start=%d&filter=" % (25 * i))

    # 統(tǒng)計(jì)該爬蟲(chóng)的消耗時(shí)間
    print('*' * 50)
    t3 = time.time()

    # 利用并發(fā)下載電影圖片
    executor = ThreadPoolExecutor(max_workers=10)  # 可以自己調(diào)整max_workers,即線(xiàn)程的個(gè)數(shù)
    # submit()的參數(shù): 第一個(gè)為函數(shù), 之后為該函數(shù)的傳入?yún)?shù)抒线,允許有多個(gè)
    future_tasks = [executor.submit(download_picture, url) for url in start_urls]
    # 等待所有的線(xiàn)程完成班巩,才進(jìn)入后續(xù)的執(zhí)行
    wait(future_tasks, return_when=ALL_COMPLETED)

    t4 = time.time()
    print('使用多線(xiàn)程,總共耗時(shí):%s' % (t4 - t3))
    print('*' * 50)

main()

其輸出結(jié)果如下:

**************************************************
使用多線(xiàn)程嘶炭,總共耗時(shí):9.361606121063232
**************************************************

再去E盤(pán)中的douban文件夾查看抱慌,發(fā)現(xiàn)同樣也下載了250張電影圖片。

總結(jié)

??通過(guò)上述兩個(gè)爬蟲(chóng)程序的對(duì)比旱物,我們不難發(fā)現(xiàn)遥缕,同樣是下載豆瓣Top250電影,10個(gè)網(wǎng)頁(yè)中的圖片宵呛,在沒(méi)有使用多線(xiàn)程的情況下单匣,總共耗時(shí)約80s,而在使用多線(xiàn)程(10個(gè)線(xiàn)程)的情況下宝穗,總共耗時(shí)約9.5秒户秤,效率整整提高了約8倍。這樣的效率提升在爬蟲(chóng)中無(wú)疑是令人興奮的逮矛。
??希望讀者在看了本篇博客后鸡号,也能?chē)L試著在自己的爬蟲(chóng)中使用多線(xiàn)程,說(shuō)不定會(huì)有意外的驚喜哦~~因?yàn)樾攵Γ竺ΧΦ腜ython爬蟲(chóng)框架Scrapy鲸伴,也是使用多線(xiàn)程來(lái)提升爬蟲(chóng)速度的哦府蔗!

注意:本人現(xiàn)已開(kāi)通兩個(gè)微信公眾號(hào): 因?yàn)镻ython(微信號(hào)為:python_math)以及輕松學(xué)會(huì)Python爬蟲(chóng)(微信號(hào)為:easy_web_scrape), 歡迎大家關(guān)注哦~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末汞窗,一起剝皮案震驚了整個(gè)濱河市姓赤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌仲吏,老刑警劉巖不铆,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異裹唆,居然都是意外死亡誓斥,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)许帐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)劳坑,“玉大人,你說(shuō)我怎么就攤上這事舞吭∨堇” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵羡鸥,是天一觀的道長(zhǎng)蔑穴。 經(jīng)常有香客問(wèn)我,道長(zhǎng)惧浴,這世上最難降的妖魔是什么存和? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮衷旅,結(jié)果婚禮上捐腿,老公的妹妹穿的比我還像新娘。我一直安慰自己柿顶,他們只是感情好茄袖,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著嘁锯,像睡著了一般宪祥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上家乘,一...
    開(kāi)封第一講書(shū)人閱讀 52,736評(píng)論 1 312
  • 那天蝗羊,我揣著相機(jī)與錄音,去河邊找鬼仁锯。 笑死耀找,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的业崖。 我是一名探鬼主播野芒,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蓄愁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了狞悲?” 一聲冷哼從身側(cè)響起涝登,我...
    開(kāi)封第一講書(shū)人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎效诅,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體趟济,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡乱投,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了顷编。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片戚炫。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖媳纬,靈堂內(nèi)的尸體忽然破棺而出双肤,到底是詐尸還是另有隱情,我是刑警寧澤钮惠,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布茅糜,位于F島的核電站,受9級(jí)特大地震影響素挽,放射性物質(zhì)發(fā)生泄漏蔑赘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一预明、第九天 我趴在偏房一處隱蔽的房頂上張望缩赛。 院中可真熱鬧,春花似錦撰糠、人聲如沸酥馍。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)旨袒。三九已至,卻和暖如春遮斥,著一層夾襖步出監(jiān)牢的瞬間峦失,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工术吗, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留尉辑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓较屿,卻偏偏與公主長(zhǎng)得像隧魄,于是被迫代替她去往敵國(guó)和親卓练。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361