网络爬虫
也叫网络蜘蛛
,若是把互联网比喻成一个蜘蛛网,那么蜘蛛就是在网上爬来爬去的蜘蛛,爬虫程序经过请求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]