知識(shí)儲(chǔ)備描焰,簡(jiǎn)單爬蟲的必知必會(huì),【核心】
一栅螟、實(shí)驗(yàn)說(shuō)明
1. 環(huán)境登錄
無(wú)需密碼自動(dòng)登錄荆秦,系統(tǒng)用戶名shiyanlou
2. 環(huán)境介紹
本實(shí)驗(yàn)環(huán)境采用帶桌面的Ubuntu Linux環(huán)境,實(shí)驗(yàn)中會(huì)用到桌面上的程序:
- xfce終端:Linux命令行終端力图,打開后會(huì)進(jìn)入 shell 環(huán)境步绸,可以使用Linux命令
- Firefox:瀏覽器,可以用在需要前端界面的課程里搪哪,只需要打開環(huán)境里寫的HTML/JS頁(yè)面即可
- GVim:非常好用的編輯器靡努,最簡(jiǎn)單的用法可以參考課程Vim編輯器
3. 環(huán)境使用
使用GVim編輯器輸入實(shí)驗(yàn)所需的代碼及文件,使用 xfce終端運(yùn)行所需命令進(jìn)行操作晓折。
實(shí)驗(yàn)報(bào)告可以在個(gè)人主頁(yè)中查看惑朦,其中含有每次實(shí)驗(yàn)的截圖及筆記,以及每次實(shí)驗(yàn)的有效學(xué)習(xí)時(shí)間(指的是在實(shí)驗(yàn)桌面內(nèi)操作的時(shí)間漓概,如果沒(méi)有操作漾月,系統(tǒng)會(huì)記錄為發(fā)呆時(shí)間)。這些都是您學(xué)習(xí)的真實(shí)性證明胃珍。
實(shí)驗(yàn)樓虛擬機(jī)梁肿,自帶了python2.X和python3.X版本蜓陌,本課程基于 python2
二、課程介紹
一門編程語(yǔ)言的學(xué)習(xí)吩蔑,實(shí)踐中學(xué)習(xí)的效果肯定是最好的钮热,我當(dāng)初學(xué)python就是沖著爬蟲來(lái)的,所以這次的課程目的是學(xué)會(huì)“炮制”簡(jiǎn)單的爬蟲
本次課程烛芬,主要是介紹根據(jù)給定的url隧期,下載網(wǎng)頁(yè)中指定的模特圖片,python版本為2.7(3.0也可以運(yùn)行赘娄,print需要修改下)仆潮,使用的模塊有os、urllib2遣臼、re性置,單線程爬蟲
這節(jié)課程基本沒(méi)有代碼全是原理,但是原理很重要揍堰,我會(huì)細(xì)講鹏浅,所以本節(jié)課程的文字內(nèi)容,請(qǐng)細(xì)看个榕。后面的課程是建立在這節(jié)課程之上來(lái)完成的篡石,而且課程之間是上下級(jí)調(diào)用關(guān)系,層次結(jié)構(gòu)很明顯西采。
-
介紹下圖片來(lái)源--妹子圖凰萨,這個(gè)網(wǎng)站的整個(gè)爬取是最終目的,這節(jié)主要是對(duì)單個(gè)頁(yè)面內(nèi)的圖片械馆,進(jìn)行爬取胖眷,例如這個(gè) 誰(shuí)是這長(zhǎng)發(fā)女孩心中的白馬王子
,供上第一張圖片手下我的膝蓋
三霹崎、課題探索
-
第一步:
套圖頁(yè)面:這里呢珊搀,主要是搜索頁(yè)面中的模特圖片路徑,但是圖片都是img標(biāo)簽尾菇,不設(shè)計(jì)個(gè)簡(jiǎn)單匹配套路境析,還真難得到100%的精確度,先提供一個(gè)網(wǎng)頁(yè)派诬,大家試著找找劳淆,軟妹
標(biāo)簽所有單頁(yè):獲取該網(wǎng)頁(yè)中的所有套圖頁(yè)的鏈接(進(jìn)入套圖頁(yè)),也就是給定一個(gè)標(biāo)簽頁(yè)默赂,獲得這個(gè)頁(yè)面中顯示的所有套圖頁(yè)的鏈接沛鸵,如某一標(biāo)簽頁(yè)example[15](實(shí)際情況比這還多),則這個(gè)頁(yè)面中包含了15個(gè)套圖
標(biāo)簽所有頁(yè)面:一個(gè)標(biāo)簽不止一個(gè)頁(yè)面缆八,獲取該標(biāo)簽的所有頁(yè)曲掰,如tag1[35][10](實(shí)際情況比這還多)疾捍,標(biāo)簽tag1又35個(gè)頁(yè)面,每個(gè)頁(yè)面又包含了10個(gè)套圖頁(yè)面栏妖,就像一個(gè)二維數(shù)組乱豆。
-
頂級(jí)域名頁(yè)面:這里,包含了所有的標(biāo)簽以及它們的鏈接底哥,不過(guò)呢咙鞍,有重復(fù),這里很簡(jiǎn)單的做一個(gè)去重就可以了趾徽,如meizi[8](實(shí)際情況比這還多),說(shuō)明這個(gè)網(wǎng)站包含8個(gè)標(biāo)簽翰守,每個(gè)標(biāo)簽里面又有它自己所包含的鏈接孵奶。
圖的信息量還是蠻大的,如圖--
Xmind 最后提下圖片保存路徑問(wèn)題蜡峰,這個(gè)呢在中層和高層中需要了袁,底層還是不需要的,底層測(cè)試時(shí)湿颅,傳入文件夾路徑并保存該文件夾下载绿,但在中層中,路徑問(wèn)題還是挺嚴(yán)重的油航,因?yàn)槲覀冏罱K是啟動(dòng)高層崭庸,傳入一個(gè)最初的文件夾路徑,然后高層創(chuàng)建中層文件夾谊囚,并且在調(diào)用中層函數(shù)時(shí)怕享,將標(biāo)簽鏈接和對(duì)應(yīng)的文件夾路徑傳過(guò)去,中層調(diào)用底層也是一樣的镰踏,都需要傳過(guò)去文件夾路徑函筋。不過(guò)文件夾路徑傳過(guò)去,最后是由底層來(lái)創(chuàng)建奠伪,高層和中層是不創(chuàng)建的跌帐,路徑是虛的,由底層創(chuàng)建并保存圖片文件:
- meizi是由我們調(diào)用頂層時(shí)绊率,傳進(jìn)去文件夾谨敛,這個(gè)文件夾是真實(shí)存在的
- baobei nvshen mengmeizi 是頂層擬定的,在調(diào)用中層時(shí)即舌,和相應(yīng)的標(biāo)簽鏈接一起傳給中層
- 12 3324 346 89 這幾個(gè)文件夾是由中層擬定佣盒,在調(diào)用底層時(shí),和組圖套圖鏈接地址一起傳給底層顽聂,底層從鏈接地址的html中得到了圖片地址肥惭,從中層得到文件夾路徑來(lái)創(chuàng)建文件夾盯仪,下載圖片并保存到該文件夾中
全部過(guò)程就是這樣,并且os模板里面蜜葱,有一次性創(chuàng)建多層(>=1)文件夾的函數(shù)全景,這一點(diǎn)是能實(shí)現(xiàn)的,我這么實(shí)現(xiàn)牵囤,是防止空文件夾的存在爸黄,當(dāng)有圖片時(shí),才一起創(chuàng)建揭鳞。如果想了解函數(shù)炕贵,你可以進(jìn)入python命令行,用help()函數(shù)查看函數(shù)介紹--
本地圖片保存框架圖示野崇,文件夾是手工建的称开,利用tree命令行打印并截圖
-
第二步:
源碼路徑,這個(gè)都是靠人腦分析乓梨,找好后鳖轰,順序暫定,介紹下re模塊和一個(gè)簡(jiǎn)單的匹配法則
.*?:匹配任意字符扶镀,非貪婪模式蕴侣,如re123re0re456re,則(re.*?re)匹配re123re和re456re
.*:匹配任意字符臭觉,貪婪模式昆雀,如re123re0re456re,則(re.*re)匹配re123re0re456re
():返回括號(hào)內(nèi)的匹配到的字符胧谈,如(re.*re)
這里呢忆肾,只需要熟悉和使用這個(gè)規(guī)則就可以了,其余的不做介紹
正則表達(dá)式可以在實(shí)驗(yàn)樓正則表達(dá)式課程深入學(xué)習(xí)
-
第三步:
圖片下載保存菱肖,這里涉及os的一些函數(shù)
os.path.exists(文件路徑)客冈,檢測(cè)該文件路徑是否存在
os.mknod(文件),創(chuàng)建該文件稳强,上一級(jí)目錄必須存在
os.mkdirs(文件)场仲,創(chuàng)建文件,上一級(jí)目錄如果不存在則一同創(chuàng)建
進(jìn)入python操作界面退疫,help(os)渠缕,會(huì)顯示所有函數(shù)名及介紹,這里只做了簡(jiǎn)單介紹
有這些就夠了褒繁,os模塊亦鳞,基本也就是在圖片下載時(shí)需要
-
第四步:
網(wǎng)絡(luò)問(wèn)題很重要,爬蟲速度是爬蟲里面核心,那網(wǎng)絡(luò)就是核心的核心
- 這個(gè)問(wèn)題的錯(cuò)誤在這里是不應(yīng)該這么早出現(xiàn)的燕差,但是警告會(huì)一開始就出現(xiàn)遭笋,如果等它報(bào)錯(cuò)停止運(yùn)行的問(wèn)題出現(xiàn)的時(shí)候再解除,這實(shí)在并不是一個(gè)好決策
- 這個(gè)問(wèn)題的優(yōu)化徒探,可以直接將爬蟲進(jìn)化瓦呼,或者說(shuō)是‘腿的個(gè)數(shù)’翻了個(gè)倍夜只。簡(jiǎn)單描述下這個(gè)問(wèn)題:在前期勾习,一個(gè)圖片的大小也就200k~500k的樣子士袄,也就2秒左右速度很快凳忙,但是網(wǎng)絡(luò)延遲能達(dá)到10秒甚至更高,所以你的帶寬利用率也就是10%不到风瘦,這是前期警告火鼻。
- 在網(wǎng)絡(luò)不穩(wěn)定或網(wǎng)絡(luò)擁堵的情況下棱诱,一旦urllib2這個(gè)模塊鏈接超時(shí)未響應(yīng)稚字,程序會(huì)等待然后就是錯(cuò)誤并終端程序的運(yùn)行侦另,這就是異常報(bào)錯(cuò),所以在這個(gè)項(xiàng)目的第一節(jié)課尉共,就應(yīng)該解決這個(gè)大隱患的小Bug.
-
第五步:既然網(wǎng)絡(luò)問(wèn)題提出來(lái)了,那就補(bǔ)上相應(yīng)的解決方法:
python基礎(chǔ)中弃锐,有異常檢測(cè)try...except袄友,使用urllib2.open(),補(bǔ)抓urllib2.URLError異常霹菊,單獨(dú)置于一個(gè)函數(shù)中剧蚣,當(dāng)不成功時(shí)返回空字符串,通知調(diào)用函數(shù)繼續(xù)調(diào)用該函數(shù)
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 ''
同樣的旋廷,保存圖片到本地鸠按,也需要進(jìn)行超時(shí)檢測(cè),以防報(bào)錯(cuò)
-
第六步:補(bǔ)充說(shuō)明饶碘,在這個(gè)后期目尖,我也添上了“改進(jìn)爬蟲優(yōu)化網(wǎng)路速率提高爬蟲速度的多線程模式”,會(huì)以一節(jié)課程的形式單獨(dú)補(bǔ)充扎运,不作為本課的核心課程瑟曲,作為拓展課程。
四豪治、本項(xiàng)目層次結(jié)構(gòu)介紹

五洞拨、組圖下載
這節(jié)需要介紹的基礎(chǔ)知識(shí),大概就是這些负拟,下節(jié)的主要內(nèi)容是圖片下載和url鏈接問(wèn)題
Python3教程烦衣、項(xiàng)目網(wǎng)站--傳送門