日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python爬虫多线程下载_Python爬虫之多线程下载豆瓣Top250电影图片

發(fā)布時(shí)間:2024/1/1 python 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python爬虫多线程下载_Python爬虫之多线程下载豆瓣Top250电影图片 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

爬蟲項(xiàng)目介紹

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

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

多線程模式:ThreadPoolExecutor,適合 IO密集型任務(wù);

多進(jìn)程模式:ProcessPoolExecutor,適合計(jì)算密集型任務(wù)。

具體的關(guān)于該模塊的介紹可以參考其官方網(wǎng)址:https://docs.python.org/3/lib... 。

本次爬蟲項(xiàng)目將會(huì)用到concurrent.futures模塊中的ThreadPoolExecutor類,多線程豆瓣Top250電影圖片。下面將會(huì)給出本次爬蟲項(xiàng)目分別不使用多線程和使用多線程的對(duì)比,以此來(lái)展示多線程在爬蟲中的巨大優(yōu)勢(shì)。

不使用多線程

首先,我們不使用多線程來(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')

# 獲取電影圖片的名稱和下載地址

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ì)該爬蟲的消耗時(shí)間

t1 = time.time()

print('*' * 50)

for url in start_urls:

download_picture(url)

t2 = time.time()

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

print('*' * 50)

main()

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

**************************************************

不使用多線程,總共耗時(shí):79.93260931968689

**************************************************

去E盤中的douban文件夾查看,如下圖:

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

使用多線程

接下來(lái),我們使用多線程來(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')

# 獲取電影圖片的名稱和下載地址

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ì)該爬蟲的消耗時(shí)間

print('*' * 50)

t3 = time.time()

# 利用并發(fā)下載電影圖片

executor = ThreadPoolExecutor(max_workers=10) # 可以自己調(diào)整max_workers,即線程的個(gè)數(shù)

# submit()的參數(shù): 第一個(gè)為函數(shù), 之后為該函數(shù)的傳入?yún)?shù),允許有多個(gè)

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('使用多線程,總共耗時(shí):%s' % (t4 - t3))

print('*' * 50)

main()

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

**************************************************

使用多線程,總共耗時(shí):9.361606121063232

**************************************************

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

總結(jié)

通過上述兩個(gè)爬蟲程序的對(duì)比,我們不難發(fā)現(xiàn),同樣是下載豆瓣Top250電影,10個(gè)網(wǎng)頁(yè)中的圖片,在沒有使用多線程的情況下,總共耗時(shí)約80s,而在使用多線程(10個(gè)線程)的情況下,總共耗時(shí)約9.5秒,效率整整提高了約8倍。這樣的效率提升在爬蟲中無(wú)疑是令人興奮的。

希望讀者在看了本篇博客后,也能嘗試著在自己的爬蟲中使用多線程,說(shuō)不定會(huì)有意外的驚喜哦~~因?yàn)?#xff0c;大名鼎鼎的Python爬蟲框架Scrapy,也是使用多線程來(lái)提升爬蟲速度的哦!

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

總結(jié)

以上是生活随笔為你收集整理的python爬虫多线程下载_Python爬虫之多线程下载豆瓣Top250电影图片的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。