所谓的爬虫,就是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。主要为门户站点搜索引擎和大型 Web 服务提供商采集数据。
整理爬虫常规思路
明确抓取目的:爬取斗鱼TV下英雄联盟分类的主播人气排行。
找到抓取网页:https://www.douyu.com/g_LOL 。
打开抓取页面,F12,使用箭头分别查询对应html标签。
模拟http请求,向服务器发送请求,获取到服务器返回的HTML。
使用正则表达式,提取目的数据(名字,人气)。
HTML结构分析
基本原则:
尽量选择具有唯一标识性的标签作为定位标签;
尽量选择最接近于要抓取数据的标签作为定位标签;
尽量选择可以将要抓取数据闭合的标签。
这里我选择...
和
...
作为匹配标签。
将上面选择的两个标签作为一组数据,然后再选择一个可以闭合这组数据的标签作为定位标签,如
...
。
数据提取层级分析图如下:
正则分析HTML
import gzip,refrom io import BytesIOfrom urllib.request import urlopen,Requestclass Spider(): url = 'https://www.douyu.com/g_LOL' # url = 'https://www.douyu.com/g_DOTA2' headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36', 'accept-encoding': 'gzip, deflate, br' } root_pattern = r'([\s\S]*?)' name_pattern = r'([\s\S]*?)' number_pattern = r'([\s\S]*?)' def __fetch_content(self): #html获取 r = urlopen(Request(Spider.url,headers=Spider.headers),timeout=10) buff = BytesIO(r.read()) f = gzip.GzipFile(fileobj=buff) htmls = f.read().decode('utf-8') return htmls def __analysis(self, htmls): #数据提取 root_html = re.findall(Spider.root_pattern, htmls) anchors = [] for html in root_html: name = re.findall(Spider.name_pattern, html) number = re.findall(Spider.number_pattern, html) anchor = {'name': name, 'number': number} anchors.append(anchor) return anchors def __refine(self, anchors): #数据精炼 anchor_list = lambda anchor: { 'name':anchor['name'][0].strip(), 'number':anchor['number'][0] } return list(map(anchor_list, anchors)) def __sort(self, anchors): #业务处理 anchors = sorted(anchors, key=self.__sort_seed, reverse=True) return anchors def __sort_seed(self, anchor): r = re.findall(r'\d*', anchor['number']) number = float(r[0]) if '万' in anchor['number']: number *= 10000 return number def __show(self, anchors): #数据展示 for rank in range(len(anchors)): print('Rank %d' % (rank + 1) + ' : ' + anchors[rank]['name'] + ' ' + anchors[rank]['number']) def go(self): #入口方法 htmls = self.__fetch_content() anchors = self.__analysis(htmls) anchors = self.__refine(anchors) anchors = self.__sort(anchors) self.__show(anchors)spider = Spider()spider.go()
运行结果:
Rank 1 : 英雄联盟赛事 608.5万 Rank 2 : 金咕咕金咕咕doinb 147.4万 Rank 3 : 东北大鹌鹑 134.6万 Rank 4 : 南波儿大魔王丶 75.9万 Rank 5 : 洞主丨歌神洞庭湖 75.8万 Rank 6 : 孙悟空丨兰林汉 74.9万 Rank 7 : 小马Oo 70.8万 Rank 8 : 仙凡哥哥丶 68.1万 Rank 9 : 余小C真的很强 63.8万 Rank 10 : 叶音符 60.9万 Rank 11 : zzc啊哦额 54.6万 Rank 12 : 梨落秋溪 53万 Rank 13 : ShinyRuoの 51.3万 Rank 14 : 王纪超666 49.6万 Rank 15 : 草莓 48.1万 Rank 16 : 魔獸后裔 45.6万 Rank 17 : 电棍 40.2万 Rank 18 : 余霜Yscandice 39万 Rank 19 : 小酒窝翁馨 39万 Rank 20 : 熙子啦啦啦啦 37.6万 Rank 21 : 骆歆冲冲冲 32.5万 Rank 22 : 辛巴imb丶丶 29.6万 Rank 23 : DJ叫我官人 26.4万 Rank 24 : 王艺琳OvO 21.9万 Rank 25 : 冰凡 20.4万 Rank 26 : Moe无千语吖 19.6万 Rank 27 : 杰克螳螂 18.7万 Rank 28 : 峡谷杀神酱油瓶 17.8万 Rank 29 : 良小伞san 17.5万 Rank 30 : SNSwordart 15.9万 Rank 31 : RNG上校OB皇族RYL不放弃 15.8万 Rank 32 : 狗康Bfate丶 15.7万 Rank 33 : 解小亮 14.9万 Rank 34 : 熊王c 14万 Rank 35 : Xx丶锐雯 13.7万 Rank 36 : 教练JoKer 12.5万 Rank 37 : 皮皮卡特儿 11.7万 Rank 38 : 浪灯丶 11.2万 Rank 39 : 小钰Hilda 10.3万 Rank 40 : Mouse光酱 9.1万 Rank 41 : 解说十一 9.6万 Rank 42 : Nearly1 9.2万 Rank 43 : 主播浩钦 9.1万 Rank 44 : douyu丶松子 9.1万 Rank 45 : 炽天使z1丶丶 9.1万 Rank 46 : 岁月刀妹QAQ 9.1万 Rank 47 : DMOxiaopeng 9万 Rank 48 : 店长盖伦 8.6万 Rank 49 : DMOGALA 8.1万 Rank 50 : 青蛙OB王者局丶抽红包 8万 Rank 51 : 古月泽宇Moonnnn 7.6万 Rank 52 : 最初的可可 7.6万 Rank 53 : 最初卡莎 7.6万 Rank 54 : 戏命师小白 7.4万 Rank 55 : 我自人间仙 7.4万 Rank 56 : V5丶Windy 7.2万 Rank 57 : DMOMark 7.2万 Rank 58 : 苏轼丶Sush4 7万 Rank 59 : DMOmelody 6.6万 Rank 60 : 鹌鹑蛋小哥哥 6.5万 Rank 61 : 程钢铁 6.5万 Rank 62 : 孤独Carry丶九千岁 6.4万 Rank 63 : 小埃及热狗OB 6.3万 Rank 64 : 作作金克丝 6.3万 Rank 65 : 俞俊0829 6.3万 Rank 66 : 电竞毒奶敏丶 6.1万 Rank 67 : 西瓜Melon1 6.1万 Rank 68 : 波比腿短锤子长i 6万 Rank 69 : 混王灰灰小法 6万 Rank 70 : 唐人龙龟 5.9万 Rank 71 : 柚子ob 5.6万 Rank 72 : 解说彭彭 5.6万 Rank 73 : 是你的谭阿姨呀 5.5万 Rank 74 : 我才是你的小宇宙r 5.5万 Rank 75 : 红茶bt 5.4万 Rank 76 : LDL官方直播间 5.3万 Rank 77 : V5丶Aliez 5.2万 Rank 78 : 林婉之 5.2万 Rank 79 : 陛哥丶 5.1万 Rank 80 : Dy丶小然 5.1万 Rank 81 : lol狸神c 5万 Rank 82 : a歆晓 5万 Rank 83 : 是柚子不是柚子 4.9万 Rank 84 : 冰雪狐狸丶阿狸 4.9万 Rank 85 : 小熊妹妹QvQ 4.9万 Rank 86 : 弹头很酷zshhh 4.9万 Rank 87 : 特工丶琪丨36E的李二狗 4.7万 Rank 88 : 女船长小豆包 4.6万 Rank 89 : 一情书一 4.5万 Rank 90 : 阳哥剑圣 4.5万 Rank 91 : 呼市怪蜀黍 4.3万 Rank 92 : 付小翁 4.3万 Rank 93 : 玩剑圣的毛毛虫 4.2万 Rank 94 : 小明剑魔 4.2万 Rank 95 : 冗词y 4.2万 Rank 96 : 三枪赵信丶 4.1万 Rank 97 : 柠檬少女吖 4.1万 Rank 98 : 皮在痒yang丶 4.1万 Rank 99 : 晓晓酥i 4万 Rank 100 : 若雨蚂蚱 4万 Rank 101 : 晓小超c 4万 Rank 102 : 海伦酱ToT 3.9万 Rank 103 : 临界 3.9万 Rank 104 : 牛百川69 3.8万 Rank 105 : Akl托尼老师 3.8万 Rank 106 : 全自动的打火机 3.7万 Rank 107 : 皮皮姐c 3.6万 Rank 108 : Stitch杨一mm 3.6万 Rank 109 : 墨郎呀丶 3.6万 Rank 110 : 仙女幼 3.6万 Rank 111 : 潘慢慢丶丶 3.5万 Rank 112 : 波波卡特0411 3.5万 Rank 113 : 瑞文小迷弟Y 3.4万 Rank 114 : 饼干OuO 3.4万 Rank 115 : 摘星螳螂 3.3万 Rank 116 : 温柔嘉瞳 3.3万 Rank 117 : 小鹿吖s 3.3万 Rank 118 : 爱吸血的皮卡丘 3.3万 Rank 119 : 节奏至上 3.2万 Rank 120 : 杨驴驴y 3.1万
当我们想要抓取其他分类时,只需要更改url即可。例如抓取DOTA2分类排行,url = 'https://www.douyu.com/g_DOTA2'
。