知識儲備,簡單爬蟲的必知必會,【核心】
一、實驗說明
1. 環境登錄
無需密碼自動登錄,系統用戶名shiyanlou
2. 環境介紹
本實驗環境采用帶桌面的Ubuntu Linux環境,實驗中會用到桌面上的程序:
- xfce終端:Linux命令行終端,打開后會進入 shell 環境,可以使用Linux命令
- Firefox:瀏覽器,可以用在需要前端界面的課程里,只需要打開環境里寫的HTML/JS頁面即可
- GVim:非常好用的編輯器,最簡單的用法可以參考課程Vim編輯器
3. 環境使用
使用GVim編輯器輸入實驗所需的代碼及文件,使用 xfce終端運行所需命令進行操作。
實驗報告可以在個人主頁中查看,其中含有每次實驗的截圖及筆記,以及每次實驗的有效學習時間(指的是在實驗桌面內操作的時間,如果沒有操作,系統會記錄為發呆時間)。這些都是您學習的真實性證明。
實驗樓虛擬機,自帶了python2.X和python3.X版本,本課程基于 python2
二、課程介紹
一門編程語言的學習,實踐中學習的效果肯定是最好的,我當初學python就是沖著爬蟲來的,所以這次的課程目的是學會“炮制”簡單的爬蟲
本次課程,主要是介紹根據給定的url,下載網頁中指定的模特圖片,python版本為2.7(3.0也可以運行,print需要修改下),使用的模塊有os、urllib2、re,單線程爬蟲
這節課程基本沒有代碼全是原理,但是原理很重要,我會細講,所以本節課程的文字內容,請細看。后面的課程是建立在這節課程之上來完成的,而且課程之間是上下級調用關系,層次結構很明顯。
-
介紹下圖片來源--妹子圖,這個網站的整個爬取是最終目的,這節主要是對單個頁面內的圖片,進行爬取,例如這個 誰是這長發女孩心中的白馬王子
,供上第一張圖片手下我的膝蓋
三、課題探索
-
第一步:
套圖頁面:這里呢,主要是搜索頁面中的模特圖片路徑,但是圖片都是img標簽,不設計個簡單匹配套路,還真難得到100%的精確度,先提供一個網頁,大家試著找找,軟妹
標簽所有單頁:獲取該網頁中的所有套圖頁的鏈接(進入套圖頁),也就是給定一個標簽頁,獲得這個頁面中顯示的所有套圖頁的鏈接,如某一標簽頁example[15](實際情況比這還多),則這個頁面中包含了15個套圖
標簽所有頁面:一個標簽不止一個頁面,獲取該標簽的所有頁,如tag1[35][10](實際情況比這還多),標簽tag1又35個頁面,每個頁面又包含了10個套圖頁面,就像一個二維數組。
-
頂級域名頁面:這里,包含了所有的標簽以及它們的鏈接,不過呢,有重復,這里很簡單的做一個去重就可以了,如meizi[8](實際情況比這還多),說明這個網站包含8個標簽,每個標簽里面又有它自己所包含的鏈接。
圖的信息量還是蠻大的,如圖--
Xmind 最后提下圖片保存路徑問題,這個呢在中層和高層中需要,底層還是不需要的,底層測試時,傳入文件夾路徑并保存該文件夾下,但在中層中,路徑問題還是挺嚴重的,因為我們最終是啟動高層,傳入一個最初的文件夾路徑,然后高層創建中層文件夾,并且在調用中層函數時,將標簽鏈接和對應的文件夾路徑傳過去,中層調用底層也是一樣的,都需要傳過去文件夾路徑。不過文件夾路徑傳過去,最后是由底層來創建,高層和中層是不創建的,路徑是虛的,由底層創建并保存圖片文件:
- meizi是由我們調用頂層時,傳進去文件夾,這個文件夾是真實存在的
- baobei nvshen mengmeizi 是頂層擬定的,在調用中層時,和相應的標簽鏈接一起傳給中層
- 12 3324 346 89 這幾個文件夾是由中層擬定,在調用底層時,和組圖套圖鏈接地址一起傳給底層,底層從鏈接地址的html中得到了圖片地址,從中層得到文件夾路徑來創建文件夾,下載圖片并保存到該文件夾中
全部過程就是這樣,并且os模板里面,有一次性創建多層(>=1)文件夾的函數,這一點是能實現的,我這么實現,是防止空文件夾的存在,當有圖片時,才一起創建。如果想了解函數,你可以進入python命令行,用help()函數查看函數介紹--
本地圖片保存框架圖示,文件夾是手工建的,利用tree命令行打印并截圖
-
第二步:
源碼路徑,這個都是靠人腦分析,找好后,順序暫定,介紹下re模塊和一個簡單的匹配法則
.*?:匹配任意字符,非貪婪模式,如re123re0re456re,則(re.*?re)匹配re123re和re456re
.*:匹配任意字符,貪婪模式,如re123re0re456re,則(re.*re)匹配re123re0re456re
():返回括號內的匹配到的字符,如(re.*re)
這里呢,只需要熟悉和使用這個規則就可以了,其余的不做介紹
正則表達式可以在實驗樓正則表達式課程深入學習
-
第三步:
圖片下載保存,這里涉及os的一些函數
os.path.exists(文件路徑),檢測該文件路徑是否存在
os.mknod(文件),創建該文件,上一級目錄必須存在
os.mkdirs(文件),創建文件,上一級目錄如果不存在則一同創建
進入python操作界面,help(os),會顯示所有函數名及介紹,這里只做了簡單介紹
有這些就夠了,os模塊,基本也就是在圖片下載時需要
-
第四步:
網絡問題很重要,爬蟲速度是爬蟲里面核心,那網絡就是核心的核心
- 這個問題的錯誤在這里是不應該這么早出現的,但是警告會一開始就出現,如果等它報錯停止運行的問題出現的時候再解除,這實在并不是一個好決策
- 這個問題的優化,可以直接將爬蟲進化,或者說是‘腿的個數’翻了個倍。簡單描述下這個問題:在前期,一個圖片的大小也就200k~500k的樣子,也就2秒左右速度很快,但是網絡延遲能達到10秒甚至更高,所以你的帶寬利用率也就是10%不到,這是前期警告。
- 在網絡不穩定或網絡擁堵的情況下,一旦urllib2這個模塊鏈接超時未響應,程序會等待然后就是錯誤并終端程序的運行,這就是異常報錯,所以在這個項目的第一節課,就應該解決這個大隱患的小Bug.
-
第五步:既然網絡問題提出來了,那就補上相應的解決方法:
python基礎中,有異常檢測try...except,使用urllib2.open(),補抓urllib2.URLError異常,單獨置于一個函數中,當不成功時返回空字符串,通知調用函數繼續調用該函數
def loadurl(url):
try:
conn = urllib2.urlopen(url, timeout=5)
html = conn.read()
return html
except urllib2.URLError:
errorReport.errorLoadUrl(url)
return ''
except Exception:
print("unkown exception in conn.read()")
return ''
同樣的,保存圖片到本地,也需要進行超時檢測,以防報錯
-
第六步:補充說明,在這個后期,我也添上了“改進爬蟲優化網路速率提高爬蟲速度的多線程模式”,會以一節課程的形式單獨補充,不作為本課的核心課程,作為拓展課程。
四、本項目層次結構介紹

五、組圖下載
這節需要介紹的基礎知識,大概就是這些,下節的主要內容是圖片下載和url鏈接問題
Python3教程、項目網站--傳送門