大話爬蟲的基本套路


圖片

什么是爬蟲校镐?

網(wǎng)絡(luò)爬蟲也叫網(wǎng)絡(luò)蜘蛛衣厘,如果把互聯(lián)網(wǎng)比喻成一個(gè)蜘蛛網(wǎng)垦细,那么蜘蛛就是在網(wǎng)上爬來爬去的蜘蛛择镇,爬蟲程序通過請(qǐng)求url地址,根據(jù)響應(yīng)的內(nèi)容進(jìn)行解析采集數(shù)據(jù)括改,
比如:如果響應(yīng)內(nèi)容是html沐鼠,分析dom結(jié)構(gòu),進(jìn)行dom解析叹谁、或者正則匹配,如果響應(yīng)內(nèi)容是xml/json數(shù)據(jù)乘盖,就可以轉(zhuǎn)數(shù)據(jù)對(duì)象焰檩,然后對(duì)數(shù)據(jù)進(jìn)行解析。


有什么作用订框?

通過有效的爬蟲手段批量采集數(shù)據(jù)析苫,可以降低人工成本,提高有效數(shù)據(jù)量穿扳,給予運(yùn)營(yíng)/銷售的數(shù)據(jù)支撐衩侥,加快產(chǎn)品發(fā)展。


業(yè)界的情況

目前互聯(lián)網(wǎng)產(chǎn)品競(jìng)爭(zhēng)激烈矛物,業(yè)界大部分都會(huì)使用爬蟲技術(shù)對(duì)競(jìng)品產(chǎn)品的數(shù)據(jù)進(jìn)行挖掘茫死、采集、大數(shù)據(jù)分析履羞,這是必備手段峦萎,并且很多公司都設(shè)立了爬蟲工程師的崗位


合法性

爬蟲是利用程序進(jìn)行批量爬取網(wǎng)頁(yè)上的公開信息,也就是前端顯示的數(shù)據(jù)信息忆首。因?yàn)樾畔⑹峭耆_的爱榔,所以是合法的。其實(shí)就像瀏覽器一樣糙及,瀏覽器解析響應(yīng)內(nèi)容并渲染為頁(yè)面详幽,而爬蟲解析響應(yīng)內(nèi)容采集想要的數(shù)據(jù)進(jìn)行存儲(chǔ)。


反爬蟲

爬蟲很難完全的制止浸锨,道高一尺魔高一丈唇聘,這是一場(chǎng)沒有硝煙的戰(zhàn)爭(zhēng),碼農(nóng)VS碼農(nóng)
反爬蟲一些手段:

  • 合法檢測(cè):請(qǐng)求校驗(yàn)(useragent柱搜,referer雳灾,接口加簽名,等)
  • 小黑屋:IP/用戶限制請(qǐng)求頻率冯凹,或者直接攔截
  • 投毒:反爬蟲高境界可以不用攔截谎亩,攔截是一時(shí)的炒嘲,投毒返回虛假數(shù)據(jù),可以誤導(dǎo)競(jìng)品決策
  • ... ...

爬蟲基本套路

  • 基本流程
    • 目標(biāo)數(shù)據(jù)
    • 來源地址
    • 結(jié)構(gòu)分析
    • 實(shí)現(xiàn)構(gòu)思
    • 操刀編碼
  • 基本手段
    • 破解請(qǐng)求限制
      • 請(qǐng)求頭設(shè)置匈庭,如:useragant為有效客戶端
      • 控制請(qǐng)求頻率(根據(jù)實(shí)際情景)
      • IP代理
      • 簽名/加密參數(shù)從html/cookie/js分析
    • 破解登錄授權(quán)
      • 請(qǐng)求帶上用戶cookie信息
    • 破解驗(yàn)證碼
      • 簡(jiǎn)單的驗(yàn)證碼可以使用識(shí)圖讀驗(yàn)證碼第三方庫(kù)
  • 解析數(shù)據(jù)
    • HTML Dom解析
      • 正則匹配夫凸,通過的正則表達(dá)式來匹配想要爬取的數(shù)據(jù),如:有些數(shù)據(jù)不是在html 標(biāo)簽里阱持,而是在html的script 標(biāo)簽的js變量中
      • 使用第三方庫(kù)解析html dom夭拌,比較喜歡類jquery的庫(kù)
    • 數(shù)據(jù)字符串
      • 正則匹配(根據(jù)情景使用)
      • 轉(zhuǎn) JSON/XML 對(duì)象進(jìn)行解析

