網(wǎng)絡(luò)蜘蛛的基本素養(yǎng)(python爬蟲入門篇:介紹和原生庫(kù))

大部分爬蟲教材會(huì)把網(wǎng)絡(luò)爬蟲比作一只蜘蛛蝙泼,而蜘蛛網(wǎng)則是我們的網(wǎng)絡(luò),這只蜘蛛會(huì)把觸手伸向不同的地方裆装,從而獲取網(wǎng)絡(luò)上的內(nèi)容踱承。

事實(shí)上,我認(rèn)為一個(gè)好的爬蟲哨免,或者是蜘蛛茎活,應(yīng)當(dāng)具備以下素質(zhì):

  • 不勤勞的蜘蛛不是一只好爬蟲

這是作為一只存活在互聯(lián)網(wǎng)這張大網(wǎng)上的蜘蛛的基本素養(yǎng)。所謂勤勞琢唾,就是能夠完成自己的基本使命(爬取數(shù)據(jù)), 孜孜不倦载荔,任勞任怨

  • 不機(jī)靈的蜘蛛死的早

試想一下,蜘蛛在自己的八卦陣(網(wǎng)絡(luò))中迷失了方向采桃,那可能只剩下死掉了懒熙,所以作為蜘蛛丘损,除了要勤勞外,還需要機(jī)靈工扎,具體描述就是:不迷失方向(爬取正確的url)徘钥、 遇到困難不退縮(能各種網(wǎng)絡(luò)異常)不干不必要的工作(避免重復(fù))

  • 不嚴(yán)謹(jǐn)?shù)闹┲肱軘嗤纫矝]用

盡管我們的蜘蛛已經(jīng)聰明又勤勞了肢娘,但是如果粗心大意不嚴(yán)謹(jǐn)呈础,大部分情況下爬了好久好久還是一點(diǎn)食物都吃不到,原因就是不嚴(yán)謹(jǐn)橱健,可能找到了過期的而钞、不能吃的食物(數(shù)據(jù)分析不合理)

我們了解了一只網(wǎng)絡(luò)蜘蛛的基本素養(yǎng),接下來我們就開始學(xué)習(xí)它吧:

爬蟲原理

參見上面網(wǎng)絡(luò)蜘蛛的基本素養(yǎng)拘荡,我們大概已經(jīng)知道了爬蟲需要做的事情臼节,無非就是如下幾個(gè)階段:

  1. 確定目標(biāo)(url),也就是得到需要獲取內(nèi)容的url
  2. 偽裝接近(驗(yàn)證機(jī)制)珊皿,也就是要騙過目標(biāo)的防御系統(tǒng)网缝,如偽裝成瀏覽器
  3. 發(fā)送請(qǐng)求(request),獲取信任之后蟋定,我們就可以大膽的發(fā)送請(qǐng)求到目的地了
  4. 捕獲響應(yīng)(response)途凫,當(dāng)目標(biāo)有了反饋以后捕獲響應(yīng)的內(nèi)容
  5. 獲取數(shù)據(jù)(getdata),拿到響應(yīng)的數(shù)據(jù)之后溢吻,需要對(duì)數(shù)據(jù)進(jìn)行分析和篩選
  6. 重復(fù)1-5 (repeat), 確定新目標(biāo)果元,然后繼續(xù)做一名勤勞促王、機(jī)靈嚴(yán)謹(jǐn)?shù)闹┲?/li>

用python來講,就是通過代碼實(shí)現(xiàn)對(duì)目標(biāo)地址的訪問(走完http request和response的流程而晒,獲取response之后再做數(shù)據(jù)篩選)

獲取內(nèi)容

python中的urllib和urllib2兩個(gè)原生庫(kù)提供了我們發(fā)送http request和獲取 http response的全部實(shí)現(xiàn)蝇狼。通過使用這兩個(gè)庫(kù),可以很簡(jiǎn)單的獲取網(wǎng)絡(luò)內(nèi)容倡怎,大致分為如下幾步迅耘。

確定目標(biāo)(url)

也就是確定我們要爬區(qū)的頁面的url

偽裝接近

很多站點(diǎn)都對(duì)用戶訪問做了一些驗(yàn)證,比如通過查看headers內(nèi)的信息监署,來確定訪問來源

HTTP Headers是HTTP請(qǐng)求和相應(yīng)的核心颤专,它承載了關(guān)于用戶端流覽器,請(qǐng)求頁面钠乏,伺服器等相關(guān)的資訊栖秕。具體關(guān)于headers的詳細(xì)信息參見 什么是HTTP Headers

比如,大部分網(wǎng)站會(huì)驗(yàn)證Headers內(nèi)的 User-Agent 來確定請(qǐng)求是不是從瀏覽器發(fā)出晓避,我們則可以偽造一個(gè)user-agent封裝成headers(headers在python內(nèi)以字典的結(jié)構(gòu)表現(xiàn))

發(fā)送請(qǐng)求

