爬虫-基于selenium模块正则解析实现对斗鱼直播数据抓取并持久化存储

本文主要是介绍爬虫-基于selenium模块正则解析实现对斗鱼直播数据抓取并持久化存储,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本次通过selenium插件来实现爬虫,selenium个人感觉还是很不错的,官方文档,其实看文档还是很有用的,这个习惯可以有

首先老规矩分析目标网站
目标网站:斗鱼直播 https://www.douyu.com/directory/all
目标数据:直播间名称,直播间类型,主播名称,房间人数(这个不清楚到底是个啥,反正数值很大)
1,首先做个架子
在这里插入图片描述
2,分析目标网站
在这里插入图片描述
打开开发者模式之后,点击小箭头然后鼠标点击哪里,对应的元素就会高亮,我们先找到目标元素的位置,我这里用的正则去匹配的
在这里插入图片描述
其实还有很多的匹配元素的方法呀,基本上我都试过,看个人喜好吧,感兴趣的可以去试一下,这些都不是重点,重点是翻页,斗鱼直播点击下一页的时候它不会跳转的,还有就是你要是一直往下爬的话,你停止的条件时什么,总不能爬取一页吧,这里我们看下网页元素
在这里插入图片描述
这里可以看到,点击下一页的这个动作,可以由这个span标签的值来执行,我们再去看span上一级 li标签内有个属性的值 是 ‘false’是吧,我翻到最后一页看过,到最后一页还是会有这个span标签,但是这个li 标签内的 false 就变为 true了,我想到这里大家应该明白,这个值可以作为一个来判断是否是最后一页的标准了
(我是这么想的,也是这么做的,有想法的可以去试下…)

这里我们可以总结一下,当 li 标签内的aria-disabled属性的值=false的话,即代表还有下一页,我们可以点击span标签翻页,当aria-disabled属性的值= true 的话,即代表没有 下一页了,暂时先这样理解吧,到底行不行,实践出真知,要善于提出合理性的假设…
在这里插入图片描述
我是先做出判断,后解析数据,这里做判断的时候我是在谷歌上面直接将xpath路径直接复制过来的,将鼠标移至元素位置 右击-copy-copy xpath即可,这样稳妥一点,先上一波源码,其实还可以优化下

from selenium import webdriver
import re
import time

class DouSpider(object):

def __init__(self):self.url = 'https://www.douyu.com/directory/all'self.driver_path = r'E:\DownloadFile\chromedriver.exe'self.driver = webdriver.Chrome(executable_path=self.driver_path)def get_page(self):data = self.driver.page_sourcepatter = re.compile('<li class="layout-Cover-item">.*?<''span class="DyListCover-zone">(.*?)''</span>.*?title="(.*?)".*?</svg>(.*?)''</span>.*?</svg>(.*?)</h2>', re.S)data_list = re.findall(patter, data)dict_data = []for i in data_list:anchor = {'type': i[0].strip(), 'room_name': i[1].strip(), 'peoples': i[2].strip(), 'name': i[3].strip()}dict_data.append(anchor)return dict_datadef next_page(self):passdef save_data(self):passdef run(self):self.driver.get(self.url)time.sleep(3)# 判断是否有下一页li = self.driver.find_element_by_xpath('//*[@id="listAll"]/section[2]/div[2]/div/ul/li[9]')lis = li.get_attribute("aria-disabled")while 'false' in lis:# 解析数据data = self.get_page()print(data)time.sleep(2)# 点击翻页div = self.driver.find_element_by_xpath('//span[contains(text(), "下一页")]')div.click()

if name == ‘main’:
spider = DouSpider()
spider.run()

