55. Python 爬蟲(4)
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在使用之前,需要下載一個瀏覽器所對應用的驅動插件,請根據自己不同的瀏覽器版本,進行下載:
百度搜:
進入網站:
http://npm.taobao.org/mirrors/chromedriver/
下載以後,並把chromdriver放在chrome的google.exe的目錄下面
先安裝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()
執行:自動打開網頁
搜索欄(Search)的代碼如下:
id="id-search-field" 是 Search 的唯一標識符。
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()
結果如圖:
學習幾種選擇器:
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()
55. Python 爬蟲(4)