python爬蟲

  • python寫爬蟲的優(yōu)勢(shì)
    • python語(yǔ)法易學(xué),容易上手
    • 社區(qū)活躍衷咽,實(shí)現(xiàn)方案多可參考
    • 各種功能包豐富
    • 少量代碼即可完成強(qiáng)大功能
  • 涉及模塊包
    • 請(qǐng)求
      • urllib
      • urllib2
      • cookielib
    • 多線程
      • threading
    • 正則
      • re
    • json解析
      • json
    • html dom解析
      • pyquery
      • beautiful soup
    • 操作瀏覽器
      • selenium

實(shí)例解析

斗魚主播排行

  • 目標(biāo)數(shù)據(jù)
    • 獲取排行榜主播信息
  • 來源地址
  • 結(jié)構(gòu)分析
    • 通過抓包 [排行榜地址]鸽扁,[主播房間地址] (谷歌調(diào)試network/charles/fiddler)
      • 獲得排行數(shù)據(jù)接口:https://www.douyu.com/directory/rank_list/game
        • 參數(shù)確認(rèn)(去掉不必要參數(shù))
        • cookie確認(rèn)(去掉不必要cookie)
        • 模擬請(qǐng)求(charles/fiddler/postman)
      • 獲得主播房間信息數(shù)據(jù)
        • 發(fā)現(xiàn)$ROOM是主播房間信息,在頁(yè)面的script標(biāo)簽的js變量中镶骗,可使用正則工具寫表達(dá)式去匹配
  • 實(shí)現(xiàn)構(gòu)思
    • 通過請(qǐng)求 [主播排行接口] 獲取 [排行榜數(shù)據(jù)]
    • [排行榜數(shù)據(jù)] 中有主播房間號(hào)桶现,可以通過拼接獲得 [主播房間地址]
    • 請(qǐng)求 [主播房間地址] 可以獲得 [$ROOM信息] ,解析可以獲得主播房間信息
  • 操刀編碼

申明:此例子僅作為爬蟲學(xué)習(xí)DEMO鼎姊,并無其他利用


基于python實(shí)現(xiàn)爬蟲學(xué)習(xí)基礎(chǔ)demo

def douyu_rank(rankName, statType):
    '''
        斗魚主播排行數(shù)據(jù)抓取
        [數(shù)據(jù)地址](https://www.douyu.com/directory/rank_list/game)

        * `rankName` anchor(巨星主播榜),fans(主播粉絲榜),haoyou(土豪實(shí)力榜),user(主播壕友榜)
        * `statType` day(日),week(周),month(月)
    '''
    if not isinstance(rankName, ERankName):
        raise Exception("rankName 類型錯(cuò)誤骡和,必須是ERankName枚舉")
    if not isinstance(statType, EStatType):
        raise Exception("statType 類型錯(cuò)誤,必須是EStatType枚舉")

    rankName = '%sListData' % rankName.name
    statType = '%sListData' % statType.name
    # 請(qǐng)求獲取html源碼 
    rs = rq.get(
        "https://www.douyu.com/directory/rank_list/game",
        headers={'User-Agent': 'Mozilla/5.0'})
    # 正則解析出數(shù)據(jù)
    mt = re.search(r'rankListData\s+?=(.*?);', rs, re.S)
    if (not mt):
        print u"無法解析rankListData數(shù)據(jù)"
        return
    grps = mt.groups()
    # 數(shù)據(jù)轉(zhuǎn)json
    rankListDataStr = grps[0]
    rankListData = json.loads(rankListDataStr)
    dayList = rankListData[rankName][statType]
    # 修改排序
    dayList.sort(key=lambda k: (k.get('id', 0)), reverse=False)
    return dayList


def douyu_room(romm_id):
    '''
        主播房間信息解析
        [數(shù)據(jù)地址](https://www.douyu.com/xxx)
        'romm_id' 主播房號(hào)
    '''
    rs = rq.get(
        ("https://www.douyu.com/%s" % romm_id),
        headers={'User-Agent': 'Mozilla/5.0'})
    mt = re.search(r'\$ROOM\s+?=\s+?({.*?});', rs, re.S)
    if (not mt):
        print u"無法解析ROOM數(shù)據(jù)"
        return
    grps = mt.groups()
    roomDataStr = grps[0]
    roomData = json.loads(roomDataStr)
    return roomData
    