發(fā)送請(qǐng)求之前簇捍,我們需要和headers一樣只壳,創(chuàng)建一個(gè)請(qǐng)求request

如果是帶參數(shù)的請(qǐng)求,我們還需要?jiǎng)?chuàng)造參數(shù)data

urllib2內(nèi)可以直接調(diào)用 urllib2.Request(url, data, headers)方法暑塑,這個(gè)方法返回一個(gè)request

捕獲響應(yīng)

當(dāng)我們準(zhǔn)備好了request(帶數(shù)據(jù)或者不帶數(shù)據(jù))之后吼句,即可發(fā)送請(qǐng)求到頁面,然后會(huì)得到一個(gè)response

urllib2內(nèi)可以使用 urllib2.urlopen(request, timeout)方法事格,該方法返回一個(gè)response惕艳; 要獲取response的內(nèi)容,則需要使用 response.read()方法

代碼示例(爬取 mm131首頁上的內(nèi)容):

# -*- encoding:utf-8 -*-
import urllib2                      #這是我們需要使用的工具
url = "http://www.mm131.com"        #這是我們的目的地址

#創(chuàng)建一個(gè)headers 內(nèi)含user-agent偽裝成一個(gè)mozilla4.0瀏覽器
headers = {'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'}

#創(chuàng)建一個(gè)request, 傳入url data(沒有參數(shù)的訪問則為None) 和 headers
request = urllib2.Request(url,data=None, headers=headers)

#獲取響應(yīng)response分蓖,發(fā)送request尔艇,設(shè)置超時(shí)時(shí)間為5s
response = urllib2.urlopen(request, timeout = 5)

#讀取response的內(nèi)容,同時(shí)將gb2312(網(wǎng)頁原編碼)轉(zhuǎn)換為utf-8,ignore為忽略非法字符
content = response.read().decode('gb2312', 'ignore')

print content

數(shù)據(jù)分析

通過 urllib2可以輕松的獲取目標(biāo)頁面內(nèi)容,那么最讓人頭疼的事情來了么鹤,那就是數(shù)據(jù)分析(篩選)

這里我們暫時(shí)只使用最笨的一種方法终娃,那就是在本地進(jìn)行字符串的匹配來獲取想要的內(nèi)容,這里則需要使用到正則表達(dá)式蒸甜,關(guān)于正則表達(dá)式可以參考《python核心編程 第三版》的第一章棠耕,也可以觀看imooc的視頻python正則表達(dá)式,利用兩個(gè)小時(shí)的時(shí)間對(duì)正則表達(dá)式有一個(gè)全面的了解。

通過分析源文件找到適合的匹配規(guī)則

比如柠新,上面得到的內(nèi)容窍荧,我們可以對(duì)美女圖片的代碼進(jìn)行分析,并作出匹配:

示例代碼(對(duì)上面獲得的content進(jìn)行正則匹配恨憎,得到其中的圖片):

import re
pattern = re.compile('<li class="column-li".*?src="(.*?)".*?alt="(.*?)"', re.S)
items = re.findall(pattern,content)

上面代碼中的 compile 表示匹配規(guī)則蕊退, 其中.?可以理解為忽略這期間的內(nèi)容,我們從<li class="column-li" 開始匹配憔恳,忽略中間的內(nèi)容直到 src="出現(xiàn)瓤荔,然后獲取中間的內(nèi)容(.?) 帶上括號(hào)表示這些內(nèi)容在后面fiandall中會(huì)被保存,以此類推钥组,我們第二個(gè)(.*?)代表的則是alt內(nèi)的內(nèi)容输硝,也就是圖片的描述。

re.findall(compile, content)反回一個(gè)集合類型程梦,包含頁面中所有符合匹配規(guī)則的元素的集合点把,也就是所有美女圖片的地址和描述。

可以使用迭代器屿附,訪問他們:

for item in items:
    print item[0]  #item[0]也就是我們匹配到的第一個(gè)元素  src
    print item[1]  #item[0]也就是我們匹配到的第二個(gè)元素  alt

數(shù)據(jù)持久化

數(shù)據(jù)持久化的方式是多樣的
我們可以使用數(shù)據(jù)庫(kù)來存儲(chǔ)郎逃,對(duì)于大型數(shù)據(jù)分析,我們還可以使用緩存工具 memchche 或者 redis將數(shù)據(jù)快速保存挺份,之后持久化到數(shù)據(jù)庫(kù)中衣厘,甚至還有數(shù)據(jù)集群(再扯久沒邊了,參考google 機(jī)器人深度學(xué)習(xí))

其次我們還可以保存內(nèi)容到本地文件,比較流行的是直接寫入到某一個(gè)服務(wù)器的web目錄(以html為主)影暴,這樣數(shù)據(jù)爬取下來后错邦,還可以通過web直接訪問。

