溫馨提示×

溫馨提示×

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

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

Python下載網(wǎng)絡(luò)圖片的方法有哪些

發(fā)布時間:2020-06-26 12:43:43 來源:億速云 閱讀:160 作者:Leah 欄目:開發(fā)技術(shù)

本篇文章為大家展示了Python下載網(wǎng)絡(luò)圖片的方法,代碼簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

通過pic_url單個/批量下載

已知圖片url,例如http://xyz.com/series-*(1,2..N).jpg,共N張圖片,其鏈接形式較為固定,這樣經(jīng)簡單循環(huán),直接通過`f.write(requests.get(url).content)'即可以二進(jìn)制形式將圖片寫入。

import os
import requests

def download(file_path, picture_url):
	headers = {
		"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 			(KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 QIHU 360SE",
		}
	r = requests.get(picture_url, headers=headers)
	with open(file_path, 'wb') as f:
		f.write(r.content)

def main():
	os.makedirs('./pic/', exist_ok=True) # 輸出目錄

	prefix_url = 'http://xyz.com/series-' # 同一類目下的圖片url前綴
	n = 6 # 該類目下的圖片總數(shù)

	tmp = prefix_url.split('/')[-1]
	for i in range(1, n + 1):
		file_path = './pic/' + tmp + str(i) + '.jpg'
		picture_url = prefix_url + str(i) + '.jpg'
		download(file_path, picture_url)
		

if __name__ == '__main__':
	main()

正則re解析html獲取pic_url后下載

在實(shí)際操作中,圖片url按序排列情況較少,多數(shù)情況下用戶僅知道網(wǎng)頁url,需要對當(dāng)前網(wǎng)頁htnl內(nèi)容進(jìn)行解析,獲取源碼中包含的圖片url,常用方法有正則表達(dá)式匹配或BeautifulSoup等庫解析的方法。

正則re解析的思路是:首先通過 requests.get(url).text 獲得當(dāng)前頁面html源碼;然后通過正則表達(dá)式匹配圖片url,如 re.compile(r'[a-zA-z]+://[^\s]*\.jpg') 正則式一般會得到.jpg結(jié)尾的url,但其他網(wǎng)站圖片url可能會以.png或.webp等結(jié)尾,甚至需要其他的正則匹配,為此,讀者需要對正則表達(dá)式有所了解,強(qiáng)烈推薦 正則表達(dá)式30分鐘入門教程 ;將前一步得到的圖片url加入列表,進(jìn)行下載。

import os
import re
import requests

def get_html(url):
  headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36 ",
    }
  html = requests.get(url, headers=headers).text

  return html

def parse_html(html_text):
  picre = re.compile(r'[a-zA-z]+://[^\s]*\.jpg') # 本正則式得到.jpg結(jié)尾的url
  pic_list = re.findall(picre, html_text)

  return pic_list

def download(file_path, pic_url):
  headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36 ",
    }
  r = requests.get(pic_url, headers=headers)
  with open(file_path, 'wb') as f:
    f.write(r.content)

def main():
  # 使用時修改url即可
  url = 'http://xyz.com/series'
  html_text = get_html(url)
  pic_list = parse_html(html_text)

  os.makedirs('./pic/', exist_ok=True) # 輸出目錄
  for pic_url in pic_list:
    file_name = pic_url.split('/')[-1]
    file_path = './pic/' + file_name

    download(file_path, pic_url)
if __name__ == '__main__':
  main()

通過bs4獲取pic_url

與正則匹配思路類似,只不過通過Beautiful Soup解析html獲得圖片url列表,然后依次下載圖片。由于各網(wǎng)站html結(jié)構(gòu)有差異,用戶需要自行進(jìn)行適當(dāng)修改。以下代碼是對豆瓣圖片的下載。

import os
import time
import requests
from bs4 import BeautifulSoup

def get_html(url):
  headers = {
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 			(KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
  }
  html = requests.get(url, headers=headers).text

  return html

def parse_html(html_text):
  soup = BeautifulSoup(html_text, 'html.parser')
  li = soup.find_all('div', attrs={'class':'cover'})

  pic_list = []
  for link in li:
    pic_url = link.find('img').get('src')
    pic_url = pic_url.replace('/m/', '/l/')
    pic_list.append(pic_url)

  return pic_list

def download(file_path, pic_url):
  headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36 ",
    }
  r = requests.get(pic_url, headers=headers)
  with open(file_path, 'wb') as f:
    f.write(r.content)

def main():
  '從豆瓣下載石原里美圖片,觀察發(fā)現(xiàn)每頁包含30張圖片,其url按30遞增,如下所示'
  pic_list = []
  for i in range(10):
    url = 'https://movie.douban.com/celebrity/1016930/photos/?type=C&start=' + str(30*i) + '&sortby=like&size=a&subtype=a'
    html_text = get_html(url)
    pic_list += parse_html(html_text)
    
  os.makedirs('./pic/', exist_ok=True) # 輸出目錄

  for i, pic_url in enumerate(pic_list):
    if i%30 == 0:
      print('正在下載第%s頁'%(i/30+1))
    file_name = pic_url.split('/')[-1].split('.')[0] + '.jpg'
    file_path = './pic/' + file_name

    download(file_path, pic_url)

