標籤:

Python初學者好玩案例(一):最短的抓取網頁圖片代碼,只有10行

這幾天閑來無事,又研究了一下Python的基礎內容,首先研究的是如何抓取網頁數據。為什麼把這篇作為初學者筆記呢?只是想讓大家感受一下Python的強大的功能和簡便的用法。

發現大神們通常在初級教程里就要寫很多代碼,真讓我們這些初學者無所適從。

加上Python的各種版本不同,也會讓初學者頭腦,在此提醒初學者,看資料一定要注意軟體版本號。

還是按照我的原則,凡事要把複雜的說簡單,再由簡入繁的學習,才是比較科學的方法。

先上代碼,再進行分析,以下程序在Python3.6中調試通過。

import urllib.request

import re

link = urllib.request.urlopen("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) + "張圖片,網址是" + jpg_list[n - 1])

n = n + 1

看吧,我沒騙大家,真的只有10行(不包括空行)。

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

運行結果圖片

接下來再解釋一下:

import urllib.request

import re

首先,導入urllib.request庫和re庫,如果看到資料上有urllib2庫,請無視這種資料,因為已經過時了,在Python3以後的版本中,urllib2庫被合併到了urllib中,所以urllib整個模塊包括urllib.request, urllib.parse, urllib.error三個功能,下面在引用的時候,也可寫成urllib.request如何如何。

在接下來的代碼中,有四個自定義的變數名稱,分別是link、html_doc、jpg_list、n,大概意思是連接、得到html文本內容、jpg的列表、還有一個記數的n,總結你喜歡叫它們什麼都行,就是別搞混了。

link = urllib.request.urlopen("dzh.mop.com/")

link變數等於請求打開dzh.mop.com/網址。

html_doc = link.read().decode("utf8")

html_doc 等於link里的內容,並指定為utf8編碼的文檔(utf8是一種可變長度字元編碼,可以在一個網頁上顯示多種語言)。

jpg_list = re.findall(http.+?.jpg, html_doc)

得到一個jpg_list列表,內容是用re.findall命令查找html_doc里所有符合開頭和結尾是http.+?.jpg的欄位,就是網址了。

這個裡涉及一個術語叫「正則表達式」,需要另外學習一下,它能從字元串中獲取我們想要的指定部分,其實類似DOS系統的「通配符」。

接下來,要統計一下符合我們需要的網址有多少個,用len(jpg_list)就可以得到,但是list是從0開始的,所以要加上1。

用urllib.request.urlretrieve功能下載jpg_list中的圖片,並用數字轉字元的n加.jpg來命名。

下一句print是廢話,是怕在下載的過程中我們太寂寞。

n = n + 1就是第一張下載完了,再去下載第二張,直到len(jpg_list) 統計的個數的圖片都下載完。

n = 1

while n< len(jpg_list) + 1:

urllib.request.urlretrieve(jpg_list[n - 1], str(n) + .jpg)

print("獲取第" + str(n) + "張圖片,網址是" + jpg_list[n - 1])

n = n + 1

當然,這段代碼還解決不了比如下載圖片太多,主機會斷開連接等問題。

但是初學者先從基本的學習,再慢慢擴展,這個是學習的必經之路。

當然,為了追求行數少,這段代碼只用7行加2個變數就能搞定,不過初學者更容易看暈:

import urllib.request

import re

jpg_list = re.findall(http.+?.jpg, urllib.request.urlopen("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

推薦閱讀:

print or plan and not print()()() 的疑問?
第十章 Scrapy的架構初探
pyinstaller無法打包含requests模塊的程序?
python shell代碼無法保存為何?

TAG:Python |