经过有效的爬虫手段批量采集数据,能够下降人工成本,提升有效数据量,给予运营/销售的数据支撑,加快产品发展。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