使用Python爬取網頁圖片

近一段時間在學習如何使用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爬蟲最常用的三個正則表達式為點號,星號,問號和圓括弧:

點號:匹配除「rn」之外的任何單個字元,可以理解為一個佔位符

舉例:

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,網頁中的圖片全都下載下來啦,很簡單吧。有興趣的同學還不趕快動手試試?

----------------------------------------------

作者:劉順祥

出處:劉順祥博客

公眾號:每天進步一點點2015

大家也可以加小編微信:tswenqu,進R語言中文社區 交流群,可以跟各位老師互相交流

推薦閱讀:

python內建函數的概略學習?
Python從零開始系列連載(6)——Python的基本數據類型(中)
python與numpy使用的一些小tips(5)
python主要用於什麼開發?

TAG:Python | 爬虫 | 数据分析 |