【爬虫小程序:爬取斗鱼所有房间信息】Xpath

# 本程序亲测有效,用于理解爬虫相关的基础知识,不足之处希望大家批评指正
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()
原文地址:https://www.cnblogs.com/888888CN/p/9792819.html