天天看點

55. Python 爬蟲(4)

webdriver

Selenium是ThroughtWorks公司開發的一套Web自動化測試工具。

它分為三個元件:

<code>Selenium IDE</code>

<code>Selenium RC (Remote Control)</code>

<code>Selenium Webdriver</code>

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

百度搜:

進入網站:

<a href="http://npm.taobao.org/mirrors/chromedriver/">http://npm.taobao.org/mirrors/chromedriver/</a>

下載下傳以後,并把chromdriver放在chrome的google.exe的目錄下面

先安裝selenium

<code># pip install selenium</code>

自動打開chrome,并打開域名相關的網頁

<code>import</code> <code>os</code>

<code>import</code> <code>time</code>

<code>from</code> <code>selenium </code><code>import</code> <code>webdriver</code>

<code>from</code> <code>selenium.webdriver.common.keys </code><code>import</code> <code>Keys</code>

<code>chromedriver </code><code>=</code> <code>"C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe"</code>

<code>os.environ[</code><code>"webdriver.chrome.driver"</code><code>] </code><code>=</code> <code>chromedriver</code>

<code>driver </code><code>=</code> <code>webdriver.Chrome(chromedriver)</code>

<code>driver.get(</code><code>"http://www.python.org"</code><code>)</code>

<code>time.sleep(</code><code>100</code><code>)</code>

<code>driver.quit()</code>

執行:自動打開網頁

搜尋欄(Search)的代碼如下:

id="id-search-field" 是 Search 的唯一辨別符。

id="submit" 是按鈕“GO”的唯一辨別符。

讓頁面自動搜尋關鍵字,代碼如下:

<code>element </code><code>=</code> <code>driver.find_element_by_id(</code><code>"id-search-field"</code><code>)</code>

<code>element.clear()</code>

<code>element.send_keys(</code><code>"os"</code><code>)</code>

<code>elementsubmit </code><code>=</code> <code>driver.find_element_by_id(</code><code>"submit"</code><code>)</code>

<code>elementsubmit.click()</code>

<code>time.sleep(</code><code>10000</code><code>)</code>

結果如圖:

學習幾種選擇器:

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

頁面:

    &lt;input type="text" name="passwd" id="passwd-id"  class=”input-class”/&gt;

代碼:

    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 定位元素

例子:

檢查頁面獲得如下:

&lt;iframe src="... ..."&gt; xxxxxxx &lt;/iframe&gt;

element = driver.find_elements_by_tag_name("iframe")

【iframe 就是定位行的元素】

5. find_element_by_link_text() #通過連結文字定位

        &lt;a href="http://www.google.com/search?q=baidu"&gt;baidu&lt;/a&gt;

        element = browser.find_elements_by_link_text("baidu")

6. xpath  

這個特别強大,所有的元素都可以通過這個可以找到。

XPath是XML Path的簡稱,由于HTML文檔本身就是一個标準的XML頁面,是以我們可以使用XPath的文法來定位頁面元素。

<code>絕對路徑: 根元素開始,及html開始用/</code>

<code>相對路勁: 任意符合條件的元素 </code><code>//</code>

<code>查找頁面上所有的input元素:</code><code>//input</code>

<code>查找頁面上第一個form元素内的直接子input元素(即隻包括form元素的下一級input元素,使用絕對路徑表示,單/号):</code><code>//form</code><code>[1]</code><code>/input</code>

