所谓的爬虫,就是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。主要为门户站点搜索引擎和大型 Web 服务提供商采集数据。

整理爬虫常规思路

  1. 明确抓取目的:爬取斗鱼TV下英雄联盟分类的主播人气排行。

  2. 找到抓取网页:https://www.douyu.com/g_LOL 。

  3. 打开抓取页面,F12,使用箭头分别查询对应html标签。

  4. 模拟http请求,向服务器发送请求,获取到服务器返回的HTML。

  5. 使用正则表达式,提取目的数据(名字,人气)。


HTML结构分析

基本原则:

  1. 尽量选择具有唯一标识性的标签作为定位标签;

  2. 尽量选择最接近于要抓取数据的标签作为定位标签;

  3. 尽量选择可以将要抓取数据闭合的标签。

这里我选择...

...

作为匹配标签。

14. 原生爬虫_Python

将上面选择的两个标签作为一组数据,然后再选择一个可以闭合这组数据的标签作为定位标签,如

...

14. 原生爬虫_抓虫_02

数据提取层级分析图如下:

14. 原生爬虫_Python_03


正则分析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'