55. Python 爬虫(4)

发布时间:2019-09-12 07:54:50编辑:auto阅读(1491)

    webdriver

    Selenium是ThroughtWorks公司开发的一套Web自动化测试工具。

    它分为三个组件:

    Selenium IDE
    Selenium RC (Remote Control)
    Selenium Webdriver

    Selenium IDE:是firefox的一个插件,允许测试人员录制脚本并回放。

    Selenium RC和Selenium Webdriver:是测试框架,提供多种语言的API。


    不同的是,Selenium Webdriver以一种更底层、更灵活的方式来操作浏览器,并不仅仅使用JavaScript。这样它可以绕开浏览器的沙箱限制,实现Selenium RC不支持的框架、弹出窗口、页面导航、下拉菜单、基于AJAX的UI元素等控件的操作。而且,Selenium Webdriver不需要本地服务器。


    Selenium 1.x版本只包含前两个组件。从2.0开始Webdriver加入其中。

    主要是来解决https的加密问题


    Webdriver在使用之前,需要下载一个浏览器所对应用的驱动插件,请根据自己不同的浏览器版本,进行下载:

    百度搜:

    image.png


    进入网站:

    http://npm.taobao.org/mirrors/chromedriver/

    image.png


    下载以后,并把chromdriver放在chrome的google.exe的目录下面

    image.png


    先安装selenium

    # pip install selenium


    自动打开chrome,并打开域名相关的网页

    import os
    import time
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    chromedriver = "C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe"
    os.environ["webdriver.chrome.driver"] = chromedriver
    driver = webdriver.Chrome(chromedriver)
    driver.get("http://www.python.org")
    time.sleep(100)
    driver.quit()


    执行:自动打开网页

    image.png


    搜索栏(Search)的代码如下:

    image.png

    id="id-search-field" 是 Search 的唯一标识符。


    image.png

    id="submit" 是按钮“GO”的唯一标识符。


    让页面自动搜索关键字,代码如下:

    import os
    import time
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    chromedriver = "C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe"
    os.environ["webdriver.chrome.driver"] = chromedriver
    driver = webdriver.Chrome(chromedriver)
    driver.get("http://www.python.org")
    element = driver.find_element_by_id("id-search-field")
    element.clear()
    element.send_keys("os")
    elementsubmit = driver.find_element_by_id("submit")
    elementsubmit.click()
    time.sleep(10000)
    driver.quit()


    结果如图:

    image.png


    学习几种选择器:

    1. find_elements_by_name(“test”)   # 根据name定位

    页面:

        <input type="text" name="passwd" id="passwd-id"  class=”input-class”/>

    代码:

        element = driver.find_elements_by_name(“passwd”)


    2. find_elements_by_id() #根据ID定位,定位最准确

        element = driver.find_element_by_id(“passwd-id”)

            By.tagname()

        element = driver.find_element_by_tag_name(“input”)


    3. find_element_by_class_name(‘input-class’)     #根绝class定位


    4. find_elements_by_tag_name(‘iframe’) #根据元素定位

    这里以iframe举例:用Tag name 定位元素

    例子:

    检查页面获得如下:

    <iframe src="... ..."> xxxxxxx </iframe>

    element = driver.find_elements_by_tag_name("iframe")

    【iframe 就是定位行的元素】


    5. find_element_by_link_text() #通过链接文字定位

    页面:

            <a href="http://www.google.com/search?q=baidu">baidu</a>

    代码:

            element = browser.find_elements_by_link_text("baidu")


    6. xpath  

    这个特别强大,所有的元素都可以通过这个可以找到。

    XPath是XML Path的简称,由于HTML文档本身就是一个标准的XML页面,所以我们可以使用XPath的语法来定位页面元素。

    绝对路径: 根元素开始,及html开始用/
    相对路劲: 任意符合条件的元素 //
    查找页面上所有的input元素://input
    查找页面上第一个form元素内的直接子input元素(即只包括form元素的下一级input元素,使用绝对路径表示,单/号)://form[1]/input
    查找页面上第一个form元素内的所有子input元素(只要在form元素内的input都算,不管还嵌套了多少个其他标签,使用相对路径表示,双//号)://form[1]//input
    查找页面上第一个form元素://form[1]
    查找页面上id为loginForm的form元素://form[@id='loginForm']
    查找页面上具有name属性为username的input元素://input[@name='username']
    查找页面上id为loginForm的form元素下的第一个input元素://form[@id='loginForm']/input[1]
    查找页面具有name属性为contiune并且type属性为button的input元素://input[@name='continue'][@type='button']
    查找页面上id为loginForm的form元素下第4个input元素://form[@id='loginForm']/input[4]


    控件操作:

    输入框;

    element.clear()   #清空输入框数据

    element.sendkeys(“username”)   #发送数据

    element.text         #获取元素文本的值



    按钮:

    element.click()   #"点击"操作

    element.submit() #同.click(),操作相同,常用 .click()



    单选和多选框

    element.clear()

    element = browser.find_elements_by_id(' checkbox')  #也可能是其他,根据具体情况,选择关键字元素即可。

    ##选择某个单选项:

    element.click();


    常用方法:

    browser.get_cookies()

    browser.title     #头名字

    browser.close()


    .forward() #前进

    举例:

    browser.foeward()


    .back() #后退

    举例:

    browser.back()


    .refresh() #刷新

    举例:

    browser.refresh()


    .current_url #返回当前页面url

    举例:

    browser.current_url


    实例1:登录12306

    from selenium import webdriver
    import random
    import time
    
    def randomSleep(minS, maxS):
        time.sleep((maxS - minS) * random.random() + minS)
        
    browser = webdriver.Chrome(r"C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe")
    url = "https://kyfw.12306.cn/otn/login/init"
    browser.get(url=url)
    print(browser.find_element_by_id("username").text)
    browser.find_element_by_id("username").clear()
    browser.find_element_by_id("username").send_keys("xxxxxxxxxx")
    randomSleep(2, 5)
    browser.find_element_by_id("password").send_keys("xxxxxxxxx")
    randomSleep(1, 4)
    time.sleep(6)
    browser.find_element_by_id("loginSub").click()
    randomSleep(2, 5)
    print(browser.get_cookies())
    browser.quit()

    #除验证码要手动确认外,其他全自动完成。



    实例2:登录京东(重点在xpath选择器的用法)

    from selenium import webdriver
    import random
    import time
    
    def randomSleep(minS, maxS):
        time.sleep((maxS - minS) * random.random() + minS)
        
    browser = webdriver.Chrome(r"C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe")
    # Home
    browser.get("https://passport.jd.com/new/login.aspx")
    # Login by username and password
    randomSleep(1, 2)
    browser.find_element_by_xpath("//a[@clstag='pageclick|keycount|201607144|2']").click()
    # Username and password
    randomSleep(1, 2)
    browser.find_element_by_id("loginname").send_keys("xxxxxxxx")	  #用户
    print(browser.find_element_by_id("loginname").text)
    randomSleep(1, 3)
    browser.find_element_by_id("nloginpwd").send_keys("xxxxxxx")	#密码
    # Submit, wait for a long time
    randomSleep(5, 10)
    browser.find_element_by_id("loginsubmit").click()
    print(browser.get_cookies())
    randomSleep(3, 5)
    browser.quit()


关键字

上一篇: python内置函数1

下一篇: python monkey_patch浅