很多人學習Python很重要的一個原因是,可以很簡單的把一個網站的數據爬下來。
尤其是做我們這一行,產品經理,電商行業。
領導:弄一個買賣游戲周邊商品的交易APP出來。
我:行,那我們賣什么呀?
領導:看下友商賣什么我們就賣什么。
我:好吧,那就爬點數據下來吧。
玩笑歸玩笑,雖有誇張成分,但也不無道理。注意:很多人學Python過程中會遇到各種煩惱問題,沒有人幫答疑容易放棄。為此小編建了個Python全棧免費答疑.裙 :七衣衣九起起巴而五(數字的諧音)轉換下可以找到了,不懂的問題有老司機解決里面還有最新Python教程項目可拿,,一起相互監督共同進步!
作為入門級別,首先就來學習下怎么爬取網站圖片。只需要調用4個方法,即可輕松批量拿到網站圖片。

下面對於每一步調用的方法進行詳細說明(主要還是自己拿了別人代碼之后遇到的坑)
第一步:獲取網頁的源代碼
urllib.request.urlopen().read()
這個方法是獲取到請求的這個URL所返回的網頁源代碼信息數據,返回值是bytes類型時,要將其轉換成utf-8才能正常顯示在python程序中,所以還要調用decode()方法進行解碼。
最終得到的就是平時我們編寫或者查看的頁面源代碼了。

這里可能會出現的報錯信息:
1.Non-ASCII character '\xe5'
原因:這是編碼的問題,Python的默認編碼文件是用的ASCII碼,而你的Python文件中使用了中文等非英語字符。
解決方法:在第一行添加 # -- coding: UTF-8 --

2.如果爬取的網站是https協議的,需要在請求時會驗證一次SSL證書
解決方法:全局加上以下代碼

第二步:過濾出圖片URL
這一步至為關鍵,因為在一堆網頁源代碼中,要有效找出目標對象(圖片URL)的特點(結構特征)才行。怎么找?
1.了解圖片URL的html表達方式
學過html的同學都知道,圖片的標簽是<img>,src屬性定義其圖片源路徑。
2.使用正則表達式進行匹配
我也沒有詳細了解過正則表達式各個符號的含義,這里不展開講。
這里的正則表達式的意思是,過濾出所有標簽是<img>,旗下的src屬性,且屬性值是以http開頭jpg結尾的源代碼。
每個網站的規則都不一樣,不能直接套用代碼。
簡單例子,你要爬取的網站圖片是png格式,直接拿代碼去運行肯定是什么都抓不到的。
再例如,我在一開始設定的規則中是沒有加上http開頭的,結果抓到一些圖片URL是相對路徑的數據,導致后面是無法訪問URL報錯的。
3.將所有匹配規則的代碼存入list里
re.compile() 根據包含的正則表達式的字符串創建模式對象(直接拿來用就好)
findall() 返回string中所有與pattern相匹配的全部字串,返回形式為數組

我們試一下打印出來imglist是什么結果,看是不是就把所有匹配規則的內容全部找出來呢!

第三步:定義圖片保存路徑
這一步看個人習慣,如果只是少數幾張圖片,就沒有必要新建一個文件夾給圖片都保存整理到一起。
不過如果是爬一個網站或一個網頁相對數量級比較大的時候,建議還是全部整理到一個文件夾里面,好管理嘛。
“新建文件夾”這個基礎的操作,就調用os.makedirs()方法即可。

但是這里有3個注意的點:
1.新建文件夾,你是希望指定路徑還是在當前路徑下創建?
指定路徑:很簡單,直接把你想要創建文件夾的路徑復制出來,加上新建文件夾的名稱,作為參數直接寫到方法里即可。
eg.(windows)
當前路徑:先獲取當前的目錄,再拼接上新建文件夾的名稱。
獲取當前目錄的方式是:os.getcwd()
eg.

2.新建的文件夾是否已存在?
相同目錄下不能有重名的文件/文件夾,如果直接創建的話,就會報錯:文件已存在,無法創建。

3.是否需要考慮windows和macOS的路徑表述方式不一樣?
注意一下,兩個操作系統對於路徑的表述方式是不一樣的,尤其是指定路徑,要輸入正確的路徑才能創建成功。
第四步:將圖片URL保存到文件夾下
現在,圖片URL已經存入到list里(見第2步)、保存圖片的文件夾也有了,就可以將虛擬的圖片url轉換成真實的png或jpg文件。
urllib.request.urlretrieve(url, filename) 這個方法就是將遠程數據下載到本地
url:遠程或本地的url,對應這里就是要放圖片URL了。
filename:保存的完整地方,即“路徑+文件名”。如果未指定該參數,urllib會生成一個臨時文件來保存數據。
這里要注意3個地方:
1.圖片的文件名怎么生成?
建議使用最簡單的方式來生成文件名:遞增數字+圖片后綴
這里就再次說明要新建文件夾的重要性,新建文件夾后,這個目錄下是全新空白的,不用考慮生成的文件名會不會和原有文件名重復的問題。
遞增數字:譬如說,第一張圖片叫“1.jpg”,第二張圖片叫“2.jpg”,如此類推。
2.一般網站爬下來的圖片是多張的,如何批量處理?
這里也說明了,為什么要將抓取到的圖片url存到list里面了。給list一個循環,每個url調用一次urllib.request.urlretrieve()方法,那就相當於每個url都保存為1個圖片。

3.報錯:urllib2.HTTPError: HTTP Error 403: Forbidden
原因:一些網站是禁止爬蟲做的處理
解決方法:可以在請求加上頭信息,偽裝成瀏覽器訪問User-Agent(具體的信息可以通過火狐的FireBug插件查詢),再去請求。

運行結果:一堆圖片

其他問題
1.沒有自動安裝或導入第三方庫,如urllib.request
報錯:ImportError: No module named request
解決方法:安裝第三方庫,Mac機上在安裝python3之后,系統是自動安裝了pip3,所以我們只需要每次使用pip3即可安裝(Windows請自行百度,注意區分Python2和Python3)
敲入安裝命令:pip3 install requests
2.千萬千萬要注意windows和mac系統的路徑表達方式不一樣
因為我是兩個操作系統切換着用,所以很頭痛有這個問題,每次要記得改就是了,沒技術難度。或者再加一層系統判斷進行兼容就好了。
最后注意:很多人學Python過程中會遇到各種煩惱問題,沒有人幫答疑容易放棄。為此小編建了個Python全棧免費答疑.裙 :七衣衣九起起巴而五(數字的諧音)轉換下可以找到了,不懂的問題有老司機解決里面還有最新Python教程項目可拿,,一起相互監督共同進步!
本文的文字及圖片來源於網絡加上自己的想法,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯系我們以作處理。