美文网首页python 入门我用Python程序员
Python爬虫学习(十二)selenium来了

Python爬虫学习(十二)selenium来了

作者: 弃用中 | 来源:发表于2017-09-19 12:45 被阅读701次

    selenium 是一个web的自动化测试工具。简单的说就是一个可以用代码操所浏览器的工具,我我们可以通过selenium进行搜索关键字,点击按钮等等操作。

    做个小小的演示



    向毛主席保证,我只运行了一下那段代码!

    下面对其进行介绍:

    安装selenium

    首先,在Windows命令提示符(cmd)/ Linux终端输入:

    确保pip命令可用,如果提示pip不是内部或外部命令,需要将pip的安装目录(如:C:\Python36\Scripts)添加到环境变量PATH中。

    接下来通过pip命令安装selenium:

    安装完成后,打开一款Python编辑器,默认Python自带的IDLE也行。创建 baidu.py文件,输入以下内容:

    如果执行出错,我们就要下载浏览器驱动。

    下载浏览器驱动

    当selenium升级到3.0之后,对不同的浏览器驱动进行了规范。如果想使用selenium驱动不同的浏览器,必须单独下载并设置不同的浏览器驱动。
    各浏览器下载地址:
    Firefox浏览器驱动:geckodriver
    Chrome浏览器驱动:chromedriver
    IE浏览器驱动:IEDriverServer
    Edge浏览器驱动:MicrosoftWebDriver
    Opera浏览器驱动:operadriver
    PhantomJS浏览器驱动:phantomjs
    注:部分浏览器驱动地址需要科学上网。

    设置浏览器驱动

    设置浏览器的地址非常简单。 我们可以手动创建一个存放浏览器驱动的目录,如: C:\driver , 将下载的浏览器驱动文件(例如:chromedriver、geckodriver)丢到该目录下。

    我的电脑–>属性–>系统设置–>高级–>环境变量–>系统变量–>Path,将“C:\driver”目录添加到Path的值中。

    • Path
    • ;C:\driver

    然后验证不同的浏览器驱动是否正常使用:

    selenium定位方法

    Selenium提供了8种定位方式。

    • id
    • name
    • class name
    • tag name
    • link text
    • partial link text
    • xpath
    • css selector

    这8种定位方式在Python selenium中所对应的方法为:

    • find_element_by_id()
    • find_element_by_name()
    • find_element_by_class_name()
    • find_element_by_tag_name()
    • find_element_by_link_text()
    • find_element_by_partial_link_text()
    • find_element_by_xpath()
    • find_element_by_css_selector()

    假如,我们需要定位上图输入框,可以通过以下代码实现:

    from selenium import webdriver
    driver = webdriver.Chrome()
    driver.get('http://www.baidu.com')
    driver.find_element_by_id("kw")
    

    至于其他的定位方法,写法类似。

    点击和输入

    学习了元素定位后,我们就可以进一步控制浏览器的行为了。比如:

    • clear(): 清除文本。
    • send_keys (value): 模拟键盘输入。
    • click(): 单击元素。

    假如我们需要在百度上搜索“白夜追凶”,我们不用自己打开浏览器,直接运行下面这段代码就行。

    from selenium import webdriver
    driver = webdriver.Chrome()
    driver.get('http://www.baidu.com')
    kw = driver.find_element_by_id("kw")
    kw.clear()
    kw.send_keys('白夜追凶')
    kw.click()
    

    运行结果如下:

    就是这么溜!

    设置元素等待

    元素等待有什么用呢?
    比如,网速比较差的时候,可以让上面的搜索框加载出来了再去搜索。

    webdriver提供了两种等待:显式等待和隐式等待。

    显式等待

    显式等待使WebdDriver等待某个条件成立时继续执行,否则在达到最大时长时抛出超时异常(TimeoutException)。

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    driver = webdriver.Firefox()
    driver.get("http://www.baidu.com")
    
    element = WebDriverWait(driver, 5, 0.5).until(
                          EC.presence_of_element_located((By.ID, "kw"))
                          )
    element.send_keys('白夜追凶')
    driver.quit()
    

    WebDriverWait类是由WebDirver 提供的等待方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。具体格式如下:
    WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

    • driver :浏览器驱动。
    • timeout :最长超时时间,默认以秒为单位。
    • poll_frequency :检测的间隔(步长)时间,默认为0.5S。
    • ignored_exceptions :超时后的异常信息,默认情况下抛NoSuchElementException异常。

    WebDriverWait()一般由until()或until_not()方法配合使用,下面是until()和until_not()方法的说明。 until(method, message=‘’)调用该方法提供的驱动程序作为一个参数,直到返回值为True。until_not(method, message=‘’)调用该方法提供的驱动程序作为一个参数,直到返回值为False。
    在本例中,通过as关键字将expected_conditions 重命名为EC,并调用presence_of_element_located()方法判断元素是否存在。

    隐式等待

    WebDriver提供了implicitly_wait()方法来实现隐式等待,默认设置为0。它的用法相对来说要简单得多。

    from selenium import webdriver
    from selenium.common.exceptions import NoSuchElementException
    from time import ctime
    
    driver = webdriver.Firefox()
    
    # 设置隐式等待为10秒
    driver.implicitly_wait(10)
    driver.get("http://www.baidu.com")
    
    try:
        print(ctime())
        driver.find_element_by_id("kw22").send_keys('selenium')
    except NoSuchElementException as e:
        print(e)
    finally:
        print(ctime())
        driver.quit()
    

    implicitly_wait()默认参数的单位为秒,本例中设置等待时长为10秒。首先这10秒并非一个固定的等待时间,它并不影响脚本的执行速度。其次,它并不针对页面上的某一元素进行等待。当脚本执行到某个元素定位时,如果元素可以定位,则继续执行;如果元素定位不到,则它将以轮询的方式不断地判断元素是否被定位到。假设在第6秒定位到了元素则继续执行,若直到超出设置时长(10秒)还没有定位到元素,则抛出异常。

    更多内容,请看:
    http://www.seleniumhq.org/
    http://www.testclass.net/selenium_python/

    以上。

    相关文章

      网友评论

      • 821057a5c168:为什么我用selenium 能打开chrome 但是 会报 报错不能实现 打开某个网页 只能打开chrome
        821057a5c168:@Viljw 我试试
        弃用中: @清纯无邪小迷妹 可能是chromedriver的版本问题,查看一下你的chrome版本,下载对应的chromedriver。
      • 卓小生:我也想学Python,只是现在在学框架。😂
        弃用中: @卓小生 😝😜
      • 588c11d26006:总感觉py的这个wait方式很怪,如果能像js async和await一样工作感觉很好

      本文标题:Python爬虫学习(十二)selenium来了

      本文链接:https://www.haomeiwen.com/subject/vzepsxtx.html