案例_使用Selenium与PhantomJS爬取斗鱼房间信息

1.爬取之前的准备


     在爬取之前,现有安装好2个东西:SeleniumPhantomJS,安装方法见我之前的博客: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.爬取结果

如果你和我有共同爱好,我们可以加个好友一起交流!

猜你喜欢

转载自blog.csdn.net/ywk_hax/article/details/82597011