python爬圖指南

銀杏葉子

我小時候曾在《科學(xué)美國人》上拜讀過一篇文章,文中對比了地球上各種不同物種的移動速率枢纠,比如熊、猩猩字逗、浣熊京郑、鳥類、魚類等——當然還有人類——計算它們每移動一公里消耗的熱量葫掉,最后禿鷲贏了些举,它的移動效率最高。作為萬物之靈的人類俭厚,排在倒數(shù)第幾位户魏。但是雜志特地測量了人類騎自行車的速率。結(jié)果把禿鷲遠遠甩在了身后挪挤,在排名上遙遙領(lǐng)先叼丑。這篇文章給我留下了深刻的印象,人類擅長發(fā)明工具扛门,工具賦予我們奇妙的能力鸠信。 蘋果以前有一條廣告:計算機是頭腦的自行車 ,我徹頭徹尾地堅信如果將來有人回顧人類歷史论寨,計算機將是人類最偉大的發(fā)明星立。

----Steve Jobs(對,就是喬布斯說的葬凳,你沒看錯4麓埂!)

那么火焰,正事來了劲装,如何高效看圖(別問我看什么圖)。

下面的內(nèi)容就是昌简,當我們有了一定的python基礎(chǔ)占业,如何寫這樣的一個宅男爬蟲(也就是實現(xiàn)打開網(wǎng)頁,尋找網(wǎng)頁中所有存有網(wǎng)頁鏈接的圖片江场,然后download圖片纺酸,并且保存在我們指定的文件夾中)。

在我的爬蟲中用到了re,os,threading,requests,time這幾個模塊址否,其中我使用request模塊餐蔬,替代了官方的urllib2碎紊,為毛用requests 不用urllib2,那是因為request的官方文檔中的這句話迷住了我:"Requests is the only Non-GMO HTTP library for Python, safe for human consumption."樊诺,嘎嘎仗考。

下面正式說思路:我們平時瀏覽網(wǎng)頁,都是在瀏覽器中輸入網(wǎng)址词爬,然后等待網(wǎng)站返回數(shù)據(jù)秃嗜,瀏覽器將網(wǎng)頁加載顯示出來。在這個過程中顿膨,主要是如下幾步:

  1. 瀏覽器向目標網(wǎng)站服務(wù)器發(fā)送請求锅锨,
  2. 目標服務(wù)器接受請求,
  3. 目標服務(wù)器發(fā)送響應(yīng)數(shù)據(jù)到瀏覽器恋沃。
  4. 瀏覽器再將獲取的數(shù)據(jù)解析必搞,形成你所看到的網(wǎng)站(要想更詳細的了解整個過程參見書: 計算機網(wǎng)絡(luò)(自頂向下法))
    目標服務(wù)器的響應(yīng)數(shù)據(jù)應(yīng)該長這個樣子(有點丑,是吧囊咏,哈哈):
<head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a  class="sister" id="link1">Elsie</a>
<a  class="sister" id="link2">Lacie</a>
<a  class="sister" id="link3">Tillie</a>;and they lived at the bottom of a well.
</p>
<p class="story">...</p>

這些標題通常有特殊含義:例如<title></title>表示文章標題恕洲,<a></a>表示鏈接,<img href = "......" />表示圖片鏈接梅割,我們就要獲取<img>href參數(shù)的數(shù)據(jù)霜第,這里儲存著我們需要獲取的圖片鏈接地址。然后再打開這個鏈接户辞,獲取里面的圖片數(shù)據(jù)保存就大功告成了泌类。

steps (只描述實現(xiàn)思路,代碼起描述作用!5琢恰D┦摹)

靜覓爬蟲系列教程(不錯的爬蟲教程)
下面按步驟介紹實現(xiàn)思路,當你實現(xiàn)時书蚪,應(yīng)該各個功能封裝成函數(shù),或者封裝成類迅栅,并且加入異常監(jiān)測殊校,以保證代碼運行的穩(wěn)定性,并且將程序中出現(xiàn)的錯誤記入寫入log读存,方便以后查看为流。

  1. 調(diào)用類似下面的代碼,獲取我們所需的網(wǎng)站內(nèi)容(也就是HTML文本,CSS樣式表让簿,JavaScript):
