Python初學(xué)者筆記(一):最短的抓取網(wǎng)頁圖片代碼,只有10行

這幾天閑來無事,又研究了一下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行(不包括空行)。

運行完,在項目的目錄里,就多出了圖片。

運行結(jié)果圖片

接下來再解釋一下:

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??

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容