def run():
    '''
        測(cè)試爬蟲
    '''
    datas = douyu_rank(ERankName.anchor, EStatType.month)
    print '\r\n主播排行榜:'
    for item in datas:
        room_id = item['room_id']
        roomData = douyu_room(room_id)
        rommName = None
        if roomData is not None:
            rommName = roomData['room_name']
        roomInfo = (u'房間(%s):%s' % (item['room_id'], rommName))
        print item['id'], item[
            'nickname'], roomInfo, '[' + item['catagory'] + ']'


run()


運(yùn)行結(jié)果:

主播排行榜:

無法解析ROOM數(shù)據(jù)
1 馮提莫 房間(71017):None [英雄聯(lián)盟]
2 阿冷aleng丶 房間(2371789):又是我最喜歡的阿冷ktv時(shí)間~ [英雄聯(lián)盟]
3 勝哥002 房間(414818):勝哥:南通的雨下的我好心累相寇。 [DNF]
4 White55開解說 房間(138286):盧本偉五五開 每天都要很強(qiáng) [英雄聯(lián)盟]
5 東北大鵪鶉 房間(96291):東北大鵪鶉 宇宙第一寒冰 相聲藝術(shù)家慰于! [英雄聯(lián)盟]
6 老實(shí)敦厚的笑笑 房間(154537):德云色 給兄弟們賠個(gè)不是 [英雄聯(lián)盟]
7 劉飛兒faye 房間(265438):劉飛兒  月底吃雞 大吉大利 [絕地求生]
8 pigff 房間(24422):【PIGFF】借基地直播,沒OW [守望先鋒]
9 云彩上的翅膀 房間(28101):翅:還是抽天空套刺激唤衫! [DNF]
10 yyfyyf 房間(58428):無盡的9月婆赠,殺 [DOTA2]

# 馮提莫 房間做周年主題,解析會(huì)有問題

Demo源碼地址


=>我的原文地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末佳励,一起剝皮案震驚了整個(gè)濱河市页藻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌植兰,老刑警劉巖份帐,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異楣导,居然都是意外死亡废境,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門筒繁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來噩凹,“玉大人,你說我怎么就攤上這事毡咏⊥匝纾” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵呕缭,是天一觀的道長(zhǎng)堵泽。 經(jīng)常有香客問我修己,道長(zhǎng),這世上最難降的妖魔是什么迎罗? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任睬愤,我火速辦了婚禮,結(jié)果婚禮上纹安,老公的妹妹穿的比我還像新娘尤辱。我一直安慰自己,他們只是感情好厢岂,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布光督。 她就那樣靜靜地躺著,像睡著了一般塔粒。 火紅的嫁衣襯著肌膚如雪结借。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天窗怒,我揣著相機(jī)與錄音,去河邊找鬼蓄拣。 笑死扬虚,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的球恤。 我是一名探鬼主播辜昵,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼咽斧!你這毒婦竟也來了堪置?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤张惹,失蹤者是張志新(化名)和其女友劉穎舀锨,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宛逗,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坎匿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了雷激。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片替蔬。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖屎暇,靈堂內(nèi)的尸體忽然破棺而出承桥,到底是詐尸還是另有隱情,我是刑警寧澤根悼,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布凶异,位于F島的核電站蜀撑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏唠帝。R本人自食惡果不足惜屯掖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望襟衰。 院中可真熱鬧贴铜,春花似錦、人聲如沸瀑晒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)苔悦。三九已至轩褐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間玖详,已是汗流浹背把介。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蟋座,地道東北人拗踢。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像向臀,于是被迫代替她去往敵國(guó)和親巢墅。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,498評(píng)論 25 707
  • 今天是離職的第一天蓄髓,連續(xù)工作兩年了,終于不用帶著工作任務(wù)喘氣了舒帮。 回想這兩年双吆,加班從一個(gè)小時(shí),慢慢變成兩個(gè)小時(shí)会前,有...
    安與樹閱讀 257評(píng)論 0 0
  • 在這個(gè)充滿二胎話題的社會(huì)里好乐,大家都瞪大了雙眼,摩拳擦掌瓦宜,仿佛一下子都看到了市場(chǎng)和商機(jī)蔚万,月嫂的工資像坐上了火箭,月子...
    如果你也在閱讀 770評(píng)論 3 1