摘要:本次爬蟲項目將會用到模塊中的類,多線程豆瓣電影圖片??偨Y(jié)通過上述兩個爬蟲程序的對比,我們不難發(fā)現(xiàn),同樣是下載豆瓣電影,個網(wǎng)頁中的圖片,在沒有使用多線程的情況下,總共耗時約,而在使用多線程個線程的情況下,總共耗時約秒,效率整整提高了約倍。
爬蟲項目介紹
??本次爬蟲項目將爬取豆瓣Top250電影的圖片,其網(wǎng)址為:https://movie.douban.com/top250, 具體頁面如下圖所示:
??本次爬蟲項目將分別不使用多線程和使用多線程來完成,通過兩者的對比,顯示出多線程在爬蟲項目中的巨大優(yōu)勢。本文所使用的多線程用到了concurrent.futures模塊,該模塊是Python中最廣為使用的并發(fā)庫,它可以非常方便地將任務(wù)并行化。在concurrent.futures模塊中,共有兩種并發(fā)模塊,分別如下:
多線程模式:ThreadPoolExecutor,適合 IO密集型任務(wù);
多進(jìn)程模式:ProcessPoolExecutor,適合計算密集型任務(wù)。
具體的關(guān)于該模塊的介紹可以參考其官方網(wǎng)址:https://docs.python.org/3/lib... 。
??本次爬蟲項目將會用到concurrent.futures模塊中的ThreadPoolExecutor類,多線程豆瓣Top250電影圖片。下面將會給出本次爬蟲項目分別不使用多線程和使用多線程的對比,以此來展示多線程在爬蟲中的巨大優(yōu)勢。
??首先,我們不使用多線程來下載豆瓣Top250電影圖片,其完整的Python代碼如下:
import time import requests import urllib.request from bs4 import BeautifulSoup # 該函數(shù)用于下載圖片 # 傳入函數(shù): 網(wǎng)頁的網(wǎng)址url def download_picture(url): # 獲取網(wǎng)頁的源代碼 r = requests.get(url) # 利用BeautifulSoup將獲取到的文本解析成HTML soup = BeautifulSoup(r.text, "lxml") # 獲取網(wǎng)頁中的電影圖片 content = soup.find("div", class_="article") images = content.find_all("img") # 獲取電影圖片的名稱和下載地址 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個網(wǎng)頁 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)計該爬蟲的消耗時間 t1 = time.time() print("*" * 50) for url in start_urls: download_picture(url) t2 = time.time() print("不使用多線程,總共耗時:%s"%(t2-t1)) print("*" * 50) main()
其輸出結(jié)果如下:
************************************************** 不使用多線程,總共耗時:79.93260931968689 **************************************************
去E盤中的douban文件夾查看,如下圖:
??我們可以看到,在不使用多線程的情況下,這個爬蟲總共耗時約80s,完成了豆瓣Top250電影圖片的下載。
使用多線程??接下來,我們使用多線程來下載豆瓣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)頁的網(wǎng)址url def download_picture(url): # 獲取網(wǎng)頁的源代碼 r = requests.get(url) # 利用BeautifulSoup將獲取到的文本解析成HTML soup = BeautifulSoup(r.text, "lxml") # 獲取網(wǎng)頁中的電影圖片 content = soup.find("div", class_="article") images = content.find_all("img") # 獲取電影圖片的名稱和下載地址 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個網(wǎng)頁 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)計該爬蟲的消耗時間 print("*" * 50) t3 = time.time() # 利用并發(fā)下載電影圖片 executor = ThreadPoolExecutor(max_workers=10) # 可以自己調(diào)整max_workers,即線程的個數(shù) # submit()的參數(shù): 第一個為函數(shù), 之后為該函數(shù)的傳入?yún)?shù),允許有多個 future_tasks = [executor.submit(download_picture, url) for url in start_urls] # 等待所有的線程完成,才進(jìn)入后續(xù)的執(zhí)行 wait(future_tasks, return_when=ALL_COMPLETED) t4 = time.time() print("使用多線程,總共耗時:%s" % (t4 - t3)) print("*" * 50) main()
其輸出結(jié)果如下:
************************************************** 使用多線程,總共耗時:9.361606121063232 **************************************************
再去E盤中的douban文件夾查看,發(fā)現(xiàn)同樣也下載了250張電影圖片。
總結(jié)??通過上述兩個爬蟲程序的對比,我們不難發(fā)現(xiàn),同樣是下載豆瓣Top250電影,10個網(wǎng)頁中的圖片,在沒有使用多線程的情況下,總共耗時約80s,而在使用多線程(10個線程)的情況下,總共耗時約9.5秒,效率整整提高了約8倍。這樣的效率提升在爬蟲中無疑是令人興奮的。
??希望讀者在看了本篇博客后,也能嘗試著在自己的爬蟲中使用多線程,說不定會有意外的驚喜哦~~因為,大名鼎鼎的Python爬蟲框架Scrapy,也是使用多線程來提升爬蟲速度的哦!
注意:本人現(xiàn)已開通兩個微信公眾號: 因為Python(微信號為:python_math)以及輕松學(xué)會Python爬蟲(微信號為:easy_web_scrape), 歡迎大家關(guān)注哦~~
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/41878.html
摘要:本次分享將在此基礎(chǔ)上,利用多線程,提高程序運行的效率。思路本次分享建立在博客爬蟲之下載中電影的圖片上,總體的爬蟲思路沒有變化,只是在此基礎(chǔ)上引入多線程。 介紹 ??在博客:Java爬蟲之下載IMDB中Top250電影的圖片中我們實現(xiàn)了利用Java爬蟲來下載圖片,但是效率不算太高。本次分享將在此基礎(chǔ)上,利用多線程,提高程序運行的效率。 思路 ??本次分享建立在博客Java爬蟲之下載IMD...
摘要:介紹在博客爬蟲爬取豆瓣電影圖片中我們利用的爬蟲框架,將豆瓣電影圖片下載到自己電腦上。那么,在的爬蟲的也可以下載圖片嗎答案當(dāng)然是肯定的在本次分享中,我們將利用的包和函數(shù)來實現(xiàn)圖片的下載。 介紹 ??在博客:Scrapy爬蟲(4)爬取豆瓣電影Top250圖片中我們利用Python的爬蟲框架Scrapy,將豆瓣電影Top250圖片下載到自己電腦上。那么,在Java的爬蟲的也可以下載圖片嗎?答...
摘要:前言新接觸爬蟲,經(jīng)過一段時間的實踐,寫了幾個簡單爬蟲,爬取豆瓣電影的爬蟲例子網(wǎng)上有很多,但都很簡單,大部分只介紹了請求頁面和解析部分,對于新手而言,我希望能夠有一個比較全面的實例。 0.前言 新接觸爬蟲,經(jīng)過一段時間的實踐,寫了幾個簡單爬蟲,爬取豆瓣電影的爬蟲例子網(wǎng)上有很多,但都很簡單,大部分只介紹了請求頁面和解析部分,對于新手而言,我希望能夠有一個比較全面的實例。所以找了很多實例和文...
摘要:注意爬豆爬一定要加入選項,因為只要解析到網(wǎng)站的有,就會自動進(jìn)行過濾處理,把處理結(jié)果分配到相應(yīng)的類別,但偏偏豆瓣里面的為空不需要分配,所以一定要關(guān)掉這個選項。 本課只針對python3環(huán)境下的Scrapy版本(即scrapy1.3+) 選取什么網(wǎng)站來爬取呢? 對于歪果人,上手練scrapy爬蟲的網(wǎng)站一般是官方練手網(wǎng)站 http://quotes.toscrape.com 我們中國人,當(dāng)然...
閱讀 3157·2023-04-25 18:22
閱讀 2390·2021-11-17 09:33
閱讀 3307·2021-10-11 10:59
閱讀 3237·2021-09-22 15:50
閱讀 2810·2021-09-10 10:50
閱讀 860·2019-08-30 15:53
閱讀 448·2019-08-29 11:21
閱讀 2909·2019-08-26 13:58