本次通过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模块正则解析实现对斗鱼直播数据抓取并持久化存储相关推荐

  1. Python爬虫入门教程【18】: 36氪(36kr)数据抓取 scrapy

    1. 36氪(36kr)数据----写在前面 今天抓取一个新闻媒体,36kr的文章内容,也是为后面的数据分析做相应的准备 36kr 让一部分人先看到未来,而你今天要做的事情确实要抓取它的过去. 网址 ...

  2. Python爬虫入门教程 32-100 B站博人传评论数据抓取 scrapy

    1. B站博人传评论数据爬取简介 今天想了半天不知道抓啥,去B站看跳舞的小姐姐,忽然看到了评论,那就抓取一下B站的评论数据,视频动画那么多,也不知道抓取哪个,选了一个博人传跟火影相关的,抓取看看.网址 ...

  3. python爬虫专家_Python爬虫入门教程 27-100 微医挂号网专家团队数据抓取pyspider

    1. 微医挂号网专家团队数据----写在前面 今天尝试使用一个新的爬虫库进行数据的爬取,这个库叫做pyspider,国人开发的,当然支持一下. 安装起来是非常简单的 pip install pyspi ...

  4. python爬b站评论_Python爬虫入门教程 32-100 B站博人传评论数据抓取 scrapy

    1. B站博人传评论数据爬取简介 今天想了半天不知道抓啥,去B站看跳舞的小姐姐,忽然看到了评论,那就抓取一下B站的评论数据,视频动画那么多,也不知道抓取哪个,选了一个博人传跟火影相关的,抓取看看.网址 ...

  5. Python爬虫入门教程 27-100 微医挂号网专家团队数据抓取pyspider

    1. 微医挂号网专家团队数据----写在前面 今天尝试使用一个新的爬虫库进行数据的爬取,这个库叫做pyspider,国人开发的,当然支持一下. github地址: https://github.com ...

  6. python爬虫专家_Python爬虫入门教程:微医挂号网专家团队数据抓取pyspider

    1. 微医挂号网专家团队数据----写在前面 今天尝试使用一个新的爬虫库进行数据的爬取,这个库叫做pyspider,国人开发的,当然支持一下. github地址: https://github.com ...

  7. python爬虫专家_Python爬虫入门教程 27-100 微医挂号网专家团队数据抓取pyspider-阿里云开发者社区...

    1. 微医挂号网专家团队数据----写在前面 今天尝试使用一个新的爬虫库进行数据的爬取,这个库叫做pyspider,国人开发的,当然支持一下. 安装起来是非常简单的 pip install pyspi ...

  8. 爬虫-基于requests模块xpath解析爬取豆瓣即将上映电影目录

    首先,我们要确定要爬取的对象,然后确定我们需要的数据,要有针对性的去分析,打开豆瓣网查看 在这里我们可以看到即将上映的电影不多呀,先试试这个吧- 右键检查,打开开发者模式 此时点击NETWORK选项是 ...

  9. Python爬虫实战:炉石传说卡牌、原画数据抓取

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 原画爬取 先看一下炉石传说的原画: 炉石传说原画链接: http://news. ...

  10. python实现get请求 模块_python爬虫 基于requests模块发起ajax的get请求实现解析

    基于requests模块发起ajax的get请求 需求:爬取豆瓣电影分类排行榜 https://movie.douban.com/中的电影详情数据 用抓包工具捉取 使用ajax加载页面的请求 鼠标往下 ...

最新文章

  1. Java集合干货——ArrayList源码分析
  2. 解读eXtremeComponents代码结构--转载
  3. Mac 完全卸载 Java
  4. SAP中程序间的相互调用,SUBMIT关键字的用法
  5. Oracle数据库权限管理
  6. 31/100. Palindromic Substrings
  7. python爬虫有道词典_Python爬取有道词典,有道的反爬很难吗?也就这样啊!
  8. 启动和停止mysql服务器_MySQL服务器的启动与关闭方法
  9. 【图像去噪】基于matlab小波变换+Contourlet变换+PCA图像去噪【含Matlab源码 610期】
  10. 虚拟试衣软件的实现方式
  11. 基于树莓派的蓝牙音频接收器
  12. 卖租房子房产中介管理系统平台小程序app开发搭建
  13. Off the coast 将图片放入Markdown!
  14. 据说Kivy可以将Python程序弄成App来玩,所以 安装Kivy。关于安装Kivy失败后的解决方案过程
  15. java解压出来损坏_在Java中解压缩错误
  16. C | C++定义全局变量的方法
  17. Android兴趣选择功能的实现
  18. 百兆以太网传输距离_网线有哪几种有效传输距离是多少米
  19. 【5万字】文件增量复制【OS库、Tkinter库等】
  20. 用c语言试完成九九乘法口诀表中倒直三角形,

热门文章

  1. 同舟共济,抗战台风,海航好不好
  2. 计算机网络基本用语概述
  3. Cyanine5 amine,1807529-70-9,花菁染料Cy5-氨基,Cy5 NH2,amine-Cy5
  4. 禅道BUG提出及处理流程规范
  5. 和腾讯大佬的技术面谈,爱了爱了
  6. 关于安全人体安全电流的一些数值
  7. Opencascad开发(C++)-数据类型转换-Shape、Verterx和gp_pnt的转化
  8. 64、基于51单片机语音录音存储与放音回放系统设计
  9. js逆向-猿人学(12-13)简易Js
  10. 用C#实现索贝尔算子