這里型宙,我們主要是保存圖片撬呢,因此直接將數(shù)據(jù)保存到本地,而且保存成圖片格式妆兑。urllib中(注意時(shí)urllib而非urllib2)提供了非常方便的方法魂拦。具體參見代碼:

for item in items:
    urllib.urlretrieve(item[0],item[1]+'.jpg')

urllib.urlretrieve(url, local, Schedule) 函數(shù)可以從url下載內(nèi)容保存到本地路徑local中,其中還可以加入第三個(gè)參數(shù) (回調(diào)函數(shù)搁嗓,主要實(shí)現(xiàn)類似于進(jìn)度條的功能)芯勘,具體函數(shù)解析請(qǐng)參考 現(xiàn)代魔法學(xué)院 urllib解析

本文示例代碼 完整示范

# -*- encoding:utf-8 -*-
import urllib2                      #這是我們需要使用的工具
import urllib                       #注意urllib 和 urllib2并不同
import re
import sys
reload(sys)
sys.setdefaultencoding("utf-8")    #在這里統(tǒng)一文件的編碼為utf-8

url = "http://www.mm131.com"        #這是我們的目的地址

try:
    #創(chuàng)建一個(gè)headers 內(nèi)含user-agent偽裝成一個(gè)mozilla4.0瀏覽器
    headers = {'User-Agent': 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'}

    #創(chuàng)建一個(gè)request, 傳入url data(沒有參數(shù)的訪問則為None) 和 headers
    request = urllib2.Request(url,data=None, headers=headers)

    #獲取響應(yīng)response,發(fā)送request腺逛,設(shè)置超時(shí)時(shí)間為5s
    response = urllib2.urlopen(request)

    #讀取response的內(nèi)容
    content = response.read().decode('gb2312','ignore')

    pattern = re.compile('<li class="column-li".*?src="(.*?)".*?alt="(.*?)"', re.S)
    items = re.findall(pattern,content)

    for item in items:
        print '開始下載圖片:  %s' % item[1]
        urllib.urlretrieve(item[0],item[1]+'.jpg')
except Exception, e:
    print '網(wǎng)絡(luò)錯(cuò)誤(超時(shí)或者其他)'
    raise e
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末荷愕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子棍矛,更是在濱河造成了極大的恐慌安疗,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件够委,死亡現(xiàn)場(chǎng)離奇詭異荐类,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)茁帽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門玉罐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人潘拨,你說我怎么就攤上這事厌小。” “怎么了战秋?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)讨韭。 經(jīng)常有香客問我脂信,道長(zhǎng),這世上最難降的妖魔是什么透硝? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任狰闪,我火速辦了婚禮,結(jié)果婚禮上濒生,老公的妹妹穿的比我還像新娘埋泵。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布丽声。 她就那樣靜靜地躺著礁蔗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪雁社。 梳的紋絲不亂的頭發(fā)上浴井,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音霉撵,去河邊找鬼磺浙。 笑死,一個(gè)胖子當(dāng)著我的面吹牛徒坡,可吹牛的內(nèi)容都是我干的撕氧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼喇完,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼伦泥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起何暮,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤奄喂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后海洼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體跨新,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年坏逢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了域帐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡是整,死狀恐怖肖揣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情浮入,我是刑警寧澤龙优,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站事秀,受9級(jí)特大地震影響彤断,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜易迹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一宰衙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧睹欲,春花似錦供炼、人聲如沸一屋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冀墨。三九已至,卻和暖如春先嬉,著一層夾襖步出監(jiān)牢的瞬間轧苫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工疫蔓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留含懊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓衅胀,卻偏偏與公主長(zhǎng)得像岔乔,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子滚躯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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

  • Python學(xué)習(xí)網(wǎng)絡(luò)爬蟲主要分3個(gè)大的版塊:抓取雏门,分析,存儲(chǔ) 另外掸掏,比較常用的爬蟲框架Scrapy茁影,這里最后也詳細(xì)...
    楚江數(shù)據(jù)閱讀 1,469評(píng)論 0 6
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)丧凤,斷路器募闲,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • 一、概述 urllib2是Python的一個(gè)針對(duì)URLs的庫(kù)愿待。他以u(píng)rlopen函數(shù)的形式提供了一個(gè)非常簡(jiǎn)單的...
    MiracleJQ閱讀 1,488評(píng)論 0 5
  • 一浩螺、網(wǎng)絡(luò)爬蟲的定義 網(wǎng)絡(luò)爬蟲,即Web Spider仍侥,是一個(gè)很形象的名字要出。把互聯(lián)網(wǎng)比喻成一個(gè)蜘蛛網(wǎng),那么Spide...
    隨風(fēng)化作雨閱讀 1,092評(píng)論 0 0
  • 一.時(shí)間: 2017年3月1日-2017年5月31日 二.目標(biāo): 1.為公司在名錶銷售农渊,個(gè)人訂製珠寶銷售創(chuàng)造患蹂,月收...
    andychan1106閱讀 273評(píng)論 0 4