1. 程式人生 > >Python初學者好玩案例(一):最短的抓取網頁圖片程式碼,只有10行

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

這幾天閒來無事,又研究了一下Python的基礎內容,首先研究的是如何抓取網頁資料。


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


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


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


先上程式碼,再進行分析,以下程式在Python3.6中除錯通過。

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) + "張圖片,網址是" + 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,你喜歡叫什麼名字都行,就是別搞混了。

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

link變數等於請求開啟http://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("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