Python 原生爬虫小项目www.4688.com — 爬取熊猫电视机 英雄联盟游戏分类上面所有主播的人气排名

编制那么些原生爬虫项目标3个基本点目标:

1.巩固 python 基础知识
2.摸底合理的编码规范和格局
3.打听爬虫基本原理

自我是一个博士,我没脸地写下了那般一句话。

项目分析:

1.爬取网站:
熊猫电视机(https://www.panda.tv/cate/lol)
2.爬虫目的: 爬取英雄联盟游戏分类下边所有主播的人气名次
3.爬虫步骤:
  (1).明确要爬取的网站数据
  (2).分析并问询所要爬取的网站协会,找到数据所在标签地点
  (3).确定定位标签
www.4688.com,    确定定位标签标准:
    ①竭尽挑选具有唯一标识的价签
    ②尽量拔取最相近所要提取数据的价签
    ③尽可能采纳可以闭合的标签
  (4).编写代码
    ①由此 urllib 库模拟 http 请求, 向服务器发送这一个请求,
获取到服务器重临的 html(常常会是网页完整的 html)
    ②用正则表明式提取需求的数额(主播的用户名、人气)
    ③对所爬取的数量举办清洗, 提炼出符合格式的数目
    ④基于作业需要对爬取到的多少举行排序
    ⑤展现数据

之所以用下流至极那一个难看的成语,是因为自身一向不以为自家像一个博士。

网页分析:
  1. 剖析页面, 图中标记的四个数据分别是要爬取的用户名和观看人数
![](https://upload-images.jianshu.io/upload_images/9538421-d6fdb6a7aafc1be3.png)

01. 爬虫所要爬取的页面
  1. 找到包含 “用户名和见到人数” 所在标签, 可以窥见 “用户名和观望人数”
    分别位居 class 为 “video-nickname” 和 “video-number” 的三个<span> 标签中, 将 class 为 “video-info” 所在的 <div>
    标签作为永恒标签
![](https://upload-images.jianshu.io/upload_images/9538421-a2f59392016ff886.png)

02. 找到包含 "用户名和观看人数" 所在标签



![](https://upload-images.jianshu.io/upload_images/9538421-bb5806b6d3efc524.png)

03. 确定定位标签

纵使本人的确是一个博士。固然是二本的。

品种全体代码:
import re
from urllib import request


class Spider(object):
    """
    爬取熊猫TV 网站英雄联盟游戏分类下面所有主播的人气排行
    """

    # 用类变量 url 来保存所要爬取的网页的地址
    url = "https://www.panda.tv/cate/lol"

    # 定义所需的正则匹配模式
    root_pattern = '<div class="video-info">([\s\S]*?)</div>'
    name_pattern = '</i>([\s\S]*?)'
    number_pattern = '([\s\S]*?)'

    def __fetch_content(self):
        """
        获取网页内容
        """
        # 用变量 r 来保存通过 request 请求网址所返回的 response 对象
        r = request.urlopen(Spider.url)
        # 用 read 方法读取出 r 对象的数据, 并将得到的 html 数据赋值给 htmls 变量
        htmls = r.read()
        # 因为通过 r.read() 获取的 htmls 是 bytes(字节码),
        # 而我们最终想要获取 str(字符串), 所以这里需要转码
        htmls = str(htmls, encoding="utf-8")

        return htmls

    def __analysis(self, htmls):
        """
        分析并提取所要爬取的数据
        """
        # 利用正则匹配出定位标签里的数据
        root_htmls = re.findall(Spider.root_pattern, htmls)

        # anchors 列表用来存储所要提取的数据
        anchors = []
        for html in root_htmls:
            # 利用正则将定位标签里获取的数据再次匹配, 提取出用户名和观看人数
            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):
        """
        数据精炼, 对数据进行清洗
        """
        for anchor in anchors:
            anchor["name"] = anchor["name"][0].strip()
            anchor["number"] = anchor["number"][0].strip()

        return anchors

    def __sort(self, anchors):
        """
        对数据进行排序
        """
        anchors = sorted(anchors, key=self.__sort_seed, reverse=True)

        return anchors

    def __sort_seed(self, anchor):
        """
        排序方法 __sort 的种子方法, 可以通过此方法来确定排序依据
        """
        r = re.findall("\d*", anchor["number"])
        number = float(r[0])
        if "万" in anchor["number"]:
            number *= 10000

        return number

    def __show(self, anchors):
        """
        打印数据
        """
        for rank in range(0, len(anchors)):
            print("rank %s: %s    %s" % (rank+1, anchors[rank]["name"], anchors[rank]["number"]))

    def go(self):
        """
        入口方法(总控方法), Spider 类内部所有方法的调用都通过 go 方法来调用
        """
        htmls = self.__fetch_content()
        anchors = self.__analysis(htmls)
        anchors = self.__refine(anchors)
        anchors = self.__sort(anchors)
        self.__show(anchors)


spider = Spider()
spider.go()

本身的生存是那样子的:

测试代码:

www.4688.com 1

测试项目代码

一大早,生物闹钟把自己叫醒,然后睁开眼,打开手机。

手机上突显的时光控制了自己是继续睡觉仍旧始于刷新闻刷今日头条刷贴吧。

摩擦了足足久将来,我起床了。然后看课程表。因为课程表上的科目决定了自身是执教照旧逃课。

到头来,我去上课了。

终于,下课了。

然后,午睡,继续教授继续下课。

好不不难,到了我最欣赏的夜幕生活。

此前清晨我会平素lol个没完没了,或者追英剧追个石破天惊。现在,作为一个大三学生,为了就业,毅然报了个php培训班,所以,开端看培训视频。

当然我并未是一个怀抱大志的人,看视频的进度中,我会穿插着看小说,看摄像看直播等等诸多不务正业的一言一行。

直至睡觉时间到了。

开始睡觉,开始新一天。

真低俗,我是这么觉得。

自我的高等校园生活。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website