爬虫学习笔记之【爬虫框架——selenium模块】

一、selenium模块简介

  • 作用:直接调用浏览器(支持所有主流的浏览器,包括PhantomJS无界面浏览器),可以接收指令,让浏览器自动加载页面,获取需要的数据
  • 工作原理:利用浏览器原生的API,封装成一套更加面向对象的Selenium WebDriver API,直接操作浏览器页面里的元素,以及操作浏览器自身
  1. 不同浏览器使用不同的webdriver
  2. webdriver本质是一个web-server,对外提供web API,其中封装了浏览器的各种功能API
  • 优点:操作简单
  • 缺点:爬取速度会大幅降低
  • 运行环境:下载要操作浏览器对应版本的webdriver

例:chrome浏览器

  1. 查看浏览器版本
    在这里插入图片描述
  2. 下载对应版本的webdriver,可以点击notes.txt进入版本说明页面,查看chrome和chromedriver匹配的版本
    对应版本
  3. 解压压缩包,获取可调用浏览器的webdriver可执行文件
  4. 将 chromedriver.exe 所在路径设置为环境变量
  5. 调用浏览器方法(返回driver对象):driver = webdriver.Chrome('chromedriver路径'),如果已经设置好环境变量,则路径可以不填
    6、实例化配置对象方法:options = webdriver.ChromeOptions()

二、配置对象常用方法

1、开启无界面模式方法

方式一:

  • options.add_argument("--headless") 添加开启无界面模式的命令
  • options.add_argument("--disable-gpu") 添加禁用gpu的命令

方式二:

  • options.set_headles()

macos中chrome浏览器59+版本,Linux中57+版本才能使用无界面模式

2、使用代理ip方法

  • options.add_argument('--proxy-server="代理ip类型:代理ip地址') 添加使用代理ip的命令

3、替换user-agent方法

  • options.add_argument('--user-agent=浏览器名称') 添加替换UA的命令

三、页面等待常用方法

1、强制等待

方法:time.sleep()
特点:达到等待时间后再执行操作(设置时间太短元素可能还未加载出来,设置时间太长会浪费时间)

2、隐式等待

方法:driver.implicitly_wait('时间(s)')
特点:在一段时间(最长等待20秒) 内判断元素是否定位成功,如果完成了,则进行下一步

3、显示等待

方法:WebDriverWait(driver, 设置的最长等待时间, 间隔时间).until(EC.presence_of_element_located((By.LINK_TEXT, '文本')))
特点:每一段间隔时间检查一次规定的标签是否存在,如果达成就停止等待,继续执行后续代码;如果未达成就继续等待,直到超过设置的最长等待时间(最长等待20秒) ,报超时异常

手动实现页面等待原理:利用强制等待和显式等待的思路来手动实现,有次数限制的判断某一个标签对象是否加载完毕/是否存在


四、driver对象常用属性和方法

1、常用属性

  • driver.page_source 当前标签页浏览器渲染之后的网页源代码
  • driver.current_url 当前标签页的url
  • driver.window_handles 获取当前所有标签页的句柄列表

2、常用方法

(1)基本方法

  • driver = webdriver.Chrome(chrome_options=options) 实例化带有配置对象的driver对象
  • dirver.get('url') 获取标签页
  • driver.close() 关闭当前标签页(如果只有一个标签页则关闭整个浏览器)
  • driver.quit() 关闭浏览器
  • driver.forward() 页面前进
  • driver.back() 页面后退
  • driver.screen_shot('图片名称') 页面截图

(2)获取标签对象方法

  • element = driver.find_element_by_id('id名') 根据id名返回一个元素
  • element = driver.find_element(s)_by_class_name('类名') 根据类名获取元素列表
  • element = driver.find_element(s)_by_name('name属性值') 根据name属性值返回包含标签对象元素的列表
  • element = driver.find_element(s)_by_xpath('xpath语法') 根据xpath语法返回元素列表
  • element = driver.find_element(s)_by_link_text('文本') 根据链接文本获取元素列表
  • element = driver.find_element(s)_by_partial_link_text('文本') 根据链接包含的文本获取元素列表
  • element = driver.find_element(s)_by_tag_name('标签名') 根据标签名获取元素列表
  • element = driver.find_element(s)_by_css_selector('css选择器') 根据css选择器获取元素列表

find_element和find_elements的区别:

  1. find_element返回匹配到的第一个标签对象,find_elements返回列表
  2. find_element匹配不到就抛出异常,find_elements匹配不到就返回空列表

by_link_text和by_partial_link_tex的区别:
by_link_text代表全部文本,by_partial_link_tex代表包含某个文本

(3)标签页的切换方法

  • driver.switch_to.window(current_windows['索引']) 根据标签页句柄列表索引下标进行切换

(4)切换frame标签方法

  • driver.switch_to.frame('frame/iframe标签对象') 切换到frame标签嵌套的页面

(5)cookie的处理方法

  • driver.get_cookies() 获取当前标签页的全部cookie信息
  • driver.delete_cookie("Cookie Name") 删除一条cookie
  • driver.delete_all_cookies() 删除所有cookie

driver.get_cookies()可配合requests模块使用,将cookie转化为字典:
cookies_dict = {cookie[‘name’]: cookie[‘value’] for cookie in driver.get_cookies()}

(6)执行js代码方法

  • driver.execute_script('js') 执行js

五、element标签对象常用数据提取方法

1、常用属性

  • element.text 获取标签对象文本

2、常用方法

  • element.get_attribute("属性名") 获取属性值
  • element.click() 对标签对象进行点击操作
  • element.send_keys ('数据') 对标签对象输入数据

六、实战演练

selenium框架应用

  • 代码功能:获取每页基本信息
    虎牙
  • 代码
from selenium import webdriver

class Huya(object):
    def __init__(self):
        self.url = ' '# 这里填对应url
        self.driver = webdriver.Chrome()
        
    def parse_data(self):
        time.sleep(5)
 
            el_list = self.driver.find_elements_by_xpath('//*[@id="js-live-list"]/li')  
            data_list = []
            for el in el_list:
                temp = {}
                temp['title'] = el.find_element_by_xpath('./a[2]').text
                temp['owner'] = el.find_element_by_xpath('./span/span[1]').text
                temp['type'] = el.find_element_by_xpath('./span/span[2]').text
                temp['num'] = el.find_element_by_xpath('./span/span[3]').text
                temp['img'] = el.find_element_by_xpath('./a[1]/img[1]').get_attribute('src')
                data_list.append(temp)
                
            return data_list
                
    def save_data(self,data_list):
        for data in data_list:
            print(data)
                  
    def run(self):

        self.driver.get(self.url)
        while True:
            data_list = self.parse_data()
            self.save_data(data_list)
            try:
                el_next = self.driver.find_element_by_xpath('//*[@class="laypage_next"]')
                el_next.click()
            except:
                break
        
if __name__ == '__main__':
    huya = Huya()
    huya.run()
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值