import requests
web = requests.get('http://www.baidu.com')
print web.text```

2. 編寫正則表達式敬察,以某種特定格式匹配我們需要獲取的內(nèi)容,然后將獲取內(nèi)容保存:

import request
import re
page = 1
url = 'http://www.qiushibaike.com/hot/page/' + str(page)
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'

有些服務(wù)器會對請求進行驗證尔当,加入headers裝作我是好人

headers = { 'User-Agent' : user_agent }

獲取目標站的Http代碼

web = requests.get(url,headers=headers)

根據(jù)目標站的Http代碼莲祸,找到我們要獲取的內(nèi)容格式特點蹂安,書寫正則,并測試

pattern = re.compile('<div.?author">.?<a.?<img.?>(.?)</a>.?<div.?'+
'content">(.
?).?</div>(.?)<div class="stats.?class="number">(.?)</i>',re.S)

所有的查找匹配結(jié)果都會儲存在imgurl這個列表中

imgurl = re.findall(pattern,web.content)


3. 既然我們成功獲取了要匹配的數(shù)據(jù)(我假設(shè)是圖片鏈接)锐帜,那么就可以打開圖片鏈接進行處理

import request
import re
import os
page = 1
url = 'http://www.qiushibaike.com/hot/page/' + str(page)
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'

有些服務(wù)器會對請求進行驗證田盈,加入headers裝作我是好人

headers = { 'User-Agent' : user_agent }

獲取目標站的Http代碼

web = requests.get(url,headers=headers)

根據(jù)目標站的Http代碼,找到我們要獲取的內(nèi)容格式特點缴阎,書寫正則允瞧,并測試

pattern = re.compile('<div.?author">.?<a.?<img.?>(.?)</a>.?<div.?'+
'content">(.
?).?</div>(.?)<div class="stats.?class="number">(.?)</i>',re.S)

所有的查找匹配結(jié)果都會儲存在imgurl這個列表中

imgurl = re.findall(pattern,web.content)

創(chuàng)建要保存的文件夾

os.mkdir('/home/picture')
for item in imgurl:
imgdata = requests.get(item,headers=headers)
picorder = picorder + 1
f = open('/home/picture/'+str(picorder),'rw')
f.write()
f.flush()
f.close()


4. 當上面所有的都完成之后,你良好的運行一陣蛮拔,是否覺得下載圖片太慢述暂,那么下面我們再加入多線程
>**CPython**實現(xiàn)細節(jié):在Cpython,由于全局解釋器鎖(Global interpreter Lock GIL)建炫,每次只能有一個線程可以 執(zhí)行Python 代碼(即使某些以效率為導(dǎo)向的庫(performance-oriented libraries)可能克服這些限制)畦韭。如果你希望你的應(yīng)用更好的利用電腦的多核資源。建議你使用**multiprocessing
** 或者**concurrent.futurres.ProcessPollExector
**模塊踱卵。然而多線程仍然是適當?shù)哪K廊驼,當你使用多IO并行任務(wù)時(multiple I/O - bound tasks simultaneously)

import request
import re
import os
page = 1
url = 'http://www.qiushibaike.com/hot/page/' + str(page)
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'

有些服務(wù)器會對請求進行驗證,加入headers裝作我是好人

headers = { 'User-Agent' : user_agent }

獲取目標站的Http代碼

web = requests.get(url,headers=headers)

根據(jù)目標站的Http代碼惋砂,找到我們要獲取的內(nèi)容格式特點妒挎,書寫正則,并測試

pattern = re.compile('<div.?author">.?<a.?<img.?>(.?)</a>.?<div.?'+
'content">(.
?).?</div>(.?)<div class="stats.?class="number">(.?)</i>',re.S)

所有的查找匹配結(jié)果都會儲存在imgurl這個列表中

imgurl = re.findall(pattern,web.content)

創(chuàng)建要保存的文件夾

os.mkdir('/home/picture')
picorder = picorder +1

當要下載內(nèi)容不空時西饵,開啟4個下載線程

while items:
if threading.activeCount()<5:
a = threading.Thread(target=downfunc,args=(items.pop(),picoder))
a.start()

定義一個下載函數(shù)

def downfunc(url,order)
imgdata = requests.get(url,headers=headers)
f = open('/home/picture/'+str(order),'rw')
f.write()
f.flush()
f.close()


整體代碼思路就向上面類似酝掩,不過自己實現(xiàn)要學(xué)習(xí)**```request,re,threading,os```**這幾個庫,關(guān)于匹配還可以引入**```beautifulsoup```** 或者**```xpath```**更方便快捷的解析```HTML```文本眷柔。革命尚未成功期虾,同志仍需努力!Q敝觥O獍!>掀馈茂蚓!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市剃幌,隨后出現(xiàn)的幾起案子聋涨,更是在濱河造成了極大的恐慌,老刑警劉巖负乡,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件牍白,死亡現(xiàn)場離奇詭異,居然都是意外死亡抖棘,警方通過查閱死者的電腦和手機茂腥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門狸涌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人础芍,你說我怎么就攤上這事杈抢。” “怎么了仑性?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵惶楼,是天一觀的道長。 經(jīng)常有香客問我诊杆,道長歼捐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任晨汹,我火速辦了婚禮豹储,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘淘这。我一直安慰自己剥扣,他們只是感情好,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布铝穷。 她就那樣靜靜地躺著钠怯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪曙聂。 梳的紋絲不亂的頭發(fā)上晦炊,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天,我揣著相機與錄音宁脊,去河邊找鬼断国。 笑死,一個胖子當著我的面吹牛榆苞,可吹牛的內(nèi)容都是我干的稳衬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼坐漏,長吁一口氣:“原來是場噩夢啊……” “哼宋彼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起仙畦,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎音婶,沒想到半個月后慨畸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡衣式,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年寸士,在試婚紗的時候發(fā)現(xiàn)自己被綠了檐什。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡弱卡,死狀恐怖乃正,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情婶博,我是刑警寧澤瓮具,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站凡人,受9級特大地震影響名党,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜挠轴,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一传睹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧岸晦,春花似錦欧啤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至碧绞,卻和暖如春府框,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背讥邻。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工迫靖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人兴使。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓系宜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親发魄。 傳聞我的和親對象是個殘疾皇子盹牧,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)励幼,斷路器汰寓,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 聲明:本文講解的實戰(zhàn)內(nèi)容,均僅用于學(xué)習(xí)交流苹粟,請勿用于任何商業(yè)用途有滑! 一、前言 強烈建議:請在電腦的陪同下嵌削,閱讀本文...
    Bruce_Szh閱讀 12,707評論 6 28
  • 1 前言 作為一名合格的數(shù)據(jù)分析師毛好,其完整的技術(shù)知識體系必須貫穿數(shù)據(jù)獲取望艺、數(shù)據(jù)存儲、數(shù)據(jù)提取肌访、數(shù)據(jù)分析找默、數(shù)據(jù)挖掘、...
    whenif閱讀 18,073評論 45 523
  • 文/ 陳皓 至今吼驶,在家里的衣柜里惩激,還珍藏著我兵之初的有些褪色的軍用挎包。它時刻會提醒我旨剥,在從軍路上要敢于擔(dān)當咧欣、...
    沂蒙文學(xué)閱讀 2,501評論 5 9
  • 人似乎就是這般不公,用自己個人的目光來判斷一個人的好壞轨帜,并就此劃分喜惡魄咕,極端而尖銳,然后就此形成一個社交圈蚌父。 每一...
    酉它閱讀 151評論 2 0