1. 程式人生 > >使用python做爬蟲時儲存圖片的方法大全以及需要注意的地方

使用python做爬蟲時儲存圖片的方法大全以及需要注意的地方

1.使用urllib.urlretrieve()

用法:urlretrieve(url, filename=None, reporthook=None, data=None)

  • 引數 finename 指定了儲存本地路徑(如果引數未指定,urllib會生成一個臨時檔案儲存資料。)
  • 引數 reporthook 是一個回撥函式,當連線上伺服器、以及相應的資料塊傳輸完畢時會觸發該回調,我們可以利用這個回撥函式來顯示當前的下載進度。
  • 引數 data 指 post 到伺服器的資料,該方法返回一個包含兩個元素的(filename, headers)元組,filename 表示儲存到本地的路徑,header 表示伺服器的響應頭。

py2程式碼示例:

# -*- coding: utf-8 -*-
import urllib
img_src = 'http://724.169pp.net/bizhi/2017/039/1.jpg'
urllib.urlretrieve(img_src,r'C:\\Users\\ME\\Desktop\\Python project\\pachong\\scrapy\\secondDemo\\photo\\1.jpg')

2.使用PIL+requests

PIL:Python Imaging Library,已經是Python平臺事實上的影象處理標準庫了。PIL功能非常強大,但API卻非常簡單易用。

requests是python實現的最簡單易用的HTTP庫,建議爬蟲使用requests庫。預設安裝好python之後,是沒有安裝requests模組的,需要單獨通過pip安裝

BytesIO是用來操作二進位制資料的,因為圖片是二進位制資料,和它相對的自然是StringIO,這是用來存str的。他們的區別就好似python讀寫普通檔案和二進位制檔案。

py2程式碼示例:

# -*- coding: utf-8 -*-
import requests
from PIL import Image
from io import BytesIO
img_src = 'http://724.169pp.net/bizhi/2017/039/1.jpg'
response = requests.get(img_src)
image = Image.open(BytesIO(response.content))
image.save(r'C:\\Users\\ME\\Desktop\\Python project\\pachong\\scrapy\\secondDemo\\photo\\' + '1.jpg')

3.使用os+requests

os 模組提供了非常豐富的方法用來處理檔案和目錄,可參考   http://www.runoob.com/python3/python3-os-file-methods.html      例如


py3程式碼示例:

# -*- coding: utf-8 -*-
import urllib
import requests
import os
import codecs
url = 'http://724.169pp.net/bizhi/2017/039/1.jpg'
bytes = urllib.request.urlopen(url)
f = codecs.open(r'C:\\Users\\ME\\Desktop\\Python project\\pachong\\scrapy\\secondDemo\\photo\\' + '1.jpg', 'wb') # 代開一個檔案,準備以二進位制寫入檔案
f.write(bytes.read())  # write並不是直接將資料寫入檔案,而是先寫入記憶體中特定的緩衝區
f.flush() # 將緩衝區的資料立即寫入緩衝區,並清空緩衝區
f.close() # 關閉檔案

需要注意的地方:

1.區分python2與3的版本,尤其是2的版本第一行一定要加

# -*- coding: utf-8 -*-

2.注意存入檔名,如果有中文,要注意編碼轉換

3.EOL while scanning string literal

最後得到的結果: