網絡爬蟲
也叫網絡蜘蛛
,若是把互聯網比喻成一個蜘蛛網,那麼蜘蛛就是在網上爬來爬去的蜘蛛,爬蟲程序經過請求url地址,根據響應的內容進行解析採集數據,
好比:若是響應內容是html,分析dom結構,進行dom解析、或者正則匹配,若是響應內容是xml/json數據,就能夠轉數據對象,而後對數據進行解析。html
經過有效的爬蟲手段批量採集數據,能夠下降人工成本,提升有效數據量,給予運營/銷售的數據支撐,加快產品發展。前端
目前互聯網產品競爭激烈,業界大部分都會使用爬蟲技術對競品產品的數據進行挖掘、採集、大數據分析,這是必備手段,而且不少公司都設立了爬蟲工程師
的崗位python
爬蟲是利用程序進行批量爬取網頁上的公開信息,也就是前端顯示的數據信息。由於信息是徹底公開的,因此是合法的。其實就像瀏覽器同樣,瀏覽器解析響應內容並渲染爲頁面,而爬蟲解析響應內容採集想要的數據進行存儲。jquery
爬蟲很難徹底的制止,道高一尺魔高一丈,這是一場沒有硝煙的戰爭,碼農VS碼農
反爬蟲一些手段:git
基本流程github
基本手段正則表達式
破解請求限制json
破解登陸受權瀏覽器
破解驗證碼cookie
解析數據
HTML Dom解析
數據字符串
python寫爬蟲的優點
涉及模塊包
請求
urllib
urllib2
cookielib
多線程
threading
正則
re
json解析
json
html dom解析
pyquery
beautiful soup
操做瀏覽器
selenium
鬥魚主播排行
目標數據
來源地址
[排行榜地址]
[主播房間地址]
結構分析
經過抓包 [排行榜地址],[主播房間地址] (谷歌調試network/charles/fiddler)
得到排行數據接口:https://www.douyu.com/directo...
得到主播房間信息數據
實現構思
申明:此例子僅做爲爬蟲學習DEMO,並沒有其餘利用
基於python實現爬蟲學習基礎demo
def douyu_rank(rankName, statType): ''' 鬥魚主播排行數據抓取 [數據地址](https://www.douyu.com/directory/rank_list/game) * `rankName` anchor(巨星主播榜),fans(主播粉絲榜),haoyou(土豪實力榜),user(主播壕友榜) * `statType` day(日),week(周),month(月) ''' if not isinstance(rankName, ERankName): raise Exception("rankName 類型錯誤,必須是ERankName枚舉") if not isinstance(statType, EStatType): raise Exception("statType 類型錯誤,必須是EStatType枚舉") rankName = '%sListData' % rankName.name statType = '%sListData' % statType.name # 請求獲取html源碼 rs = rq.get( "https://www.douyu.com/directory/rank_list/game", headers={'User-Agent': 'Mozilla/5.0'}) # 正則解析出數據 mt = re.search(r'rankListData\s+?=(.*?);', rs, re.S) if (not mt): print u"沒法解析rankListData數據" return grps = mt.groups() # 數據轉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): ''' 主播房間信息解析 [數據地址](https://www.douyu.com/xxx) 'romm_id' 主播房號 ''' 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數據" return grps = mt.groups() roomDataStr = grps[0] roomData = json.loads(roomDataStr) return roomData def run(): ''' 測試爬蟲 ''' 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()
運行結果: 主播排行榜: 沒法解析ROOM數據 1 馮提莫 房間(71017):今晚來 [英雄聯盟] 2 阿冷aleng丶 房間(2371789):又是我最喜歡的阿冷ktv時間~ [英雄聯盟] 3 勝哥002 房間(414818):勝哥:南通的雨下的我好心累。 [DNF] 4 White55開解說 房間(138286):盧本偉五五開 天天都要很強 [英雄聯盟] 5 東北大鵪鶉 房間(96291):東北大鵪鶉 宇宙第一寒冰 相聲藝術家! [英雄聯盟] 6 老實敦厚的笑笑 房間(154537):德雲色 給兄弟們賠個不是 [英雄聯盟] 7 劉飛兒faye 房間(265438):劉飛兒 月底吃雞 大吉大利 [絕地求生] 8 pigff 房間(24422):【PIGFF】借基地直播,沒OW [守望先鋒] 9 雲彩上的翅膀 房間(28101):翅:仍是抽天空套刺激! [DNF] 10 yyfyyf 房間(58428):無盡的9月,殺 [DOTA2]