用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 ...
随机推荐
- 面试题--Nginx
Nginx面试题 整理自网络,侵权删 1.请解释一下什么是Nginx? Nginx是一个web服务器和反向代理服务器,用于http.https.smtp.pop3和IMAP协议 2.请列举Nginx的 ...
- laravel7 验证器的使用
$validator=\Validator::make($request->all(),[ 'username'=>'required', 'password'=>'required ...
- CF1327F题解
首先第一步,位运算拆位.变为一个区间的 \(And\) 为 \(0\) 或 \(1\). 如果 \(And\) 为 \(1\),那么所有数都需要为 \(1\),否则为 \(0\). 我们把所有可能为 ...
- WPF 可视化树的用途
1.可视化树的主要用途: 1.可以使用样式改变可视化树中的一个元素.可以使用Style.TargetType属性选择希望修改 的特定元素.甚至当控件属性发生变化时,可以使用触发器自动完成更改. 2.可 ...
- exit函数和return语句
exit函数是c语言的库函数,有一个整型的参数,代表进程终止,这个函数需<stdlib.h>头文件 在函数中写return只是代表函数终止了,不管在程序的任何位置调用exit那么进程就立即 ...
- web服务器-Nginx URL重写
web服务器-Nginx URL重写 一. URL重写介绍 和apache等web服务软件一样,rewrite的主要功能是实现URL地址的重定向.Nginx的rewrite功能需要PCRE软件的支持, ...
- Apache+PHP+Mysql安装手册(Linux)
一. 检查系统环境 1.确认centos版本 [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Co ...
- [转载]nc命令详解
最近在搞反向连接,试来试去发现最好的工具还是nc.正好趁这个机会把nc的用法总结一下: 1.端口扫描: nc -vv ip port 例:nc -vv 192.168.1.1 5000 扫描192.1 ...
- web测试知识点整理
web是如何测试的? 1. 通用功能测试和可用性测试 2. 性能测试和安全性测试 3. 兼容性测试 4. 数据库和稳定性测试等 web功能测试怎么测? 从一下几个方面来进行WEB测试: 1. 链接测试 ...
- HTTP与HTTPS有什么区别
超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂 ...