經過有效的爬蟲手段批量採集數據,能夠下降人工成本,提升有效數據量,給予運營/銷售的數據支撐,加快產品發展。html
目前互聯網產品競爭激烈,業界大部分都會使用爬蟲技術對競品產品的數據進行挖掘、採集、大數據分析,這是必備手段,而且不少公司都設立了爬蟲工程師
的崗位前端
爬蟲是利用程序進行批量爬取網頁上的公開信息,也就是前端顯示的數據信息。由於信息是徹底公開的,因此是合法的。其實就像瀏覽器同樣,瀏覽器解析響應內容並渲染爲頁面,而爬蟲解析響應內容採集想要的數據進行存儲。python
爬蟲很難徹底的制止,道高一尺魔高一丈,這是一場沒有硝煙的戰爭,碼農VS碼農
反爬蟲一些手段:jquery
urllib
urllib2
cookielib
threading
re
json
pyquery
beautiful soup
selenium
鬥魚主播排行git
申明:此例子僅做爲爬蟲學習DEMO,並沒有其餘利用github
基於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):None [英雄聯盟] 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] # 馮提莫 房間作週年主題,解析會有問題
Demo源碼地址json