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)\Google\Chrome\Application\chromedriver.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)\Google\Chrome\Application\chromedriver.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)\Google\Chrome\Application\chromedriver.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()