• python爬虫之selenium的使用


    一、selenium简介

       1、什么是selenium

      selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法执行javaScript代码的问题。

       2、selenium的用途

      (1)、selenium可以驱动浏览器自动执行自定义好的逻辑代码,也就是可以通过代码完全模拟成人类使用浏览器自动访问目标站点并操作,那我们也可以拿它来做爬虫。


      (2)、selenium本质上是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等...进而拿到网页渲染之后的结果,可支持多种浏览器
       3、selenium是优缺点
      (1)优点
        优点就是可以帮我们避开一系列复杂的通信流程,例如在我们之前学习的requests模块,那么requests模块在模拟请求的时候是不是需要把素有的通信流程都分析完成后才能通过请求,然后返回响应。假如目标站点有一系列复杂的通信流程,例如的登录时的滑动验证等...那么你使用requests模块的时候是不是就特别麻烦了。不过你也不需要担心,因为网站的反爬策略越高,那么用户的体验效果就越差,所以网站都需要在用户的淫威之下降低安全策略。
        再看一点requests请求库能不能执行js?是不是不能呀!那么如果你的网站需要发送ajax请求,异步获取数据渲染到页面上,是不是就需要使用js发送请求了。那浏览器的特点是什么?是不是可以直接访问目标站点,然后获取对方的数据,从而渲染到页面上。那这些就是使用selenium的好处!
      (2)缺点
        使用selenium本质上是驱动浏览器对目标站点发送请求,那浏览器在访问目标站点的时候,是不是都需要把静态资源都加载完毕。html、css、js这些文件是不是都要等待它加载完成。是不是速度特别慢。那用它的坏处就是效率极低!所以我们一般用它来做登录验证。

    二、selenium的安装

      1、下载selenium模块:
        pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple selenium
        或者在pycharm中下载
      2、安装浏览器驱动
       (1)、Google浏览器驱动:https://sites.google.com/a/chromium.org/chromedriver/downloads
            注:把下载好的chromedriver.exe放到python安装路径的scripts目录中即可,
       (2)、firefox浏览器驱动:
          selenium3默认支持的webdriver是Firfox,而Firefox需要安装geckodriver
          下载链接:https://github.com/mozilla/geckodriver/releases

    三、selenium的基本使用

    复制代码
    from selenium import webdriver  # 用来驱动浏览器的
    from selenium.webdriver import ActionChains  # 破解滑动验证码的时候用的 可以拖动图片
    from selenium.webdriver.common.by import By  # 按照什么方式查找,By.ID,By.CSS_SELECTOR
    from selenium.webdriver.common.keys import Keys  # 键盘按键操作
    from selenium.webdriver.support import expected_conditions as EC  # 和下面WebDriverWait一起用的
    from selenium.webdriver.support.wait import WebDriverWait  # 等待页面加载某些元素
    import time
    
    
    driver=webdriver.Chrome()

    try:
    wait=WebDriverWait(driver,10)
    #1、访问百度
    driver.get('https://www.baidu.com/')
    #2、查找输入框
    # input_tag = wait.until(
    # # 调用EC的presence_of_element_located()
    # EC.presence_of_element_located(
    # # 此处可以写一个元组
    # # 参数1: 查找属性的方式
    # # 参数2: 属性的名字
    # (By.ID, "kw")
    # )
    # )
    input_tag=wait.until(EC.presence_of_element_located((By.ID,"kw")))

    #3、在搜索框在输入要搜索的内容
    input_tag.send_keys('秦时明月')

    # 4、按键盘回车键
    input_tag.send_keys(Keys.ENTER)

    time.sleep(3)

    finally:
    driver.close()
    
    
    复制代码

     四、 等待元素被加载

      selenium只是模拟浏览器的行为,而浏览器解析页面是需要时间的(执行css,js),一些元素可能需要过一段时间才能加载出来,为了保证所有元素都能查到,必须等待。
    
      1、等待的方式分两种:
    
      (1)、隐式等待:在browser.get('xxx')前就设置,针对所有元素有效
     1 from selenium import webdriver
     2 from selenium.webdriver import ActionChains
     3 from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
     4 from selenium.webdriver.common.keys import Keys #键盘按键操作
     5 from selenium.webdriver.support import expected_conditions as EC
     6 from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素
     7 
     8 browser=webdriver.Chrome()
     9 
    10 #隐式等待:在查找所有元素时,如果尚未被加载,则等10秒
    11 browser.implicitly_wait(10)
    12 
    13 browser.get('https://www.baidu.com')
    14 
    15 
    16 input_tag=browser.find_element_by_id('kw')
    17 input_tag.send_keys('美女')
    18 input_tag.send_keys(Keys.ENTER)
    19 
    20 contents=browser.find_element_by_id('content_left') #没有等待环节而直接查找,找不到则会报错
    21 print(contents)
    22 
    23 browser.close()
     (2)、显式等待:在browser.get('xxx')之后设置,只针对某个元素有效
     1 from selenium import webdriver
     2 from selenium.webdriver import ActionChains
     3 from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
     4 from selenium.webdriver.common.keys import Keys #键盘按键操作
     5 from selenium.webdriver.support import expected_conditions as EC
     6 from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素
     7 
     8 browser=webdriver.Chrome()
     9 browser.get('https://www.baidu.com')
    10 
    11 
    12 input_tag=browser.find_element_by_id('kw')
    13 input_tag.send_keys('美女')
    14 input_tag.send_keys(Keys.ENTER)
    15 
    16 
    17 #显式等待:显式地等待某个元素被加载
    18 wait=WebDriverWait(browser,10)
    19 wait.until(EC.presence_of_element_located((By.ID,'content_left')))
    20 
    21 contents=browser.find_element(By.CSS_SELECTOR,'#content_left')
    22 print(contents)
    23 
    24 
    25 browser.close()

    五、 选择器

     1、基本使用方法
     1 from selenium import webdriver  # 用来驱动浏览器的
     2 import time
     3 
     4 '''
     5 ===============所有方法===================
     6     element是查找一个标签
     7     elements是查找所有标签
     8 
     9     1、find_element_by_link_text  通过链接文本去找
    10     2、find_element_by_id 通过id去找
    11     3、find_element_by_class_name
    12     4、find_element_by_partial_link_text
    13     5、find_element_by_name
    14     6、find_element_by_css_selector
    15     7、find_element_by_tag_name
    16 '''
    17 # 获取驱动对象、
    18 driver = webdriver.Chrome()
    19 
    20 try:
    21 
    22     # 往百度发送请求
    23     driver.get('https://www.baidu.com/')
    24     driver.implicitly_wait(10)
    25 
    26     # 1、find_element_by_link_text  通过链接文本去找
    27     # 根据登录
    28     # send_tag = driver.find_element_by_link_text('登录')
    29     # send_tag.click()
    30 
    31     # 2、find_element_by_partial_link_text 通过局部文本查找a标签
    32     login_button = driver.find_element_by_partial_link_text('')
    33     login_button.click()
    34     time.sleep(1)
    35 
    36     # 3、find_element_by_class_name 根据class属性名查找
    37     login_tag = driver.find_element_by_class_name('tang-pass-footerBarULogin')
    38     login_tag.click()
    39     time.sleep(1)
    40 
    41     # 4、find_element_by_name 根据name属性查找
    42     username = driver.find_element_by_name('userName')
    43     username.send_keys('15622792660')
    44     time.sleep(1)
    45 
    46     # 5、find_element_by_id 通过id属性名查找
    47     password = driver.find_element_by_id('TANGRAM__PSP_10__password')
    48     password.send_keys('*******')
    49     time.sleep(1)
    50 
    51     # 6、find_element_by_css_selector  根据属性选择器查找
    52     # 根据id查找登录按钮
    53     login_submit = driver.find_element_by_css_selector('#TANGRAM__PSP_10__submit')
    54     # driver.find_element_by_css_selector('.pass-button-submit')
    55     login_submit.click()
    56 
    57     # 7、find_element_by_tag_name  根据标签名称查找标签
    58     div = driver.find_element_by_tag_name('div')
    59     print(div.tag_name)
    60 
    61     time.sleep(10)
    62 
    63 finally:
    64     driver.close()

      2、xpath操作

      XPath 是一门在 XML 文档中查找信息的语言。XPath 用于在 XML 文档中通过元素和属性进行查找。

      在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。

      XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似

    XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。

    注意: 下面列出了最有用的路径表达式

    示例:

      在下面的表格中,我们已列出了一些路径表达式以及表达式的结果

      3. 获取标签属性(了解)

     1 from selenium import webdriver
     2 
     3 driver = webdriver.Chrome(r'D:BaiduNetdiskDownloadchromedriver_win32chromedriver.exe')
     4 
     5 
     6 try:
     7     # 隐式等待: 写在get请求前
     8     driver.implicitly_wait(5)
     9 
    10     driver.get('https://doc.scrapy.org/en/latest/_static/selectors-sample1.html')
    11 
    12     # 显式等待: 写在get请求后
    13     # wait.until(...)
    14 
    15     '''
    16     
    17 <html>
    18  <head>
    19   <base href='http://example.com/' />
    20   <title>Example website</title>
    21  </head>
    22  <body>
    23   <div id='images'>
    24    <a href='image1.html'>Name: My image 1 <br /><img src='image1_thumb.jpg' /></a>
    25    <a href='image2.html'>Name: My image 2 <br /><img src='image2_thumb.jpg' /></a>
    26    <a href='image3.html'>Name: My image 3 <br /><img src='image3_thumb.jpg' /></a>
    27    <a href='image4.html'>Name: My image 4 <br /><img src='image4_thumb.jpg' /></a>
    28    <a href='image5.html'>Name: My image 5 <br /><img src='image5_thumb.jpg' /></a>
    29   </div>
    30  </body>
    31 </html>
    32     '''
    33     # 根据xpath语法查找元素
    34     # / 从根节点开始找第一个
    35     html = driver.find_element_by_xpath('/html')
    36     # html = driver.find_element_by_xpath('/head')  # 报错
    37     print(html.tag_name)
    38 
    39     # // 从根节点开始找任意一个节点
    40     div = driver.find_element_by_xpath('//div')
    41     print(div.tag_name)
    42 
    43     # @
    44     # 查找id为images的div节点
    45     div = driver.find_element_by_xpath('//div[@id="images"]')
    46     print(div.tag_name)
    47     print(div.text)
    48 
    49     # 找到第一个a节点
    50     a = driver.find_element_by_xpath('//a')
    51     print(a.tag_name)
    52 
    53     # 找到所有a节点
    54     a_s = driver.find_elements_by_xpath('//a')
    55     print(a_s)
    56 
    57     # 找到第一个a节点的href属性
    58     # get_attribute:获取节点中某个属性
    59     a = driver.find_element_by_xpath('//a').get_attribute('href')
    60     print(a)
    61 
    62 finally:
    63     driver.close()

    六、元素交互操作

     1、点击、清除操作
     1 from selenium import webdriver
     2 from selenium.webdriver.common.keys import Keys
     3 import time
     4 
     5 driver = webdriver.Chrome(r'D:BaiduNetdiskDownloadchromedriver_win32chromedriver.exe')
     6 
     7 try:
     8     driver.implicitly_wait(10)
     9     # 1、往jd发送请求
    10     driver.get('https://www.jd.com/')
    11     # 找到输入框输入围城
    12     input_tag = driver.find_element_by_id('key')
    13     input_tag.send_keys('围城')
    14     # 键盘回车
    15     input_tag.send_keys(Keys.ENTER)
    16     time.sleep(2)
    17     # 找到输入框输入墨菲定律
    18     input_tag = driver.find_element_by_id('key')
        #清除输入框内原有的内容
    19 input_tag.clear() 20 input_tag.send_keys('墨菲定律') 21 # 找到搜索按钮点击搜索 22 button = driver.find_element_by_class_name('button') 23 button.click() 24 time.sleep(10) 25 26 finally: 27 driver.close()
     2、获取cookies  (了解)
     1 from selenium import webdriver
     2 import time
     3 
     4 driver = webdriver.Chrome(r'D:BaiduNetdiskDownloadchromedriver_win32chromedriver.exe')
     5 
     6 try:
     7     driver.implicitly_wait(10)
     8     driver.get('https://www.zhihu.com/explore')
     9     print(driver.get_cookies())
    10 
    11     time.sleep(10)
    12 finally:
    13     driver.close()
     3、选项卡
     1 选项卡管理:切换选项卡,有js的方式windows.open,有windows快捷键:
     2 ctrl+t等,最通用的就是js的方式
     3 import time
     4 from selenium import webdriver
     5 
     6 browser = webdriver.Chrome()
     7 try:
     8     browser.get('https://www.baidu.com')
     9 
    10     # execute_script: 执行javascrpit代码
    11     # 弹窗操作
    12     # browser.execute_script('alert("tank")')
    13     # 新建浏览器窗口
    14     browser.execute_script(
    15         '''
    16         window.open();
    17         '''
    18     )
    19     time.sleep(1)
    20     print(browser.window_handles)  # 获取所有的选项卡
    21     # 切换到第二个窗口
    22     # 新:
    23     browser.switch_to.window(browser.window_handles[1])
    24     # 旧:
    25     # browser.switch_to_window(browser.window_handles[1])
    26 
    27     # 第二个窗口往淘宝发送请求
    28     browser.get('https://www.taobao.com')
    29     time.sleep(5)
    30 
    31     # 切换到第一个窗口
    32     browser.switch_to_window(browser.window_handles[0])
    33     browser.get('https://www.sina.com.cn')
    34 
    35     time.sleep(10)
    36 finally:
    37     browser.close()
     4、ActionChangs动作链
     1 from selenium import webdriver
     2 from selenium.webdriver import ActionChains
     3 import time
     4 
     5 driver = webdriver.Chrome()
     6 driver.implicitly_wait(10)
     7 driver.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
     8 
     9 try:
    10 
    11     # driver.switch_to_frame('iframeResult')
    12     # 切换到id为iframeResult的窗口内
    13     driver.switch_to.frame('iframeResult')
    14 
    15     # 源位置
    16     draggable = driver.find_element_by_id('draggable')
    17 
    18     # 目标位置
    19     droppable = driver.find_element_by_id('droppable')
    20 
    21     # 调用ActionChains,必须把驱动对象传进去
    22     # 得到一个动作链对象,复制给一个变量
    23     actions = ActionChains(driver)
    24 
    25     # 方式一: 机器人
    26     # 瞬间把源图片位置秒移到目标图片位置
    27     # actions.drag_and_drop(draggable, droppable)  # 编写一个行为
    28     # actions.perform()  # 执行编写好的行为
    29 
    30 
    31     # 方式二: 模拟人的行为
    32     source = draggable.location['x']
    33     target = droppable.location['x']
    34     print(source, target)
    35 
    36     distance = target - source
    37     print(distance)
    38 
    39     # perform:每个动作都要调用perform执行
    40 
    41     # 点击并摁住源图片
    42     ActionChains(driver).click_and_hold(draggable).perform()
    43 
    44     s = 0
    45     while s < distance:
    46         # 执行位移操作
    47         ActionChains(driver).move_by_offset(xoffset=2, yoffset=0).perform()
    48         s += 2
    49 
    50     # 释放动作链
    51     ActionChains(driver).release().perform()
    52 
    53     time.sleep(10)
    54 
    55 
    56 finally:
    57     driver.close()
     5、前进、后退
     1 from selenium import webdriver
     2 import time
     3 
     4 driver = webdriver.Chrome()
     5 
     6 try:
     7     driver.implicitly_wait(10)
     8     driver.get('https://www.jd.com/')
     9     driver.get('https://www.baidu.com/')
    10     driver.get('https://www.cnblogs.com/')
    11 
    12     time.sleep(2)
    13 
    14     # 回退操作
    15     driver.back()
    16     time.sleep(1)
    17     # 前进操作
    18     driver.forward()
    19     time.sleep(1)
    20     driver.back()
    21     time.sleep(10)
    22 
    23 finally:
    24     driver.close()
     
     
     
  • 相关阅读:
    关于float与double
    【编程实践】母牛生小牛
    wlan的QOS配置
    C语言itoa函数和atoi 函数
    类似于QQ的简单的聊天代码
    多线程吃饺子练习
    线程练习
    接口练习
    电视练习
    5.22
  • 原文地址:https://www.cnblogs.com/lweiser/p/11045023.html
Copyright © 2020-2023  润新知