這幾天閑來無事,又研究了一下Python的基礎(chǔ)內(nèi)容,首先研究的是如何抓取網(wǎng)頁數(shù)據(jù)。為什么把這篇作為初學(xué)者筆記呢?只是想讓大家感受一下Python的強大的功能和簡便的用法。
發(fā)現(xiàn)大神們通常在初級教程里就要寫很多代碼,真讓我們這些初學(xué)者無所適從。
加上Python的各種版本不同,也會讓初學(xué)者頭腦,在此提醒初學(xué)者,看資料一定要注意軟件版本號。
還是按照我的原則,凡事要把復(fù)雜的說簡單,再由簡入繁的學(xué)習(xí),才是比較科學(xué)的方法。
先上代碼,再進行分析,以下程序在Python3.6中調(diào)試通過。
import urllib.request
import re
link = urllib.request.urlopen("http://dzh.mop.com/")
html_doc = link.read().decode("utf8")
jpg_list = re.findall('http.+?.jpg', html_doc)
n = 1
while n < len(jpg_list) + 1:
? ? urllib.request.urlretrieve(jpg_list[n - 1], str(n) + '.jpg')
? ? print("獲取第" + str(n) + "張圖片,網(wǎng)址是" + jpg_list[n - 1])
? ? n = n + 1
看吧,我沒騙大家,真的只有10行(不包括空行)。
運行完,在項目的目錄里,就多出了圖片。
接下來再解釋一下:
import?urllib.request??
import?re??
首先,導(dǎo)入urllib.request庫和re庫,如果看到資料上有urllib2庫,請無視這種資料,因為已經(jīng)過時了,在Python3以后的版本中,urllib2庫被合并到了urllib中,所以urllib整個模塊包括urllib.request, urllib.parse, urllib.error三個功能,下面在引用的時候,也可寫成urllib.request如何如何。
在接下來的代碼中,有四個自定義的變量名稱,分別是link、html_doc、jpg_list、n,大概意思是連接、得到html文本內(nèi)容、jpg的列表、還有一個記數(shù)的n,總結(jié)你喜歡叫它們什么都行,就是別搞混了。
link?=?urllib.request.urlopen("http://dzh.mop.com/")??
link變量等于請求打開http://dzh.mop.com/網(wǎng)址。
html_doc?=?link.read().decode("utf8")??
html_doc 等于link里的內(nèi)容,并指定為utf8編碼的文檔(utf8是一種可變長度字符編碼,可以在一個網(wǎng)頁上顯示多種語言)。
jpg_list?=?re.findall('http.+?.jpg',?html_doc)??
得到一個jpg_list列表,內(nèi)容是用re.findall命令查找html_doc里所有符合開頭和結(jié)尾是'http.+?.jpg'的字段,就是網(wǎng)址了。
這個里涉及一個術(shù)語叫“正則表達式”,需要另外學(xué)習(xí)一下,它能從字符串中獲取我們想要的指定部分,其實類似DOS系統(tǒng)的“通配符”。
接下來,要統(tǒng)計一下符合我們需要的網(wǎng)址有多少個,用len(jpg_list)就可以得到,但是list是從0開始的,所以要加上1。
用urllib.request.urlretrieve功能下載jpg_list中的圖片,并用數(shù)字轉(zhuǎn)字符的n加'.jpg'來命名。
下一句print是廢話,是怕在下載的過程中我們太寂寞。
n = n + 1就是第一張下載完了,再去下載第二張,直到len(jpg_list) 統(tǒng)計的個數(shù)的圖片都下載完。
n?=?1??
while?n<?len(jpg_list)?+?1:??
????urllib.request.urlretrieve(jpg_list[n?-?1],?str(n)?+?'.jpg')??
????print("獲取第"?+?str(n)?+?"張圖片,網(wǎng)址是"?+?jpg_list[n?-?1])??
n?=?n?+?1??
當(dāng)然,這段代碼還解決不了比如下載圖片太多,主機會斷開連接等問題。
但是初學(xué)者先從基本的學(xué)習(xí),再慢慢擴展,這個是學(xué)習(xí)的必經(jīng)之路。
當(dāng)然,為了追求行數(shù)少,這段代碼只用7行加2個變量就能搞定,不過初學(xué)者更容易看暈:
import?urllib.request??
import?re??
jpg_list?=?re.findall('http.+?.jpg',?urllib.request.urlopen("http://dzh.mop.com/").read().decode("utf8"))??
n?=1??
while?n?<?len(jpg_list)?+?1:??
urllib.request.urlretrieve(jpg_list[n?-1],?str(n)?+?'.jpg')??
n?=?n?+1??