if __name__ == '__main__':
  main()

在下載圖片時,發(fā)現(xiàn)可以直接訪問圖片的縮略圖url進(jìn)行下載,但由于豆瓣的反爬策略,直接訪問原圖url會被服務(wù)器拒絕,見下圖。解決方法見下一部分。

Python下載網(wǎng)絡(luò)圖片的方法有哪些

可能遇到的問題

網(wǎng)站反爬蟲機(jī)制

  • User-Agent:模擬瀏覽器訪問,添加后,服務(wù)器會認(rèn)為是瀏覽器正常的請求。一般與網(wǎng)頁操作相關(guān)訪問都予以添加。
  • Referer:瀏覽器以此來判斷你從哪一個網(wǎng)頁跳轉(zhuǎn)過來。例如在上述豆瓣圖片的下載示例中,直接輸入網(wǎng)址會被拒絕,但你在網(wǎng)站一步步點(diǎn)擊卻會在同一地址中得到內(nèi)容,這就是因?yàn)槟阍谝徊讲皆L問時是有一個前序跳轉(zhuǎn)地址的,這個地址可以通過“F12”在header中得到,如果找不到的話試一試根目錄地址“ movie.douban.com/”,或是前幾步的地址”… GitHub倉庫'adv_bs4_url.py‘文件 。
  • ip偽裝:構(gòu)建ip池。
  • Cookie偽裝:cookie是服務(wù)器用來辨別你此時的狀態(tài)的,每一次向服務(wù)器請求cookie都會隨之更新。
  • 常用正則式匹配

網(wǎng)頁的數(shù)據(jù)采用異步加載,如js渲染的頁面或ajax加載的數(shù)據(jù)通過get不到完整頁面源碼。

一種方案是常說的動態(tài)爬蟲,即采用一些第三方的工具,模擬瀏覽器的行為加載數(shù)據(jù),如Selenium、PhantomJs等。網(wǎng)絡(luò)上有較多介紹文章,有點(diǎn)麻煩就沒有自己寫了,后續(xù)有需求的話在做吧,不過其他方法已經(jīng)夠用了。

另外可以通過分析頁面,找到請求借口,加載頁面。其核心就是跟蹤頁面的交互行為 JS 觸發(fā)調(diào)度,分析出有價值、有意義的核心調(diào)用(一般都是通過 JS 發(fā)起一個 HTTP 請求),然后我們使用 Python 直接訪問逆向到的鏈接獲取價值數(shù)據(jù)。通過"F12”進(jìn)行分析,例如對于花瓣網(wǎng),可以獲得其鏈接為" huaban.com/search/?q=石… request.urlopen(url).read() 讀取網(wǎng)頁。

Python下載網(wǎng)絡(luò)圖片的方法有哪些

Pyautogui,鼠標(biāo)模擬點(diǎn)擊的“傻瓜式”流程

本方法僅適用于重復(fù)性的工作,而且效率較低,但完全沒有被反爬蟲策略屏蔽的風(fēng)險。其核心思想與word中的“宏”類似,就是你告訴計(jì)算機(jī)一次循環(huán)中鼠標(biāo)分別如何操作,然后讓其自動循環(huán)。代碼簡單明了。

import pyautogui
import time

pyautogui.FAILSAFE = True

def get_mouse_positon():
  time.sleep(3) # 此間將鼠標(biāo)移動到初始位置
  x1, y1 = pyautogui.position()
  print(x1, y1)
  pyautogui.click(x=x1, y=y1, button='right') # 模擬鼠標(biāo)右鍵點(diǎn)擊,呼出菜單
  time.sleep(5) # 此間將鼠標(biāo)移動到“save image as...”選項(xiàng)中央
  x2, y2 = pyautogui.position()
  print(x2, y2)
  pyautogui.click(x=x2, y=y2) # 模擬鼠標(biāo)左鍵點(diǎn)擊,點(diǎn)中“save image as...”
  time.sleep(10) # 此間彈出保存文件彈窗,自行選擇保存位置,并將鼠標(biāo)移至“保存(S)”按鈕中央
  x3, y3 = pyautogui.position()
  pyautogui.click(x=x3, y=y3)
  print(x3, y3)


def click_download(N):
  for i in range(N): # 擬下載圖片數(shù)量
    pyautogui.click(x=517, y=557, duration=0.25, button='right') # 呼出菜單,自行將x/y設(shè)置為x1/y1
    time.sleep(1)
    pyautogui.click(x=664, y=773, duration=0.25) # 下載,x/y為x2/y2
    time.sleep(1)
    pyautogui.click(x=745, y=559, duration=0.25) # 保存,x/y為x3/y3
    time.sleep(1)
    pyautogui.click(x=517, y=557, duration=0.25) # 進(jìn)入下一張圖片
    time.sleep(2) # 取決于網(wǎng)絡(luò)加載速度,自行設(shè)置
 if __name__ == "__main__":
  # get_mouse_positon() # 一開始只運(yùn)行此命令,獲取屏幕坐標(biāo),后續(xù)注釋掉該句
  click_download(10)

上述內(nèi)容就是Python下載網(wǎng)絡(luò)圖片的方法,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

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

AI