Python 爬虫 之 Selenium 模拟打开操作浏览器爬取斗鱼全部视播相关信息,并json保存信息
Python 爬虫 之 Selenium 模拟打开操作浏览器爬取斗鱼全部视播相关信息,并json保存信息
基础: Python 爬虫 之 Selenium、webdriver 的安装,以及模拟打开操作浏览器的简单实现
目录
Python 爬虫 之 Selenium 模拟打开操作浏览器爬取斗鱼全部视播相关信息,并json保存信息
一、简单介绍
Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。
爬虫:一段自动抓取互联网信息的程序,从互联网上抓取对于我们有价值的信息。
Selenium [1] 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。
二、知识点
1、selenium 进行网页数据请求获取,并翻页;
2、xpath 方式解析的数据、并json形式保存到本地;
3、类 与 函数的封装(面向对象);
4、time.sleep() 的使用;
三、注意事项
1、time.sleep() 合理使用,适当休眠,等待数据加载,不然可能来不及获取数据
2、selenium 使用 xpath 查找内容时,在查找后的结果中在查找,注意有时候要加上必要的 "." 开始
例如:li.find_element_by_xpath(".//img[@class='DyImg-content is-normal ']")
3、selenium 使用了模拟打开浏览器的方式获取数据,所以数据需要加载,或取速度不是很快,且可能获取不到数据,请注意,结合 time.sleep() 合理使用
4、为了判断是否获取正确,可以必要添加打印信息检验
四、效果预览
五、实现步骤
简单分析实现原理:
1)首先使用 "https://www.douyu.com/directory/all" 获取首页网页信息,然后查找对应信息,并自动查找下一页按钮点击翻页
2)视频列表查找格式:self.driver.find_elements_by_xpath("//ul[@class='layout-Cover-list']/li") ;
3)房间的信息查找格式如下:
item["room_img"] = li.find_element_by_xpath(".//img[@class='DyImg-content is-normal ']").get_attribute("src")
item["room_title"] = li.find_element_by_xpath(".//h3[@class='DyListCover-intro']").get_attribute("title")
item["room_owner"] = li.find_element_by_xpath(".//h2[@class='DyListCover-user']").text
item["room_zone"] = li.find_element_by_xpath(".//span[@class='DyListCover-zone']").text
item["room_watch_hot"] = li.find_element_by_xpath(".//span[@class='DyListCover-hot']").text
4)下一页查找的格式:next_url = self.driver.find_elements_by_xpath("//li[@class=' dy-Pagination-next']")
判断是否找到下一页按钮:next_url = next_url[0] if len(next_url) > 0 else None
点击方式:next_url.click()
5)信息保存方式:
with open("./douyuallinfo.txt", "a", encoding="utf-8") as f:
json.dump(content_list, f, indent=4, ensure_ascii=False)
具体实现:
1、打开网页 https://www.douyu.com/directory/all ,查看元素(浏览器不同,可能不叫查看元素),进行分析,如下图
2、分析得到,视频列表在 <ul class="layout-Cover-list">...</ul> 里面,如下图
3、分析得到,视频相关图片信息 <img class="DyImg-content is-normal" src="...">...,如下图
4、分析得到,视频相关标题信息 <h3 class="DyListCover-intro" title="...">...,如下图
5、分析得到,视频相关主题信息 <span class="DyListCover-zone">...,如下图
6、分析得到,视频相关房主信息 <h2 class="DyListCover-user">...,如下图
7、分析得到,视频相关房间观热度信息 <span class="DyListCover-hot">...,如下图
8、分析得到,下一页按钮 <li class=" dy-Pagination-next">...,如下图
9、分析得到,最后一页的下一页按钮为 <li class="dy-Pagination-disabled dy-Pagination-next">... 与前面的不一致,就可以做为区别是否到最后一页了,如下图
10、根据以上开始编写代码,打开 Pycharm,新建工程,如下图
11、新建一个 python 文件,并设置为 run ,如下图
12、通过以上分析,实现相关逻辑代码,运行脚本效果见预览效果,结果如下图
六、关键代码
import json
from selenium import webdriver
import time
class DouyuSpider: # 获取斗鱼全视频相关信息
def __init__(self):
# 斗鱼全视频网址
self.start_url = "https://www.douyu.com/directory/all"
# 启动火狐浏览器
self.driver = webdriver.Firefox()
def get_content_list(self):
"""
获取视频列表信息
:return: 返回视频列表信息,和下一下按钮
"""
li_list = self.driver.find_elements_by_xpath("//ul[@class='layout-Cover-list']/li")
print(li_list)
content_list = []
for li in li_list:
item = {}
item["room_img"] = li.find_element_by_xpath(".//img[@class='DyImg-content is-normal ']").get_attribute("src")
item["room_title"] = li.find_element_by_xpath(".//h3[@class='DyListCover-intro']").get_attribute("title")
item["room_owner"] = li.find_element_by_xpath(".//h2[@class='DyListCover-user']").text
item["room_zone"] = li.find_element_by_xpath(".//span[@class='DyListCover-zone']").text
item["room_watch_hot"] = li.find_element_by_xpath(".//span[@class='DyListCover-hot']").text
print(item)
content_list.append(item)
# 获取下一页按钮,判断是否存在
next_url = self.driver.find_elements_by_xpath("//li[@class=' dy-Pagination-next']")
next_url = next_url[0] if len(next_url) > 0 else None
return content_list, next_url
def save_content_list(self, content_list):
"""
保存信息
:param content_list: 保存内容
"""
with open("./douyuallinfo.txt", "a", encoding="utf-8") as f: # 打开文件
json.dump(content_list, f, indent=4, ensure_ascii=False) # json 格式保存
def run(self):
# 1、 start_url 获取初始 html
self.driver.get(self.start_url)
# 休眠 3 s 等待数据加载,不然可能来不及获取数据
time.sleep(3)
# 2、 提取当前数据,并获取下一页数据
content_list, next_url = self.get_content_list()
# 3、 保存数据
self.save_content_list(content_list)
# 4、 循环获取下一页数据
while next_url is not None:
next_url.click()
# 休眠 3 s 等待数据加载
time.sleep(3)
# 2、 提取当前数据,并获取下一页数据
content_list, next_url = self.get_content_list()
# 3、 保存数据
self.save_content_list(content_list)
# 退出火狐浏览器
self.driver.quit()
if __name__ == "__main__":
douyu = DouyuSpider()
douyu.run()