55. Python 爬蟲(4)

  • 2020 年 1 月 10 日
  • 筆記

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在使用之前,需要下載一個瀏覽器所對應用的驅動插件,請根據自己不同的瀏覽器版本,進行下載:

百度搜:

進入網站

下載以後,並把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)GoogleChromeApplicationchromedriver.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)GoogleChromeApplicationchromedriver.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)GoogleChromeApplicationchromedriver.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)GoogleChromeApplicationchromedriver.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()

Tags: