1.爬取之前的准备
在爬取之前,现有安装好2个东西:Selenium和PhantomJS,安装方法见我之前的博客:https://blog.csdn.net/ywk_hax/article/details/82556679;
当然phantomJS也可以用别的浏览器替代,根据自己的浏览器安装相应的driver即可,如firefox对应的driver:geckodriver
2.代码如下:
import time
from selenium import webdriver
class DouyuSpider(object):
def __init__(self):
# 准备 start_url
self.start_url = "https://www.douyu.com/directory/all"
self.drive = webdriver.Firefox()
def get_content_list(self):
# 注意:find_elements_by_xpath获取的是列表
# find_element_by_xpath获取的是一个FirefoxWebElement对象
li_list = self.drive.find_elements_by_xpath('//ul[@id="live-list-contentbox"]/li')
# print(li_list)
# 定义一个列表保存所有房间的信息
content_list = []
for li in li_list:
# 定义一个字典保存当前房间的所有信息
item = {}
# 由于网络的原因,加上等待时间还不够的,会出现问题匹配不带,就跳过这条 ,网速快的可以忽略
try:
# 房间图片
item['直播间封面'] = li.find_element_by_xpath('.//span[@class="imgbox"]/img').get_attribute('src')
# 房间名
item['房间名'] = li.find_element_by_xpath('./a').get_attribute('title')
# 游戏分类
item["直播类别"] = li.find_element_by_xpath('.//span[@class="tag ellipsis"]').text
# 主播名字
item["主播名"] = li.find_element_by_xpath('.//span[@class="dy-name ellipsis fl"]').text
# 观看人数
item["观看人数"] = li.find_element_by_xpath('.//span[@class="dy-num fr"]').text
# print(item)
# 将信息添加到列表中
content_list.append(item)
except:
pass
# 将当前页面的所有房间获取完后,获取下一页的元素,返回一个列表
next_url = self.drive.find_elements_by_xpath('//a[@class="shark-pager-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):
for item in content_list:
with open('douyu.txt', 'a',encoding='utf8') as f:
f.write(str(item) + '\n')
def run(self):
"""实现主要逻辑"""
# 1.start_url
# 2.发送请求,获取响应
self.drive.get(self.start_url)
# 3.提取数据,提权下一页的按钮
content_list, next_url = self.get_content_list()
# 4.保持数据
self.save_content_list(content_list)
# 5.点击下一页元素,循环
while next_url is not None:
next_url.click()
# 由于我这 每次点击下一页之后停留三秒,保证页面更新完整
time.sleep(3)
content_list, next_url = self.get_content_list()
self.save_content_list(content_list)
if __name__ == '__main__':
doouyu_spider = DouyuSpider()
doouyu_spider.run()
3.爬取结果
如果你和我有共同爱好,我们可以加个好友一起交流!