使用Python爬取網頁圖片
使用Python爬取網頁圖片
李曉文 21 天前近一段時間在學習如何使用Python進行網路爬蟲,越來越覺得Python在處理爬蟲問題是非常便捷的,那麼接下來我就陸陸續續的將自己學習的爬蟲知識分享給大家。
首先在進行實戰前,我們需要了解幾個常用的函式和正則表示式:
一、幾個常用的函式
這裡介紹的函式是來自於requests擴充套件包,他們是findall,search和sub函式:
findall(pattern, string, flags=0)
pattern:
string:為字串
search(pattern, string, flags=0)
pattern:為正則表示式
string:為字串
findall與search的區別
findall將遍歷所有滿足條件的內容,而search一般與group(n)搭配使用,選出滿足條件的某個內容。
sub(pattern, repl, string, count=0, flags=0)
pattern:為正則表示式
repl:需要替換的內容
string:為原字串
二、幾個常用的爬蟲正則表示式
Python爬蟲最常用的三個正則表示式為點號,星號,問號和圓括號:
點號:匹配除“\r\n”之外的任何單個字元,可以理解為一個佔位符
舉例:
x = '1q2wwyxliuwyx3e4rwyxshunwyx1q2wwyxxiangwyx3e4r'
re.findall('wyx.',x)
Out[1]: ['wyxl', 'wyx3', 'wyxs', 'wyx1', 'wyxx', 'wyx3']
返回"wyx"和緊跟其後的第一個字元
re.findall('wyx...',x)
Out[2]: ['wyxliu', 'wyx3e4', 'wyxshu', 'wyx1q2', 'wyxxia', 'wyx3e4']
返回"wyx"和緊跟其後的第一第二個字元
所以可以將點號(.)理解為一個佔位符,而且這個佔位符可以代表一切字元。
星號:匹配前一個字元任意次
x = '1q2wwyxliuwyx3e4rwyxshunwyx1q2wwyxxiangwyx3e4r'
re.findall('wyx*',x)
Out[3]: ['wyx', 'wyx', 'wyx', 'wyx', 'wyxx', 'wyx']
星號(*)前一個字元為x,所以返回結果中可以找到x的任意次,x字串中有兩個連續的x,所以返回結果中第5個元素就會有兩個x。
問號:匹配前一個字元0次或1次,與星號的不同在於其最多匹配一次。
x = '1q2wwyxliuwyx3e4rwyxshunwyx1q2wwyxxiangwyx3e4r'
re.findall('wyx?',x)
Out[4]: ['wyx', 'wyx', 'wyx', 'wyx', 'wyx', 'wyx']
結果顯示,返回結果的第五個元素僅含有一個x。
點星組合(.*):貪婪演算法,儘可能多的匹配資料
re.findall('wyx.*wyx',x)
Out[5]: ['wyxliuwyx3e4rwyxshunwyx1q2wwyxxiangwyx']
從返回的結果就可以理解“貪婪”的概念了,結果一次性返回wyx與wyx之間的所有內容。
點星問組合(.*?):非貪婪演算法,儘可能少的匹配資料
re.findall('wyx.*?wyx',x)
Out[6]: ['wyxliuwyx', 'wyxshunwyx', 'wyxxiangwyx']
而這次的返回結果就完全不同於上面的結果,它儘可能少的返回滿足正則表示式的結果,從而將1大串切割為3小串。
圓括號():返回所需資訊
re.findall('wyx(.*?)wyx',x)
Out[7]: ['liu', 'shun', 'xiang']
很明顯,通過括號的操作,就直接將想提取的內容摳下來了。
三、半自動化的圖片爬蟲
本次爬蟲的實驗來自於噹噹網有關Python書籍的url,即:
url = Python-噹噹網
在爬取該網頁的圖片之前,我們需要了解一下網頁原始碼中有關圖片的模式:
發現關於圖片的連結存在兩種模式,即"<img src='(.*?)' alt"和"img data-original='(.*?)' src",所以我們需要按兩種方式提取圖片。
首先,將網頁原始碼複製出來,貼上到Pic文字檔案中,並將內容讀取到Content物件中:
f = open('Pic.txt','r')
Content = f.read()
f.close
其次,分別用兩種模型提取出圖片連結
pic_url = re.findall("<img src='(.*?)' alt",Content)
print pic_url
pic_url2 = re.findall("img data-original='(.*?)' src",Content)
print pic_url2
以上兩種模式的圖片連結已下載好,接下來就是將這兩個列表合併:
pic_url.extend(pic_url2)
最後,通過遍歷pic_url中的圖片連結,將圖片下載並儲存到指定的目錄下:
import requests #匯入所需擴充套件包
i = 0
for url in pic_url: #開始遍歷pic_url中的每個元素
print 'Downloding: ' + url
Pic = requests.get(url)
fp = open('Pic\\' + str(i) + '.jpg','wb') #儲存檔案
fp.write(Pic.content) #將檔案寫入到指定的目錄資料夾下
fp.close()
i = i + 1
我們看看Pic資料夾是否含有下載好了的檔案呢?
Perfect,網頁中的圖片全都下載下來啦,很簡單吧。有興趣的同學還不趕快動手試試?
----------------------------------------------