<code>查找頁面上第一個form元素内的所有子input元素(隻要在form元素内的input都算,不管還嵌套了多少個其他标簽,使用相對路徑表示,雙</code><code>//</code><code>号):</code><code>//form</code><code>[1]</code><code>//input</code>

<code>查找頁面上第一個form元素:</code><code>//form</code><code>[1]</code>

<code>查找頁面上</code><code>id</code><code>為loginForm的form元素:</code><code>//form</code><code>[@</code><code>id</code><code>=</code><code>'loginForm'</code><code>]</code>

<code>查找頁面上具有name屬性為username的input元素:</code><code>//input</code><code>[@name=</code><code>'username'</code><code>]</code>

<code>查找頁面上</code><code>id</code><code>為loginForm的form元素下的第一個input元素:</code><code>//form</code><code>[@</code><code>id</code><code>=</code><code>'loginForm'</code><code>]</code><code>/input</code><code>[1]</code>

<code>查找頁面具有name屬性為contiune并且</code><code>type</code><code>屬性為button的input元素:</code><code>//input</code><code>[@name=</code><code>'continue'</code><code>][@</code><code>type</code><code>=</code><code>'button'</code><code>]</code>

<code>查找頁面上</code><code>id</code><code>為loginForm的form元素下第4個input元素:</code><code>//form</code><code>[@</code><code>id</code><code>=</code><code>'loginForm'</code><code>]</code><code>/input</code><code>[4]</code>

控件操作:

輸入框;

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

<code>import</code> <code>random</code>

<code>def</code> <code>randomSleep(minS, maxS):</code>

<code>    </code><code>time.sleep((maxS </code><code>-</code> <code>minS) </code><code>*</code> <code>random.random() </code><code>+</code> <code>minS)</code>

<code>    </code> 

<code>browser </code><code>=</code> <code>webdriver.Chrome(r</code><code>"C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe"</code><code>)</code>

<code>url </code><code>=</code> <code>"https://kyfw.12306.cn/otn/login/init"</code>

<code>browser.get(url</code><code>=</code><code>url)</code>

<code>print</code><code>(browser.find_element_by_id(</code><code>"username"</code><code>).text)</code>

<code>browser.find_element_by_id(</code><code>"username"</code><code>).clear()</code>

<code>browser.find_element_by_id(</code><code>"username"</code><code>).send_keys(</code><code>"xxxxxxxxxx"</code><code>)</code>

<code>randomSleep(</code><code>2</code><code>, </code><code>5</code><code>)</code>

<code>browser.find_element_by_id(</code><code>"password"</code><code>).send_keys(</code><code>"xxxxxxxxx"</code><code>)</code>

<code>randomSleep(</code><code>1</code><code>, </code><code>4</code><code>)</code>

<code>time.sleep(</code><code>6</code><code>)</code>

<code>browser.find_element_by_id(</code><code>"loginSub"</code><code>).click()</code>

<code>print</code><code>(browser.get_cookies())</code>

<code>browser.quit()</code>

#除驗證碼要手動确認外,其他全自動完成。

執行個體2:登入京東(重點在xpath選擇器的用法)

<code># Home</code>

<code>browser.get(</code><code>"https://passport.jd.com/new/login.aspx"</code><code>)</code>

<code># Login by username and password</code>

<code>randomSleep(</code><code>1</code><code>, </code><code>2</code><code>)</code>

<code>browser.find_element_by_xpath(</code><code>"//a[@clstag='pageclick|keycount|201607144|2']"</code><code>).click()</code>

<code># Username and password</code>

<code>browser.find_element_by_id(</code><code>"loginname"</code><code>).send_keys(</code><code>"xxxxxxxx"</code><code>)     </code><code>#使用者</code>

<code>print</code><code>(browser.find_element_by_id(</code><code>"loginname"</code><code>).text)</code>

<code>randomSleep(</code><code>1</code><code>, </code><code>3</code><code>)</code>

<code>browser.find_element_by_id(</code><code>"nloginpwd"</code><code>).send_keys(</code><code>"xxxxxxx"</code><code>)    </code><code>#密碼</code>

<code># Submit, wait for a long time</code>

<code>randomSleep(</code><code>5</code><code>, </code><code>10</code><code>)</code>

<code>browser.find_element_by_id(</code><code>"loginsubmit"</code><code>).click()</code>

<code>randomSleep(</code><code>3</code><code>, </code><code>5</code><code>)</code>

本文轉自 聽丶飛鳥說 51CTO部落格,原文連結:http://blog.51cto.com/286577399/2066535