# 本程序亲测有效,用于理解爬虫相关的基础知识,不足之处希望大家批评指正
from selenium import webdriver
import time
class Douyu:
"""爬取斗鱼房间信息"""
def __init__(self):
# 爬取目标
self.url = 'https://www.douyu.com/directory/all'
# 获取浏览器对象
self.driver = webdriver.Chrome()
def get_element_list(self):
"""获取数据"""
# 定位数据节点
li_list = self.driver.find_elements_by_xpath('//ul[@id="live-list-contentbox"]/li')
content_list = list()
for li in li_list: # 此时得到的是一条条的elememt,html节点
# 我们要获取li中的那些数据呢?
# 房间号:,主播id:,房间名:,粉丝数:,房间链接:等等根据业务需要获取
# 成对出现的数据,所以选择使用字典保存每个房间的数据信息
item = dict()
item["room_id"] = li.find_element_by_xpath('./a').get_attribute('data-rid')
item["auther"] = li.find_element_by_xpath('.//span[@class="dy-name ellipsis fl"]').text
item["room_title"] = li.find_element_by_xpath('./a').get_attribute('title')
item["fans_count"] = li.find_element_by_xpath('.//span[@class="dy-num fr"]').text
item["room_link"] = li.find_element_by_xpath('./a').get_attribute('href')
print(item)
# 此时单个房间的信息已经封装完毕
# 应该将所有房间的信息封装起来,便于随时取用,由于每个房间信息相当于一个元素,所以我们可以用列表或者元组来保存
content_list.append(item) # 此时我们的到的只是一页的数据,如何的到所有数据呢?或者说怎样访问下一页?
# print(content_list)
# 获取下一页按钮元素
next_url = self.driver.find_elements_by_xpath('//a[@class="shark-pager-next"]')[0]
# 注意:这里为什么用的是elements而不是element,原因是:如果我们获取到最后一页时:这个下一页按钮就不存在了,
# 用element的话就会报错,用elements就不会报错
# 因为elements获取到的是一个列表,而这个列表就一个元素,所以我们就直接取列表的第0位就可以了
print(next_url)
# 将获取到的数据返回
return content_list,next_url
def save_contents(self,content_list):
"""保存数据"""
pass
def run(self): # 主函数逻辑
try:
# 向目标发起访问
self.driver.get(self.url)
# 获取数据
content_list,next_url = self.get_element_list() # 接收函数返回的结果
# 保存数据
self.save_contents(content_list)
while next_url is not None:
# 访问下一页
next_url.click() # 点击下一页就相当于向一个新的页面发起请求
# 跳转到下一页之后,等待页面加载完毕,否则获取不到数据,然后报错
time.sleep(3)
# 获取数据
content_list,next_url = self.get_element_list() # 接收函数返回的结果
# 保存数据
self.save_contents(content_list)
except Exception as e:
# 退出浏览器
self.driver.close()
else:
# 退出浏览器
self.driver.close()
if __name__ == '__main__':
# 创建对象
douyu = Douyu()
# 运行程序
douyu.run()