溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

使用python怎么自動下載圖片

發(fā)布時間:2021-05-07 15:10:41 來源:億速云 閱讀:206 作者:Leah 欄目:開發(fā)技術(shù)

這篇文章給大家介紹使用python怎么自動下載圖片,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

python的數(shù)據(jù)類型有哪些?

python的數(shù)據(jù)類型:1. 數(shù)字類型,包括int(整型)、long(長整型)和float(浮點型)。2.字符串,分別是str類型和unicode類型。3.布爾型,Python布爾類型也是用于邏輯運算,有兩個值:True(真)和False(假)。4.列表,列表是Python中使用最頻繁的數(shù)據(jù)類型,集合中可以放任何數(shù)據(jù)類型。5. 元組,元組用”()”標識,內(nèi)部元素用逗號隔開。6. 字典,字典是一種鍵值對的集合。7. 集合,集合是一個無序的、不重復(fù)的數(shù)據(jù)組合。

#抓取愛小姐姐網(wǎng)圖片保存到本地
import requests
from lxml import etree as et
import os

#請求頭
headers = {
  #用戶代理 
  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}

#待抓取網(wǎng)頁基地址
base_url = ''
#保存圖片基本路徑
base_dir = 'D:/python/code/aixjj/'
#保存圖片
def savePic(pic_url):
  #如果目錄不存在,則新建
  if not os.path.exists(base_dir):
    os.makedirs(base_dir)
  
  arr = pic_url.split('/')
  file_name = base_dir+arr[-2]+arr[-1]
  print(file_name)
  #獲取圖片內(nèi)容
  response = requests.get(pic_url, headers = headers)
  #寫入圖片
  with open(file_name,'wb') as fp:
    for data in response.iter_content(128):
      fp.write(data)

#觀察此網(wǎng)站總共只有62頁,所以循環(huán)62次
for k in range(1,63):
  #請求頁面地址
  url = base_url+str(k)
  response = requests.get(url = url, headers = headers)
  #請求狀態(tài)碼
  code = response.status_code
  if code == 200:
    html = et.HTML(response.text)
    #獲取頁面所有圖片地址
    r = html.xpath('//li/a/img/@src')
    #獲取下一頁url
    #t = html.xpath('//div[@class="page"]/a[@class="ch"]/@href')[-1]
    for pic_url in r:
      a = 'http:'+pic_url
      savePic(a)
  print('第%d頁圖片下載完成' % (k))

print('The End!')

嘗試運行爬蟲,嘿,沒想到行了:

使用python怎么自動下載圖片

使用python怎么自動下載圖片

過了一會兒,旁邊的哥們兒又來:‘嘿 bro 你這個可以是可以,就是速度太慢了啊,我的靈感會被長時間的等待磨滅,你給改進改進?'

使用python怎么自動下載圖片

怎么提升爬蟲的效率呢?略一思索,公司的電腦可是偉大的四核CPU啊,要不擼個多進程版本試試。然后就產(chǎn)生了下面這個多進程版本

#多進程版——抓取愛小姐姐網(wǎng)圖片保存到本地

import requests
from lxml import etree as et
import os
import time
from multiprocessing import Pool

#請求頭
headers = {
  #用戶代理 
  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}

#待抓取網(wǎng)頁基地址
base_url = ''
#保存圖片基本路徑
base_dir = 'D:/python/code/aixjj1/'

#保存圖片
def savePic(pic_url):
  #如果目錄不存在,則新建
  if not os.path.exists(base_dir):
    os.makedirs(base_dir)
  
  arr = pic_url.split('/')
  file_name = base_dir+arr[-2]+arr[-1]
  print(file_name)
  #獲取圖片內(nèi)容
  response = requests.get(pic_url, headers = headers)
  #寫入圖片
  with open(file_name,'wb') as fp:
    for data in response.iter_content(128):
      fp.write(data)

def geturl(url):
  #請求頁面地址
  #url = base_url+str(k)
  response = requests.get(url = url, headers = headers)
  #請求狀態(tài)碼
  code = response.status_code
  if code == 200:
    html = et.HTML(response.text)
    #獲取頁面所有圖片地址
    r = html.xpath('//li/a/img/@src')
    #獲取下一頁url
    #t = html.xpath('//div[@class="page"]/a[@class="ch"]/@href')[-1]
    for pic_url in r:
      a = 'http:'+pic_url
      savePic(a)

if __name__ == '__main__':
  #獲取要爬取的鏈接列表
  url_list = [base_url+format(i) for i in range(1,100)]
  a1 = time.time()
  #利用進程池方式創(chuàng)建進程,默認創(chuàng)建進程數(shù)量=電腦核數(shù)
  #自己定義進程數(shù)量方式 pool = Pool(4)
  pool = Pool()
  pool.map(geturl,url_list)
  pool.close()
  pool.join()
  b1 = time.time()
  print('運行時間:',b1-a1)

抱著試一試的心態(tài),運行了多進程版本爬蟲,嘿沒想到又行了,在朕偉大的四核CPU的加持下,爬蟲速度提升了3~4倍。
又過了一會兒,那哥們兒又偏過頭來:‘你這個快是快了不少,但是還不是最理想的狀態(tài),能不能一眨眼就能爬取百八十個圖片,畢竟我的靈感來的快去的也快'

我:‘…'
悄悄打開Google,搜索如何提升爬蟲效率,給出結(jié)論:

多進程:密集CPU任務(wù),需要充分使用多核CPU資源(服務(wù)器,大量的并行計算)的時候,用多進程。
多線程:密集I/O任務(wù)(網(wǎng)絡(luò)I/O,磁盤I/O,數(shù)據(jù)庫I/O)使用多線程合適。

呵,我這可不就是I/O密集任務(wù)嗎,趕緊寫一個多線程版爬蟲先。于是,又誕生了第三款:

import threading # 導入threading模塊
from queue import Queue #導入queue模塊
import time #導入time模塊
import requests
import os
from lxml import etree as et

#請求頭
headers = {
  #用戶代理 
  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
}
#待抓取網(wǎng)頁基地址
base_url = ''
#保存圖片基本路徑
base_dir = 'D:/python/code/aixjj/'

#保存圖片
def savePic(pic_url):
  #如果目錄不存在,則新建
  if not os.path.exists(base_dir):
    os.makedirs(base_dir)
  
  arr = pic_url.split('/')
  file_name = base_dir+arr[-2]+arr[-1]
  print(file_name)
  #獲取圖片內(nèi)容
  response = requests.get(pic_url, headers = headers)
  #寫入圖片
  with open(file_name,'wb') as fp:
    for data in response.iter_content(128):
      fp.write(data)

# 爬取文章詳情頁
def get_detail_html(detail_url_list, id):
  while True:
    url = detail_url_list.get() #Queue隊列的get方法用于從隊列中提取元素
    response = requests.get(url = url, headers = headers)
    #請求狀態(tài)碼
    code = response.status_code
    if code == 200:
      html = et.HTML(response.text)
      #獲取頁面所有圖片地址
      r = html.xpath('//li/a/img/@src')
      #獲取下一頁url
      #t = html.xpath('//div[@class="page"]/a[@class="ch"]/@href')[-1]
      for pic_url in r:
        a = 'http:'+pic_url
        savePic(a)

# 爬取文章列表頁
def get_detail_url(queue):
  for i in range(1,100):
    #time.sleep(1) # 延時1s,模擬比爬取文章詳情要快
    #Queue隊列的put方法用于向Queue隊列中放置元素,由于Queue是先進先出隊列,所以先被Put的URL也就會被先get出來。
    page_url = base_url+format(i)
    queue.put(page_url)
    print("put page url {id} end".format(id = page_url))#打印出得到了哪些文章的url

#主函數(shù)
if __name__ == "__main__":
  detail_url_queue = Queue(maxsize=1000) #用Queue構(gòu)造一個大小為1000的線程安全的先進先出隊列
  #A線程負責抓取列表url
  thread = threading.Thread(target=get_detail_url, args=(detail_url_queue,)) 
  html_thread= []
  #另外創(chuàng)建三個線程負責抓取圖片
  for i in range(20):
    thread2 = threading.Thread(target=get_detail_html, args=(detail_url_queue,i))
    html_thread.append(thread2)#B C D 線程抓取文章詳情
  start_time = time.time()
  # 啟動四個線程
  thread.start()
  for i in range(20):
    html_thread[i].start()
  # 等待所有線程結(jié)束,thread.join()函數(shù)代表子線程完成之前,其父進程一直處于阻塞狀態(tài)。
  thread.join()
  for i in range(20):
    html_thread[i].join()
  print("last time: {} s".format(time.time()-start_time))#等ABCD四個線程都結(jié)束后,在主進程中計算總爬取時間。

關(guān)于使用python怎么自動下載圖片就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI