当前位置: 首页 > ops >正文

Python爬取熊猫TV 英雄联盟游戏分类下面所有主播的人气排行

编写这个原生爬虫项目的3个主要目的:

1.巩固 python 基础知识
2.了解合理的编码规范和方式
3.了解爬虫基本原理

项目分析:

1.爬取网站: 熊猫TV(https://www.panda.tv/cate/lol)
2.爬虫目的: 爬取英雄联盟游戏分类下面所有主播的人气排行
3.爬虫步骤:
  (1).明确要爬取的网站数据
  (2).分析并了解所要爬取的网站结构,找到数据所在标签位置
  (3).确定定位标签
    确定定位标签原则:
    ①尽量选取具有唯一标识的标签
    ②尽量选取最接近所要提取数据的标签
    ③尽量选取可以闭合的标签
  (4).编写代码
    ①通过 urllib 库模拟 http 请求, 向服务器发送这个请求, 获取到服务器返回的 html(通常会是网页完整的 html)
    ②用正则表达式提取需要的数据(主播的用户名、人气)
    ③对所爬取的数据进行清洗, 提炼出符合格式的数据
    ④根据业务需求对爬取到的数据进行排序
    ⑤展示数据

网页分析:

  1. 分析页面, 图中标记的两个数据分别是要爬取的用户名和观看人数

     

    01. 爬虫所要爬取的页面

  2. 找到包含 "用户名和观看人数" 所在标签, 可以发现 "用户名和观看人数" 分别位于 class 为 "video-nickname" 和 "video-number" 的两个 <span> 标签中, 将 class 为 "video-info" 所在的 <div> 标签作为定位标签

     

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

     

    03. 确定定位标签

项目完整代码:

import re
from urllib import request
'''
想要学习Python?Python学习交流群:984632579满足你的需求,资料都已经上传群文件,可以自行下载!
'''
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]*?)</span>'number_pattern = '<span class="video-number">([\s\S]*?)</span>'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 htmlsdef __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 anchorsdef __refine(self, anchors):"""数据精炼, 对数据进行清洗"""for anchor in anchors:anchor["name"] = anchor["name"][0].strip()anchor["number"] = anchor["number"][0].strip()return anchorsdef __sort(self, anchors):"""对数据进行排序"""anchors = sorted(anchors, key=self.__sort_seed, reverse=True)return anchorsdef __sort_seed(self, anchor):"""排序方法 __sort 的种子方法, 可以通过此方法来确定排序依据"""r = re.findall("\d*", anchor["number"])number = float(r[0])if "万" in anchor["number"]:number *= 10000return numberdef __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()

测试代码:

http://www.xdnf.cn/news/11493.html

相关文章:

  • 如何用MATLAB实现静态反馈控制
  • PKIX path building failed的问题分析
  • 各种软件版本号扫盲——Beta RC Preview release等
  • 倒计时 7 天 | 立即加入 GDE 成长计划,飞跃成为谷歌开发者专家
  • 机器学习-各分类模型优缺点(持续更新)
  • DVD转RMVB及DVD转AVI相关教程
  • Objective-C 编程语言官网文档(一)-简介
  • 看程序员如何给女朋友解释什么是锟斤拷?
  • 同一个局域网下访问电脑本地的localhost网址
  • 什么是网口温湿度传感器?什么是以太网温湿度传感器?
  • KVM+GFS分布式存储系统构建KVM高可用
  • python基础,黑马最新配套视频笔记
  • 气体管道管径及流量对照表_De、DN、D、d怎么搞懂他们?附管径与阀门通径对照表...
  • Android4.0 SDK新功能详解
  • MyEclipse 7.0下载 + 汉化 + doc汉化
  • 手机游戏无障碍设计——猜地鼠之Android篇
  • 从0到1手把手教你搭建个人博客
  • 油动无人机的优点有哪些?油动多旋翼无人机的优缺点及前景分析
  • 实践是检验真理的唯一标准!!交换机VLAN相关配置案例!
  • 腾讯应用宝Android 应用加固(乐固)操作说明(转)
  • 光盘如何重装系统教程
  • 个人怎么申请支付接口平台(教程)
  • 基于微信小程序的智能停车场管理系统的设计与实现
  • 推荐几款2024年最新开源API测试工具!
  • HTTP代理神器Fiddler
  • 三种经典“返回顶部”效果的代码
  • Web安全 EmpireCMS漏洞常见漏洞分析及复现(1)
  • vue项目main.js使用方法
  • XMLHttpRequest读取xml乱码及请求封装
  • onmouseover、onmouseenter、onmouseleave、onmouseout的区别