zoukankan      html  css  js  c++  java
  • python爬虫(三)

    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在使用之前,需要下载一个浏览器所对应用的驱动插件,请根据自己不同的浏览器版本,进行下载:
    Google的我推荐给大家一个百度地址:
    链接:https://pan.baidu.com/s/1qZ2LfmW 密码:qixa
    下载以后,并把chromdriver放在google.exe那个当前目录下面。

    import os
    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    
    chromedriver = "C:Program Files (x86)GoogleChromeApplicationchromedriver.exe"
    #print(os.environ)
    os.environ["webdriver.chrome.driver"] = chromedriver  # 把chromedriver.exe的路径加入环境变量中
    driver = webdriver.Chrome(chromedriver)  # 启动谷歌浏览器
    driver.get("http://www.python.org")  # 用浏览器打开该网址
    driver.quit()

    结果如下图:

     八种选择器

    1. find_elements_by_name("test")
    假如有如下一个页面:

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

    代码:

    element = driver.find_elements_by_name("passwd")

    2. find_elements_by_id()

    element = driver.find_element_by_id("passwd-id")

    find_element_by_tagname

    element = driver.find_element_by_tagname("input")

    3. find_element_by_class_name("input-class")

    4. find_elements_by_tag_name("iframe")

    DOM的Tag元素
    用Tag name 定位元素的例子:
    <iframe src="..."></iframe>
    element = driver.find_elements_by_tag_name("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()

    单选和多选框

    element.clear()
    element = browser.find_elements_by_id("checkbox")

    选择某个单选项

    element.click()

    常用方法

    browser.get_cookies()
    browser.title       # 头名字
    browser.close() 
    browser.forward()   # 前进
    browser.back()      # 后退
    browser.refresh()   # 刷新
    browser.current_url # 返回当前页面

    登录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)GoogleChromeApplicationchromedriver.exe")  # 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("974644081@qq.com")  # 发送用户名到输入框
    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()

    登录京东

    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)GoogleChromeApplicationchromedriver.exe")  # chromedriver.exe存放路径
    # browser = webdriver.Chrome()
    
    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()
    # browser.find_element_by_tag_name("pageclick|keycount|201607144|2").click()
    
    # Username and password
    randomSleep(1, 2)
    browser.find_element_by_id("loginname").send_keys("xxxxxxx")  # 发送登录用户名
    print(browser.find_element_by_id("loginname").text)
    
    randomSleep(1, 3)
    browser.find_element_by_id("nloginpwd").send_keys("xxxxxx")  # 发送登录密码
    
    # 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()
  • 相关阅读:
    .NET 4.6.1 给cookie添加属性
    Blog目录
    1019 数字黑洞
    1018 锤子剪刀布
    1017 A除以B
    1016 部分A+B
    1015 德才论
    1014 福尔摩斯的约会
    1013 数素数
    1012 数字分类
  • 原文地址:https://www.cnblogs.com/yangjian319/p/9219058.html
Copyright © 2011-2022 走看看