用Python爬取斗鱼网站的一个小案例
思路解析:
1、我们需要明确爬取数据的目的:为了按热度查看主播的在线观看人数
2、浏览网页源代码,查看我们需要的数据的定位标签

3、在代码中发送一个http请求,获取到网页返回的html(需要注意的是,许多网页都有反爬虫机制,所以需要在请求中添加user-agent,伪装成客户端访问)
4、对获取到的html进行分析,使用正则表达式提取我们需要的部分(需要注意的是要把主播名称和观看人数所在的块整个提取,分别提取的话如果网页设计不规律的话很难对应)
5、将得到的单个主播的数据存储在字典中,并把所有主播的数据存储在list中
6、如果抓取到的数据中包含空格换行等无用字符,还需要对数据进行精炼。
7、对抓取到的数据从大到小进行排序(需要注意的是:我们抓取到的数据是字符串,并且单位可能是人或者万人,所以要对观看人数进行处理)
8、将排好序的数据遍历输出。
由于斗鱼网站的网页是采用模板实现的,案例是抓取王者荣耀的主播的数据,想抓取别的类目的话,只需要修改url即可~
代码实现:
'''
爬取斗鱼网站的王者荣耀分类主播的观看人数和主播名字,并按热度排名
'''
from urllib import request
from io import BytesIO
import gzip
import re class Spider():
url = 'https://www.douyu.com/g_wzry' # 根节点的字符串匹配正则表达式,匹配除了根节点中间的所有字符,非贪婪模式,找到第一个</div>就结束
root_pattern = '<div class="DyListCover-info">([\s\S]*?)</div>' headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36'} # 观看人数匹配字符串
number_pattern_str = '<span class="DyListCover-hot is-template">([\s\S]*?)</span>'
# 观看人数的字符串,删除前面的icon部分
number_pattern = '<svg><use xlink:href="#icon-hot_8a57f0b"></use></svg>' name_pattern_str = '<h2 class="DyListCover-user is-template">([\s\S]*?)</h2>'
name_pattern = '<svg><use xlink:href="#icon-user_c95acf8"></use></svg>' # 抓取自定网页内容并解码
def __fetch_content(self):
# 发送一个http的请求,获取返回的html代码
req = request.Request(Spider.url, headers=Spider.headers)
htmls = request.urlopen(req).read() # 解码
buff = BytesIO(htmls)
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)
# 由于网页中一个块有两个相同的class类,其中第一个主播介绍
# 第二个才是需要的数据,所以选取奇数下标元素
root_info_html = root_html[1::2] # 最后获取到的数据列表
anchors = []
# 遍历列表,提取用户名和观看人数
for html in root_info_html:
# 提取到的是带icon的部分
watch_num_str = re.findall(Spider.number_pattern_str, html)
# 剔除icon部分
watch_num = re.sub(Spider.number_pattern, '', watch_num_str[0]) # 提取带icon的name的部分
name_str = re.findall(Spider.name_pattern_str, html)
name = re.sub(Spider.name_pattern, '', name_str[0]) # 将名字和观看人数用字典存储,最后再用列表存储每个主播的数据
anchor = {'name': name, 'number': watch_num}
anchors.append(anchor) return anchors # 精炼函数
# def __refine(self, anchors):
# lam = lambda anchor: {'name': anchor['name'][0], 'number': anchor['number'][0]}
# return map(lam, anchors) # 排序
def __sort(self, anchors):
anchors = sorted(anchors, key=self.__sort_key, reverse=True)
return anchors # 排序规则
def __sort_key(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 anchor in anchors:
# print(anchor['name'], ':', anchor['number'])
for rank in range(0, len(anchors)):
print("Rank ", rank+1, ": ", anchors[rank]['name'], " ", anchors[rank]['number']) # 入口方法
def go(self):
htmls = self.__fetch_content()
anchors = self.__analysis(htmls)
anchors = self.__sort(anchors)
self.__show(anchors) spider = Spider()
spider.go()
用Python爬取斗鱼网站的一个小案例的更多相关文章
- python爬取某个网站的图片并保存到本地
python爬取某个网站的图片并保存到本地 #coding:utf- import urllib import re import sys reload(sys) sys.setdefaultenco ...
- 利用Python爬取电影网站
#!/usr/bin/env python #coding = utf-8 ''' 本爬虫是用来爬取6V电影网站上的电影资源的一个小脚本程序,爬取到的电影链接会通过网页的形式显示出来 ''' impo ...
- Python爬取招聘网站数据,给学习、求职一点参考
1.项目背景 随着科技的飞速发展,数据呈现爆发式的增长,任何人都摆脱不了与数据打交道,社会对于“数据”方面的人才需求也在不断增大.因此了解当下企业究竟需要招聘什么样的人才?需要什么样的技能?不管是对于 ...
- Python爬取mn52网站美女图片以及图片防盗链的解决方法
防盗链原理 http标准协议中有专门的字段记录referer 一来可以追溯上一个入站地址是什么 二来对于资源文件,可以跟踪到包含显示他的网页地址是什么 因此所有防盗链方法都是基于这个Referer字段 ...
- python爬取招聘网站数据
# -*- coding: utf-8 -*- # 爬虫分析 from bs4 import BeautifulSoup from lxml import etree from selenium im ...
- Python爬取某网站文档数据完整教程(附源码)
基本开发环境 (https://jq.qq.com/?_wv=1027&k=NofUEYzs) Python 3.6 Pycharm 相关模块的使用 (https://jq.qq.com/?_ ...
- python爬取斗鱼B总直播弹幕
在某群中看到关于弹幕爬取的需求,又因为斗鱼比较OP,就以这个作为切入点. 如果你想了解如何获取弹幕,我的这个例子就可以让你豁然开朗,对于哪些没有开发弹幕的直播或视频平台,就需要用抓包工具获取请求,然后 ...
- python爬取电影网站信息
一.爬取前提1)本地安装了mysql数据库 5.6版本2)安装了Python 2.7 二.爬取内容 电影名称.电影简介.电影图片.电影下载链接 三.爬取逻辑1)进入电影网列表页, 针对列表的html内 ...
- python爬取视频网站m3u8视频,下载.ts后缀文件,合并成整视频
最近发现一些网站,可以解析各大视频网站的vip.仔细想了想,这也算是爬虫呀,爬的是视频数据. 首先选取一个视频网站,我选的是 影视大全 ,然后选择上映不久的电影 “一出好戏” . 分析页面 我用的是c ...
随机推荐
- LeetCode-056-合并区间
合并区间 题目描述:以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] .请你合并所有重叠的区间,并返回一个不重叠的区间数组, ...
- RENIX软件连接机箱测试RTSM基本操作——网络测试仪实操
本文主要介绍了RENIX软件RTSM功能连接机箱测试的基本操作.文章分为三部分内容,第一部分为RTSM功能简介,第二部分为RTSM原理简介,第三部分为RTSM测试方案的具体介绍. 第一部分.RTSM功 ...
- Scala语法2
练习 package scala_01.practice import org.junit.{Before, Test} import scala.collection.immutable impor ...
- Xmake 和 C/C++ 包管理
Xmake 是一个基于 Lua 的轻量级跨平台构建工具,关于 Xmake 与构建系统的介绍,我们已经在之前的文章中做了详细的介绍:C/C++ 构建系统,我用 xmake. 如果大家已经对 Xmake ...
- laravel报错 : laravel Please provide a valid cache path
这是因为laravel的缓存路径没有找到 laravel缓存文件路径是在 config/cache.php中设置,默认存在storage文件夹中 'file' => [ 'driver' =&g ...
- js格式化树形数据(扁平化数据)
需求: 1.把如下数据按照parent_id等于id的规则建立父子关系 2.同一层级的数组按照order升序 [ { "id": 1, "name": &quo ...
- tensorflow源码解析之framework-graph
目录 什么是graph 图构建辅助函数 graph_transfer_info 关系图 涉及的文件 迭代记录 1. 什么是graph graph是TF计算设计的载体,如果拿TF代码的执行和Java代码 ...
- 4、mysql的存储引擎
存储引擎 存储引擎是负责对表中的数据进行提取和写入工作的,我们可以为不同的表设置不同的存储引擎,也就是说不同的表可以有不同的物理存储结构,不同的提取和写入方式. 1.1 InnoDB 引擎:具备外键支 ...
- 原生 JS 实现 VS Code 自动切换输入法状态!这次没有AHK
上一篇文章:使用 AHK 在 VS Code 中根据上下文自动切换输入法状态 给出一个使用 ahk 在 VSCode 自动切换输入法的方法.不过这个方法实际上很蹩脚,一点都不优(zhuang)雅(bi ...
- RESTful API设计规范总结
RESTful 是目前最流行的 API 设计规范,用于 Web 数据接口的设计. 它的大原则容易把握,但是细节不容易做对.本文总结 RESTful 的设计细节,介绍如何设计出易于理解和使用的 API. ...