结果还是有的,翻到20多页我就停了,后续可以存储到mysql中…
在这里插入图片描述
这个代码问题还是有,还有优化空间,整个动图瞅一眼效果咋样,还希望大家留言多多指教…
(这里还需要补充一点,在程序的末尾,我忘记退出浏览器了,应该在 while循环外部 加一个self.driver.quit())
在这里插入图片描述
补充完善:
今天优化并补全代码,将抓取到的数据建库存档
首先要先在建立好数据库,这里最好是在数据库里面自己操作比较好,然后在代码里面我们只需要连接就好了,这里代码中添加了一个插入sql语句的函数
在这里插入图片描述
然后在解析函数这里实现调用,解析一行存储一行
在这里插入图片描述
特别注意一点,这里存储的时候很容易报错:1366-Incorrect string value:’\xE6\x9D\x8E\xE5\xAD\xA6…'for column ‘name’ at row 1,我找了很多资料,要把数据库 和表还有字段的编码格式都改成utf8即可,
修改字段编码格式:
alter table anchor_page change 字段 字段 varchar(255) character set utf8;
修改表编码格式:
alter table 表名 default character set utf8;
修改库编码格式:
alter database 库名 character set utf8
代码运行完成之后查看数据库结果
在这里插入图片描述
这里还是把修改过的代码放上来
from selenium import webdriver
import re
import time
from pymysql import connect

class DouSpider(object):

def __init__(self):self.url = 'https://www.douyu.com/directory/all'self.driver_path = r'E:\DownloadFile\chromedriver.exe'self.driver = webdriver.Chrome(executable_path=self.driver_path)self.conects = connect(host='localhost', port=3306, user='root', password='19940825', database='test', charset='utf8')self.cursors = self.conects.cursor()# 解析数据
def get_page(self):list_ls = []data = self.driver.page_sourcepatter = re.compile('<li class="layout-Cover-item">.*?<''span class="DyListCover-zone">(.*?)''</span>.*?title="(.*?)".*?</svg>(.*?)''</span>.*?</svg>(.*?)</h2>', re.S)data_list = re.findall(patter, data)for i in data_list:# 将一页的数据按条取出one_list = [i[0].strip(), i[1].strip(), i[2].strip(), i[3].strip()]#  将数据存储self.save_data(one_list)# 判断下一页是否有数据,有则点击下一页
def next_page(self):pass# 保存数据到数据库
def save_data(self, data):try:sql = '''insert into anchor_page values (0, %s, %s, %s, %s);'''self.cursors.execute(sql, data)self.conects.commit()except Exception as f:print(f)def run(self):self.driver.get(self.url)time.sleep(3)# self.create_tables()# 判断是否有下一页li = self.driver.find_element_by_xpath('//*[@id="listAll"]/section[2]/div[2]/div/ul/li[9]')lis = li.get_attribute("aria-disabled")page = 1while 'false' in lis:# 解析数据self.get_page()# 存储数据print('第 %s 页数据存储成功......' % page)page += 1time.sleep(2)# 点击翻页div = self.driver.find_element_by_xpath('//span[contains(text(), "下一页")]')div.click()self.cursors.close()self.conects.close()self.driver.quit()

if name == ‘main’:
spider = DouSpider()
spider.run()

这篇关于爬虫-基于selenium模块正则解析实现对斗鱼直播数据抓取并持久化存储的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/391608

相关文章

Java注解之超越Javadoc的元数据利器详解

《Java注解之超越Javadoc的元数据利器详解》本文将深入探讨Java注解的定义、类型、内置注解、自定义注解、保留策略、实际应用场景及最佳实践,无论是初学者还是资深开发者,都能通过本文了解如何利用... 目录什么是注解?注解的类型内置注编程解自定义注解注解的保留策略实际用例最佳实践总结在 Java 编程

Python中模块graphviz使用入门

《Python中模块graphviz使用入门》graphviz是一个用于创建和操作图形的Python库,本文主要介绍了Python中模块graphviz使用入门,具有一定的参考价值,感兴趣的可以了解一... 目录1.安装2. 基本用法2.1 输出图像格式2.2 图像style设置2.3 属性2.4 子图和聚

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1