本筆記整理自中谷教育在線教育視頻
學(xué)習(xí)筆記——正則表達(dá)式常用符號(hào)
這里學(xué)習(xí)過正則表達(dá)式后,簡單做了一個(gè)爬蟲程序,效果為從某個(gè)網(wǎng)站上下載網(wǎng)站上的符合要求的圖片。這里選取了百度貼吧中的某個(gè)壁紙網(wǎng)站:實(shí)驗(yàn)網(wǎng)站,目標(biāo)是下載實(shí)驗(yàn)網(wǎng)站上面的壁紙圖片。
實(shí)現(xiàn)代碼
import re
import urllib
def getHtml(url):
page = urllib.urlopen(url)
html = page.read()
return html
def getImg(html):
reg = r'src="(.*?\.jpg)" width'
imgre = re.compile(reg)
imglist = re.findall(imgre, html)
x = 0
for imgurl in imglist:
urllib.urlretrieve(imgurl,'%s.jpg' %x)
x+=1
Html = getHtml("https://tieba.baidu.com/p/1112043392?pid=12757849991&cid=0&red_tag=0812006929#12757849991") \\選取某百度貼吧網(wǎng)址
getImg(Html)
代碼分析
首先,這里導(dǎo)入正則表達(dá)式模塊re、網(wǎng)頁爬蟲模塊urliib
import re
import urllib
定義兩個(gè)函數(shù),getHtml()和getImg(),作用分別為獲得網(wǎng)頁的源代碼和得到圖片。
def getHtml(url):
page = urllib.urlopen(url)
html = page.read()
return html
getHtml()函數(shù)實(shí)現(xiàn)了從網(wǎng)站url上獲取源代碼。
def getImg(html):
reg = r'src="(.*?\.jpg)" width'
imgre = re.compile(reg)
imglist = re.findall(imgre, html)
x = 0
for imgurl in imglist:
urllib.urlretrieve(imgurl,'%s.jpg' %x)
x+=1
getImg()函數(shù)實(shí)現(xiàn)了從源代碼匹配圖片的原網(wǎng)址代碼,主要是正則的定義,分析過網(wǎng)站源代碼后,發(fā)現(xiàn)圖片原網(wǎng)址有以下共同特征:以'.jpg'結(jié)尾,網(wǎng)站前后有",在""之前有字符串'src=',之后有' width',于是,正則的定義可以如下:
reg = r'src="(.*?\.jpg)" width'
其中,reg = r'str'表示定義字符串str為正則;()表示只輸出()內(nèi)的字符串的內(nèi)容,即在后面由re.findall()函數(shù)匹配后只輸出圖片源網(wǎng)站。這里的'.'表示任意字符,'*'表示取0到無限長,'?'表示進(jìn)行最小匹配,防止在網(wǎng)站源代碼內(nèi)進(jìn)行最大搜索,不能得到圖片網(wǎng)址,這里第二個(gè)'.'前面加''表示這里的'.'是字符本身,而不是廣泛的任意字符。
然后使用urllib.urlretrieve()實(shí)現(xiàn)圖片的下載,命名。
urllib.urlretrieve(imgurl,'%s.jpg' %x)
幾點(diǎn)問題
- 這里進(jìn)行圖片下載時(shí)首先要保證圖片網(wǎng)站是能夠進(jìn)入的,筆者在實(shí)現(xiàn)時(shí)就出現(xiàn)了報(bào)錯(cuò)狀態(tài),原因是匹配的圖片網(wǎng)站本身就是不可進(jìn)入的。
- 匹配后可能會(huì)出現(xiàn)非要求的網(wǎng)址被匹配出來,這里就要求能夠精確搜索條件,增加匹配的精度。