Python初學者好玩案例(一):最短的抓取網頁圖片代碼,只有10行
這幾天閑來無事,又研究了一下Python的基礎內容,首先研究的是如何抓取網頁數據。為什麼把這篇作為初學者筆記呢?只是想讓大家感受一下Python的強大的功能和簡便的用法。
發現大神們通常在初級教程里就要寫很多代碼,真讓我們這些初學者無所適從。
加上Python的各種版本不同,也會讓初學者頭腦,在此提醒初學者,看資料一定要注意軟體版本號。
還是按照我的原則,凡事要把複雜的說簡單,再由簡入繁的學習,才是比較科學的方法。
先上代碼,再進行分析,以下程序在Python3.6中調試通過。
import urllib.request
import relink = urllib.request.urlopen("http://dzh.mop.com/")html_doc = link.read().decode("utf8")jpg_list = re.findall(http.+?.jpg, html_doc)n = 1while 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("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
推薦閱讀:
※print or plan and not print()()() 的疑問?
※第十章 Scrapy的架構初探
※pyinstaller無法打包含requests模塊的程序?
※python shell代碼無法保存為何?
TAG:Python |