爬取斗鱼LOL主播人气数据,并显示排行榜 [网络爬虫] [应用案例][请求头][模块]
您的“关注”和“点赞”,是信任,是认可,是支持,是动力......
如意见相佐,可留言。
本人必将竭尽全力试图做到准确和全面,终其一生进行修改补充更新。
1 爬取斗鱼lol主播人气数据的思路
(1)分析网页结构,url 调度
(2)网页下载
(3)数据抓取
(4)数据精炼
(5)业务处理
(6)数据存储(演示为控制台展示数据)
2 构建请求头
2.1 构建请求头概述(为什么要构建请求头?)
有的网站会有反爬虫措施,一般就是针对于headers
中的user-agent
( user-agent 头域的内容包含发出请求的用户信息。)的内容做一判断。
如果没有headers
,往往会被认为是爬虫脚本,必然会拒绝这样的网络请求,甚至封掉ip
地址。
所以,就需要将爬虫伪装成浏览器的正常访问,来避免一些反爬虫措施。
本文推荐一个稍微不错的方法:通过user-agent
构建请求头headers
来伪装爬虫,在每次提交网络请求时,使用构建好的请求头去迷惑对方。
2.1 构建固定请求头(单个user-agent
)
虽然是一个“笨办法”,但是也能解决一下燃眉之急。如果时间充足,甚至还可以多找一些user-agent
,再写个随机函数,每次用不同的user-agent
,也是可以的。
构建一个user-agent
的步骤,如下所示(演示用的是谷歌浏览器):
(1)点开任意的网址(演示用的是www.baidu.com),按下f12
键,也就是打开开发者工具。如下图所示:
(2)在上图中有network
选项,选中之后,按下f5
,则会看到name
列表。如下图所示:
(3)点击name
列表里任意的一条内容(演示点击的是第一条内容),如下所示:
(4)会显示出很多内容,主要有如下所示:
-
general
:指的是通用头域,或叫做通用首部。包含了请求和响应都支持的头域,提供了一些与报文相关的最基本的信息 -
response headers
:响应头域,或叫响应头。包含响应报文,当收到get或post等方法发来的请求后,服务器就要对报文进行响应。 -
request headers
:请求头域,或叫做请求头。包含请求报文,http协议使用tcp协议进行传输,在应用层协议发起交互之前,首先是tcp的三次握手。完成了tcp三次握手后,用户会向服务器发出一个请求报文。
演示拿accept-encoding
、user-agent
即可,如上图所示。
-
accept-encoding
:浏览器能够进行解码的数据编码方式。 -
user-agent
:浏览器类型。告诉http服务器客户端浏览器使用的操作系统和浏览器的版本和名称。
(5)拿到一个user-agent
,保存到字典中备用。
header = {'accept-encoding': 'gzip, deflate, br', 'user-agent': 'mozilla/5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/81.0.4044.92 safari/537.36'}
2.2 构建随机请求头(多个user-agent
)
第三方fake_useragent
库(假用户代理库),对user-agent
提供了很好的支持,就不用辛辛苦苦一个一个去收集user-agent
了。
首先我们要从fake_useragent
库中导入useragent
,然后通过random
就可以拿到随机的useragent
。
详细用法请参见 。
如果安装过fake_useragent
,可用以下命令查看和图示如下:
pip list
如果没有安装,首先下载安装fake_useragent
库,命令和图示如下:
pip install fake_useragent
安装好fake_useragent
库之后,我们就可以使用喽!如下代码所示:
from fake_useragent import useragent for i in range(10): print(useragent().random) # 用 print() 函数打印生成的 10 个随机 user-agent
运行结果:
mozilla/5.0 (macintosh; intel mac os x 10_8_3) applewebkit/537.36 (khtml, like gecko) chrome/27.0.1453.93 safari/537.36 mozilla/5.0 (windows nt 4.0; wow64) applewebkit/537.36 (khtml, like gecko) chrome/37.0.2049.0 safari/537.36 mozilla/5.0 (ipad; cpu os 5_1 like mac os x) applewebkit/534.46 (khtml, like gecko ) version/5.1 mobile/9b176 safari/7534.48.3 mozilla/5.0 (windows nt 6.2) applewebkit/537.36 (khtml, like gecko) chrome/28.0.1467.0 safari/537.36 mozilla/5.0 (windows nt 6.1; wow64) applewebkit/537.36 (khtml, like gecko) chrome/31.0.1623.0 safari/537.36 mozilla/5.0 (macintosh; intel mac os x 10_8_3) applewebkit/537.36 (khtml, like gecko) chrome/27.0.1453.93 safari/537.36 mozilla/5.0 (windows nt 6.2; wow64) applewebkit/537.15 (khtml, like gecko) chrome/24.0.1295.0 safari/537.15 mozilla/5.0 (windows nt 6.2; wow64) applewebkit/537.36 (khtml, like gecko) chrome/27.0.1500.55 safari/537.36 mozilla/5.0 (x11; linux x86_64) applewebkit/537.36 (khtml, like gecko) chrome/34.0.1847.137 safari/4e423f mozilla/5.0 (macintosh; intel mac os x 10_7_5) applewebkit/537.36 (khtml, like gecko) chrome/27.0.1453.93 safari/537.36
可以保存到字典里备用,随机请求头就构建好了,如下代码所示:
header = {'accept-encoding': 'gzip, deflate, br','user-agent': str(useragent().random)}
3 所用到的其他模块简介
3.1 requests 模块
requests
可以模拟浏览器的请求,比起urllib
,requests
模块的api
更加便捷。
详细用法请参见 。
3.2 re 模块
re
模块提供了一系列功能强大的正则表达式(regular expression)工具,它们允许你快速检查给定字符串是否与给定的模式匹配(match
函数), 或者包含这个模式(search
函数)。正则表达式是以紧凑的语法写出的字符串模式。
详细用法请参见 python 标准库。
3.3 random 模块
该模块实现了各种分布的伪随机数生成器。
详细用法请参见 。
4 爬取斗鱼lol主播人气数据,并显示排行榜
代码如下所示:
from fake_useragent import useragent import requests import re import random class spider: # 目标页面地址 url = 'https://www.douyu.com/g_lol' # url = 'https://www.douyu.com/g_dota2' # 正则表达式 # root_pattern = r'</div><div class="dylistcover-info">([\s\s]*?)</div>' 用这个root_pattern,在 __analysis()方法中就要用 root_html = re.findall(spider.root_pattern, htmls) root_pattern = '<div class="dylistcover-info">([\d\d]*?)</div>' name_pattern = '</use></svg>([\d\d]{0,20}?)</h2>' number_pattern = '</use></svg>([\d\d]*?)</span>' # 构建随机请求头,伪装成浏览器 header = {'accept-encoding': 'gzip, deflate, br', 'user-agent': str(useragent().random)} # 抓取 html def __fetch_content(self): htmls = requests.get(spider.url, headers=spider.header).text return htmls # 数据分析 def __analysis(self, htmls): # root_html = re.findall(spider.root_pattern, htmls) root_html = re.findall(spider.root_pattern, htmls)[1::2] 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): lamb = lambda anchor: { 'name': anchor['name'][0].strip(), 'number': anchor['number'][0].strip()} anchors_refine = list(map(lamb, anchors)) return anchors_refine # 业务处理 def __sort(self, anchors): shuffle_list = list(range(len(anchors))) random.shuffle(shuffle_list) anchors_shuffle = [anchors[i] for i in shuffle_list] anchors = sorted(anchors_shuffle, key=self.__sort_seed, reverse=true) return anchors # 为 sorted() 函数的 key 参数提供总调用函数 def __sort_seed(self, anchor): r = re.findall('\d*', anchor['number']) number = float(r[0]) if '万' in anchor['number']: number *= 10000 return number # 控制台展示数据 def __show(self, anchors): for i, anchor in enumerate(anchors): # open(str(i)+'.excel') print('rank', i + 1, anchor['name'], anchor['number']) # 程序入口方法 def go(self): htmls = self.__fetch_content() # 调用 __fetch_content() 方法获取 html anchors = self.__analysis(htmls) anchors = self.__refine(anchors) anchors = self.__sort(anchors) self.__show(anchors) spider = spider() # 创建 spider 对象 spider.go() # 调用 spider 对象中的程序入口方法
运行结果:
rank 1 智勋勋勋勋 329.9万 rank 2 t1直播faker 256.5万 rank 3 东北大鹌鹑 242.8万 rank 4 南波儿大魔王丶 185.9万 rank 5 英雄联盟赛事 169.9万 rank 6 夏天夏天丶丶 147.7万 rank 7 洞主丨歌神洞庭湖 134.5万 rank 8 杰克螳螂 124.1万 rank 9 不2不叫周淑怡 114.9万 rank 10 王纪超666 107.6万 rank 11 最强皇童王丽农 87.3万 rank 12 狐狸酱大魔王 80.6万 rank 13 她打了个嗝儿 79.1万 rank 14 梨落秋溪 77.7万 rank 15 放逐大帝灬 71.9万 rank 16 叶音符 67.4万 rank 17 草莓 62.1万 rank 18 zzc啊哦额 60.3万 rank 19 余霜yscandice 41.3万 rank 20 石页的第一根矛s 40.6万 rank 21 狗康bfate丶 40.3万 rank 22 远古解说yd 39.1万 rank 23 女战士丶姝玥 38.7万 rank 24 辛巴imb丶丶 37.9万 rank 25 英雄联盟经典赛事点播 34.9万 rank 26 暗夜猎手光头强 30.4万 rank 27 格局太小ooo 29.1万 rank 28 魔獸后裔 29.5万 rank 29 初恋女孩水水 29.7万 rank 30 peanuthulllll 29.3万 rank 31 mouse光酱 28.3万 rank 32 小熊和你 25.3万 rank 33 小老板丶艾克 24.2万 rank 34 波比丶easyboom 23.4万 rank 35 冰凡 22.7万 rank 36 捕捉一只三吃 22.1万 rank 37 咸鱼光y 22.6万 rank 38 小微笑lmq 21.4万 rank 39 小蝌蚪羊月 21.1万 rank 40 李冉冉i 20.9万 rank 41 空大的劫zz 20万 rank 42 孤儿南 19.8万 rank 43 一只蘇l 19.8万 rank 44 snsofm 19.7万 rank 45 snswordart 18.4万 rank 46 祈风1v9 18.5万 rank 47 柠檬少女吖 17.1万 rank 48 会旋转的冬瓜 17.5万 rank 49 作作金克丝 17.5万 rank 50 消逝carry 17.3万 rank 51 一只小媚媚丶 17.1万 rank 52 杨驴驴y 16.2万 rank 53 解说鼓鼓 16.7万 rank 54 大象ouo 16.4万 rank 55 刀锋秀秀aqa 16.9万 rank 56 炽天使z1丶丶 16.5万 rank 57 t1直播cuzz 16.6万 rank 58 岁月刀妹qaq 16.2万 rank 59 解说娃娃 15.4万 rank 60 懒猫猫qaq 15.9万 rank 61 陛哥丶 15.5万 rank 62 小埃及热狗ob 15.8万 rank 63 snangelz 15.4万 rank 64 馒头超仙女哒 15.3万 rank 65 蟹老板丶西内 14.9万 rank 66 凉风亚索yasuo 14.6万 rank 67 陆屿爱吃鱼 14.4万 rank 68 暴风工作室丶 14.7万 rank 69 电竞少女萱某人ob 13.7万 rank 70 宋暖阳绝不咕咕 13.6万 rank 71 谭无双 13.6万 rank 72 snweiwei 13.2万 rank 73 t1直播effort 13.2万 rank 74 馒头ob解说 12.4万 rank 75 snbiubiu 12.1万 rank 76 解说王多多 12.6万 rank 77 dy丶小然 12.3万 rank 78 青蛙ob王者局丶抽红包 12.2万 rank 79 川美人 12.7万 rank 80 t1直播roach 12.1万 rank 81 lck瓜皮ob飞科 12.1万 rank 82 柚子ob 12.9万 rank 83 迷离之道丶 12万 rank 84 rng上校ob皇族ryl不放弃 12.9万 rank 85 王豆荳 12.6万 rank 86 ldl官方直播间 12.1万 rank 87 付小翁 11.1万 rank 88 最初的可可 11.3万 rank 89 安酱qwq 11.1万 rank 90 狮狮嗷 11.1万 rank 91 big热狗ob专属宝蓝阿水 11.6万 rank 92 米可小甜甜 11.2万 rank 93 解说奶弟 11.8万 rank 94 安妮今天五杀了吗 11.9万 rank 95 奶妈的安眠药 10.9万 rank 96 诗俞 10.5万 rank 97 akl托尼老师 10.9万 rank 98 泽元元元元 10.8万 rank 99 鲍鲍解说 10.1万 rank 100 雨神等你萌 10.8万 rank 101 fpx小凤凰ob 10.8万 rank 102 秋月小黑 10.6万 rank 103 edg救心丸ob 10.7万 rank 104 教练joker 10.7万 rank 105 熙子小盆友 10.1万 rank 106 南方菇凉禾禾 10.4万 rank 107 t1直播ellim 10.2万 rank 108 波波卡特0411 10.2万 rank 109 i陈一一 9.7万 rank 110 jy长腿仙儿 9.6万 rank 111 yomi不是吸血鬼 9.1万 rank 112 狼神丶欧阳 9.4万 rank 113 熬夜的au 9.4万 rank 114 我就是鱼鱼阿i 9.9万 rank 115 douyu丶松子 9.5万 rank 116 天神男枪 9.7万 rank 117 熙酱鸭ovo 9.3万 rank 118 小机灵鬼阿婉 9.4万 rank 119 一小叶子吖 9.4万 rank 120 sklaus丶 1.2万