from selenium import webdriver
import time
#导入 ActionChains 类
from selenium.webdriver import ActionChains
import json
import re
import requests
class DouYuSpider():
def __init__(self):
#初始化google浏览器驱动对象和起始请求url并发起请求
self.driver = webdriver.Chrome("D:/chromedriver_win32/chromedriver.exe")
self.start_url = "https://www.douyu.com/directory/all"
self.driver.get(self.start_url)
def get_content(self):
#将浏览器窗口设置为最大
self.driver.maximize_window()
#睡眠2秒等待加载
time.sleep(2)
#获取当前页的全部li元素(一个li内包含一个直播房间的信息)
li_list = self.driver.find_elements_by_xpath("//div[@class='layout-Module-container layout-Cover ListContent']/ul[@class='layout-Cover-list']/li")
#遍历全部li获取房间详细信息
for index, li in enumerate(li_list):
if index % 4 == 0:
#当索引号为4的整数倍时移动一次鼠标,这是由于分析发现房间的图片url只有在浏览器窗口可见的区域才能获取到,故每获取一行4个房间信息时将鼠标移动一次以使当前欲获取的房间信息显现在窗口可视区域
ActionChains(self.driver).move_to_element(li).perform()
#以字典形式保存房间详细信息
item = {}
item["title"] = li.find_element_by_xpath(".//h3[@class='DyListCover-intro']").text
item["classical"] = li.find_element_by_class_name("DyListCover-zone").text
item["name"] = li.find_element_by_class_name("DyListCover-user").text
item["audience_num"] = li.find_element_by_class_name("DyListCover-hot").text
item["img_src"] = li.find_element_by_xpath(".//div[@class='LazyLoad is-visible DyImg DyListCover-pic']/img").get_attribute("src")
#调用保存方法将数据以json格式写入本地文件
self.save_content(item)
def save_img(self, title, url):
#保存图片到本地,将title的特殊符号剔除(文件名不得包含特殊符号)
title = re.sub(r"[^\u4E00-\u9FFF]", "", title)
file_name = title + ".png"
with open("./data/douyu_img/" + file_name, "wb") as fp:
fp.write(requests.get(url).content)
def save_content(self, data):
#保存数据到本地json文件
with open("./data/douyu.json", "a", encoding="utf-8") as fp:
json.dump(data, fp, ensure_ascii=False)
fp.write("\n")
self.save_img(data["title"], data["img_src"])
print(data["title"] + "写入成功...")
def run(self):
#首次获取数据
self.get_content()
#存在下一页时点击下一页继续抓取数据
while self.driver.find_element_by_class_name("dy-Pagination-next"):
self.driver.find_element_by_class_name("dy-Pagination-next").click()
self.get_content()
dys = DouYuSpider()
dys.run()
爬取json文件如下:
保存图片如下: