用正則表達式匹配字符串,篩選出所需要的內(nèi)容,加上簡單網(wǎng)絡(luò)訪問代碼,實現(xiàn)一個最簡單的爬蟲。
目標(biāo)網(wǎng)頁:
https://tieba.baidu.com/p/3205263090
實現(xiàn)一個圖片批量下載的功能。把這個頁面上發(fā)表的圖表全部下載下來。

雖然拿到這個頁面上的圖片有多種方式,我們練習(xí)的是用Python+正則表達式 來下載圖片。
一、獲取網(wǎng)頁源代碼
直接上代碼:
import urllib
page = urllib.urlopen('https://tieba.baidu.com/p/3205263090')
print page.read()
運行一下,就是看到控制臺上打印出來的網(wǎng)頁的代碼。
解釋一下:urllib是Python提供的基礎(chǔ)網(wǎng)絡(luò)訪問模塊。urlopen() 創(chuàng)建一個表示遠程url的類文件對象,然后可以像本地文件一樣,操作這個類文件對象來獲取遠程數(shù)據(jù)。
read() 方法是讀取這個文件,打印出來就是所要訪問網(wǎng)頁的源代碼。
二、用正則表達式匹配出所需要的圖片URL
通過chrome右鍵檢查 -- Elements 查看圖片對應(yīng)的代碼:

找到這些圖片url的共同特點(頁面上還有其他的圖片),是src=后面一串字符到 .jpg為止,如果加上列多特征 pic_ext="jpeg",這樣可以把跟頁面上的其他圖片區(qū)別出來。
src="([.*\S]*\.jpg)" pic_ext="jpeg"
寫出正則表達式,.代表不包括\n的任意字符,*表示有多個字符,\S表示非空字符(防止向后包含空字符匹配了很長的字符串),()表示我們所需要匹配出來的內(nèi)容。
reg = r'src="([.*\S]*\.jpg)" pic_ext="jpeg"'
imgurls = re.findall(reg, html) #匹配出所有url
#遍歷
for imgurl in imgurls:
print imgurl
三、保存下載圖片
urlretrieve() 方法直接將遠程數(shù)據(jù)下載到本地。
#coding=utf-8
import re
import urllib
# 獲取網(wǎng)頁源代碼的方法
def getHtml(url):
page = urllib.urlopen(url)
html = page.read()
return html
html = getHtml('http://tieba.baidu.com/p/3205263090')
reg = r'src="([.*\S]*\.jpg)" pic_ext="jpeg"'
imgurls = re.findall(reg, html) #用正則匹配到的圖片路徑的集合
x = 1
for imgurl in imgurls:
print imgurl # 打印查看一下是不是 每個圖片的URL
urllib.urlretrieve(imgurl, '你機器上要保存圖片的路徑/%s.jpg' % x)
print "正在下載第 %d 張"%x
x +=1
快去看一下下載的圖片吧。
你可能發(fā)現(xiàn)圖片下載的并不快,有網(wǎng)絡(luò)原因,也有正則表達式匹配的原因。這段小代碼只是一個檢驗,繼續(xù)學(xué)習(xí)吧,后面會有更簡單、快速的方式,好用的第三方庫requests,xpath可以更快速定位到你需要的內(nèi)容。
==============
練習(xí)問題:
有同學(xué)看完上面代碼,馬上想嘗試另一個網(wǎng)站(網(wǎng)頁)的圖片爬取,這是一個很好的學(xué)習(xí)思路和方法。我們來看一下,花瓣網(wǎng)
http://huaban.com/pins/1120072731/
- 這個頁面上圖片很多,你先要確定要抓取哪網(wǎng)頁什么地方的圖片
當(dāng)然可以是頁面所有圖片,也可以是網(wǎng)頁下部的瀑布流布局的圖片。(實際上以后這一步就是確定,你需要抓取的數(shù)據(jù)字段) - 找到數(shù)據(jù)(圖片)對應(yīng)的源代碼進行分析,這篇文章的方式就是寫一個正則表達式(以后會使用如BeautifulSoup, XPath)
不要“右鍵 -- 源代碼”去搜索找到對應(yīng)的內(nèi)容,使用Chrome -- 右鍵 -- 檢查 ,就是定位到 網(wǎng)頁元素對應(yīng)的代碼。 - 檢查審核
這里要檢查,1)圖片src對應(yīng)的是不是一個完整URL(因為可以用相對文件引用的方式),如果不是要補全。2)檢查 正則表達式是不是能“準(zhǔn)確特征匹配”-- 就是用正則表達式匹配到的都是你所需要的內(nèi)容。

分析和對比幾處圖片,要想匹配出圖片的URL
<img src="([.*\S]*)"
檢查一下,這個正則匹配到的頁面所有圖片URL。想一想如果是某一個區(qū)域,某一個類型的圖片,正則要怎么寫。
總結(jié)一下:用正則就是要找到你要數(shù)據(jù)的共同特征,而且要能與其他數(shù)據(jù)區(qū)別開來。
