python爬蟲之selenium模塊

一、什麼是Selenium

selenium 是一套完整的web應用程序測試系統,包含瞭測試的錄制(selenium IDE),編寫及運行(Selenium Remote Control)和測試的並行處理(Selenium Grid)。Selenium的核心Selenium Core基於JsUnit,完全由JavaScript編寫,因此可以用於任何支持JavaScript的瀏覽器上。

selenium可以模擬真實瀏覽器,自動化測試工具,支持多種瀏覽器,爬蟲中主要用來解決JavaScript渲染問題。

二、selenium安裝

用python寫爬蟲的時候,主要用的是selenium的Webdriver,我們可以通過下面的方式先看看Selenium.Webdriver支持哪些瀏覽器

from selenium import webdrive
help(webdriver)

執行結果如下,從結果中我們也可以看出基本山支持瞭常見的所有瀏覽器:

NAME: selenium.webdriver

PACKAGE CONTENTS:

  • android (package)
  • blackberry (package)
  • chrome (package)
  • common (package)
  • edge (package)
  • firefox (package)
  • ie (package)
  • opera (package)
  • phantomjs (package)
  • remote (package)
  • safari (package)
  • support (package)
  • webkitgtk (package)

VERSION: 3.14.1

1、PhantomJS: 無可視化界面的瀏覽器(無頭瀏覽器)

PhantomJS是一個而基於WebKit的服務端JavaScript API,支持Web而不需要瀏覽器支持,其快速、原生支持各種Web標準:Dom處理,CSS選擇器,JSON等等。

PhantomJS可以用用於頁面自動化、網絡監測、網頁截屏,以及無界面測試。

2、下載瀏覽器驅動

當selenium升級到3.0之後,對不同的瀏覽器驅動進行瞭規范。如果想使用selenium驅動不同的瀏覽器,必須單獨下載並設置不同的瀏覽器驅動。

各瀏覽器下載地址:

  • Firefox瀏覽器驅動:geckodriver
  • Chrome瀏覽器驅動:chromedriver , taobao備用地址
  • IE瀏覽器驅動:IEDriverServer
  • Edge瀏覽器驅動:MicrosoftWebDriver

:webdriver需要和對應的瀏覽器版本以及selenium版本對應。

查看驅動和瀏覽器版本的映射關系:

按照chrome版本對應的driver,直接按照瀏覽器版本去找對應的driver(隻對應大版本就行)

下載之後,解壓到任意目錄(路徑不要有中文)。

瀏覽器驅動文件,(win環境下載解壓後得到的.exe文件)需要放到與python.exe同級目錄中方能使用。或者配置電腦環境變量

可以手動創建一個存放瀏覽器驅動的目錄,如: C:\driver , 將下載的瀏覽器驅動文件(例如:chromedriver、geckodriver)丟到該目錄下。

我的電腦–>屬性–>系統設置–>高級–>環境變量–>系統變量–>Path,將“C:\driver”目錄添加到Path的值中。

三、selenium基本使用

1、聲明瀏覽器對象

上面我們知道瞭selenium支持很多的瀏覽器,但是如果想要聲明並調用瀏覽器則需要:

這裡隻寫瞭兩個例子,當然瞭其他的支持的瀏覽器都可以通過這種方式調用

from selenium import webdriver

browser = webdriver.Chrome()
# browser = webdriver.Firefox()

Headless方式啟動

Headless Chrome 是 Chrome 瀏覽器的無界面形態,可以在不打開瀏覽器的前提下,使用所有 Chrome 支持的特性運行你的程序。相比於現代瀏覽器,Headless Chrome 更加方便測試 web 應用,獲得網站的截圖,做爬蟲抓取信息等。相比於較早的 PhantomJS,SlimerJS 等,Headless Chrome 則更加貼近瀏覽器環境。

Headless Chrome 對Chrome版本要求:官方文檔中介紹,mac和linux環境要求chrome版本是59+,而windows版本的chrome要求是60+,同時chromedriver要求2.30+版本。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys

chrome_options = webdriver.ChromeOptions()
# 使用headless無界面瀏覽器模式
chrome_options.add_argument('--headless') //增加無界面選項
chrome_options.add_argument('--disable-gpu') //如果不加這個選項,有時定位會出現問題
# 啟動瀏覽器,獲取網頁源代碼
browser = webdriver.Chrome(chrome_options=chrome_options)
mainUrl = "https://www.taobao.com/"
browser.get(mainUrl)
print(f"browser text = {browser.page_source}")
browser.quit()

2、訪問頁面

下面代碼運行後,會自動打開Chrome瀏覽器,並登陸百度打印百度首頁的源代碼,然後關閉瀏覽器

from selenium import webdriver

browser = webdriver.Chrome()

browser.get("http://www.baidu.com")
print(browser.page_source)
browser.close()

3、查找元素

1、單個元素查找

browser.get(<a href="http://www.taobao.com/" rel="external nofollow"  rel="external nofollow"   target="_blank">http://www.taobao.com</a>)
input_first = browser.find_element_by_id("q")
input_second = browser.find_element_by_css_selector("#q")
input_third = browser.find_element_by_xpath('//*[@id="q"]')
print(input_first)
print(input_second)
print(input_third)
browser.close()

這裡我們通過三種不同的方式去獲取響應的元素,第一種是通過id的方式,第二個中是CSS選擇器,第三種是xpath選擇器,結果都是相同的。 
結果如下:

常用的查找元素方法:

  • find_element_by_name:通過元素name定位
  • find_element_by_id:通過元素id定位
  • find_element_by_xpath:通過xpath表達式定位
  • find_element_by_link_text:通過完整超鏈接文本定位
  • find_element_by_partial_link_text:通過部分鏈接文本定位
  • find_element_by_tag_name:通過標簽定位
  • find_element_by_class_name:通過類名進行定位
  • find_element_by_css_selector:通過css選擇器進行定位

舉例:

通過xpath定位,xpath定位有N種寫法,這裡列幾個常用寫法:

dr.find_element_by_xpath("//*[@id='kw']")
dr.find_element_by_xpath("//*[@name='wd']")
dr.find_element_by_xpath("//input[@class='s_ipt']")
dr.find_element_by_xpath("/html/body/form/span/input")
dr.find_element_by_xpath("//span[@class='soutu-btn']/input")
dr.find_element_by_xpath("//form[@id='form']/span/input")
dr.find_element_by_xpath("//input[@id='kw' and @name='wd']")

通過css定位,css定位有N種寫法,這裡列幾個常用寫法:

dr.find_element_by_css_selector("#kw")
dr.find_element_by_css_selector("[name=wd]")
dr.find_element_by_css_selector(".s_ipt")
dr.find_element_by_css_selector("html > body > form > span > input")
dr.find_element_by_css_selector("span.soutu-btn> input#kw")
dr.find_element_by_css_selector("form#form > span > input")

xpath的使用方法

1. 第一種方法:通過絕對路徑做定位(相信大傢不會使用這種方式)

By.xpath(“html/body/div/form/input”)

2. 第二種方法:通過相對路徑做定位,兩個斜杠代表相對路徑

By.xpath(“//input//div”)

3. 第三種方法:通過元素索引定位

By.xpath(“//input[4]”)

4. 第四種方法:使用xpath+節點屬性定位(結合第2、第3中方法可以使用)

By.xpath(“//input[@id='kw1']”)
By.xpath(“//input[@type='name' and @name='kw1']”)

5. 第五種方法:使用部分屬性值匹配(最強大的方法)

By.xpath(“//input[start-with(@id,'nice')]”)
By.xpath(“//input[ends-with(@id,'很漂亮')]”)
By.xpath(“//input[contains(@id,'那麼美')]”)

6. 第六種方法:使用前集中方法的組合

By.xpath(“//input[@id='kw1']//input[start-with(@id,'nice']/div[1]/form[3])

下面這種方式是比較通用的一種方式:這裡需要記住By模塊所以需要導入。

from selenium import webdriver

from selenium.webdriver.common.by import By

browser = webdriver.Chrome()

browser.get("http://www.taobao.com")
input_first = browser.find_element(By.ID,"q")
print(input_first)
browser.close()

當然這種方法和上述的方式是通用的,browser.find_element(By.ID,"q")這裡By.ID中的ID可以替換為其他幾個

2、多個元素查找

多個元素find_elements,單個元素是find_element,其他使用上沒什麼區別,通過其中的一個例子演示:

browser.get(<a href="http://www.taobao.com/" rel="external nofollow"  rel="external nofollow"   target="_blank">http://www.taobao.com</a>)
lis = browser.find_elements_by_css_selector('.service-bd li')
print(lis)
browser.close()

這樣獲得就是一個列表

當然上面的方式也是可以通過導入from selenium.webdriver.common.by import By 這種方式實現

lis = browser.find_elements(By.CSS_SELECTOR,'.service-bd li')

同樣的在單個元素中查找的方法在多個元素查找中同樣存在:

  • find_elements_by_name
  • find_elements_by_id
  • find_elements_by_xpath
  • find_elements_by_link_text
  • find_elements_by_partial_link_text
  • find_elements_by_tag_name
  • find_elements_by_class_name
  • find_elements_by_css_selector

4、元素交互操作

一般來說,webdriver 中比較常用的操作對象的方法有下面幾個:

  • click——點擊對象
  • send_keys——在對象上模擬按鍵輸入
  • clear——清除對象的內容,如果可以的話
  • submit——提交對象的內容,如果可以的話
  • text——用於獲取元素的文本信息

1、鍵盤事件

要想調用鍵盤按鍵操作需要引入 keys 包:

from selenium.webdriver.common.keys import Keys

通過 send_keys()調用按鍵:

send_keys(Keys.TAB) # TAB
send_keys(Keys.ENTER) # 回車
send_keys(Keys.CONTROL,'a') # ctrl+a 全選輸入框內容 
send_keys(Keys.CONTROL,'x') # ctrl+x 剪切輸入框內容
import time

browser.get(http://www.taobao.com)
input_str = browser.find_element_by_id('q')
input_str.send_keys("ipad")
time.sleep(1)
input_str.clear()
input_str.send_keys("MakBook pro")
button = browser.find_element_by_class_name('btn-search')
button.click()

運行的結果可以看出程序會自動打開Chrome瀏覽器並打開淘寶輸入ipad,然後刪除,重新輸入MakBook pro,並點擊搜索。

2、鼠標事件

鼠標事件一般包括鼠標右鍵、雙擊、拖動、移動鼠標到某個元素上等等。需要引入ActionChains類。引入方法:

from selenium.webdriver.common.action_chains import ActionChains

ActionChains 常用方法:

  • context_click() :右擊;
  • double_click() :雙擊;
  • drag_and_drop(): 拖動;
  • move_to_element() :鼠標懸停。
  • perform(): 執行所有ActionChains 中存儲的行為;

鼠標雙擊示例:

qqq =driver.find_element_by_xpath("xxx")  #定位到要雙擊的元素
ActionChains(driver).double_click(qqq).perform() #對定位到的元素執行鼠標雙擊操作

鼠標拖放示例:

from selenium.webdriver import ActionChains

url = "http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable"
browser.get(url)
browser.switch_to.frame('iframeResult')
source = browser.find_element_by_css_selector('#draggable')
target = browser.find_element_by_css_selector('#droppable')
actions = ActionChains(browser)
actions.drag_and_drop(source, target)
actions.perform()

更多操作參考:

http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.common.action_chains

5、執行JavaScript

這是一個非常有用的方法,這裡就可以直接調用js方法來實現一些操作,下面的例子是通過登錄知乎然後通過js翻到頁面底部,並彈框提示

browser.get(<a href="http://www.zhihu.com/explore" rel="external nofollow"   target="_blank">http://www.zhihu.com/explore</a>)
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
browser.execute_script('alert("To Bottom")')

6、獲取DOM

1、獲取元素屬性:get_attribute('class')

url = 'https://www.zhihu.com/explore'
browser.get(url)
logo = browser.find_element_by_id('zh-top-link-logo')
print(logo)
print(logo.get_attribute('class'))

2、獲取文本值:text

url = 'https://www.zhihu.com/explore'
browser.get(url)
input = browser.find_element_by_class_name('zu-top-add-question')
print(input.text)

3、獲取ID,位置,標簽名

  • id
  • location
  • tag_name
  • size
url = 'https://www.zhihu.com/explore'
browser.get(url)
input = browser.find_element_by_class_name('zu-top-add-question')
print(input.id)
print(input.location)
print(input.tag_name)
print(input.size)

7、Frame

在很多網頁中都是有Frame標簽,所以我們爬取數據的時候就涉及到切入到frame中以及切出來的問題,通過下面的例子演示

這裡常用的是switch_to.from()和switch_to.parent_frame()

import time
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException

browser = webdriver.Chrome()
url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)
browser.switch_to.frame('iframeResult')
source = browser.find_element_by_css_selector('#draggable')
print(source)

try:
    logo = browser.find_element_by_class_name('logo')
except NoSuchElementException:
    print('NO LOGO')
browser.switch_to.parent_frame()
logo = browser.find_element_by_class_name('logo')
print(logo)
print(logo.text)

8、等待

1、隱式等待

當使用瞭隱式等待執行測試的時候,如果 WebDriver沒有在 DOM中找到元素,將繼續等待,超出設定時間後則拋出找不到元素的異常。

換句話說,當查找元素或元素並沒有立即出現的時候,隱式等待將等待一段時間再查找 DOM,默認的時間是0

到瞭一定的時間發現元素還沒有加載,則繼續等待我們指定的時間,如果超過瞭我們指定的時間還沒有加載就會拋出異常,如果沒有需要等待的時候就已經加載完畢就會立即執行

browser.implicitly_wait(10)
browser.get('https://www.zhihu.com/explore')
input = browser.find_element_by_class_name('zu-top-add-question')
print(input)

2、顯示等待

指定一個等待條件,並且指定一個最長等待時間,會在這個時間內進行判斷是否滿足等待條件。

如果成立就會立即返回,如果不成立,就會一直等待,直到等待你指定的最長等待時間,如果還是不滿足,就會拋出異常,如果滿足瞭就會正常返回。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

browser = webdriver.Chrome()
browser.get('https://www.taobao.com/')
wait = WebDriverWait(browser, 10)
input = wait.until(EC.presence_of_element_located((By.ID, 'q')))
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')))
print(input, button)

上述的例子中的條件:EC.presence_of_element_located()是確認元素是否已經出現瞭。EC.element_to_be_clickable()是確認元素是否是可點擊的

3、常用的判斷條件:

  • title_is :標題是某內容
  • title_contains :標題包含某內容
  • presence_of_element_located :元素加載出,傳入定位元組,如(By.ID, 'p')
  • visibility_of_element_located :元素可見,傳入定位元組
  • visibility_of :可見,傳入元素對象
  • presence_of_all_elements_located :所有元素加載出
  • text_to_be_present_in_element :某個元素文本包含某文字
  • text_to_be_present_in_element_value :某個元素值包含某文字
  • frame_to_be_available_and_switch_to_it :frame加載並切換
  • invisibility_of_element_located :元素不可見
  • element_to_be_clickable :元素可點擊
  • staleness_of :判斷一個元素是否仍在DOM,可判斷頁面是否已經刷新
  • element_to_be_selected :元素可選擇,傳元素對象
  • element_located_to_be_selected :元素可選擇,傳入定位元組
  • element_selection_state_to_be :傳入元素對象以及狀態,相等返回True,否則返回False
  • element_located_selection_state_to_be :傳入定位元組以及狀態,相等返回True,否則返回False
  • alert_is_present :是否出現Alert

實例:博客園標題判斷

# coding: utf-8
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
driver.get("http://www.cnblogs.com/101718qiong/")

title = EC.title_is(u"Silence&QH - 博客園") # 判斷title完全等於
print title(driver)
 
title1 = EC.title_contains("Silence&QH") # 判斷title包含
print title1(driver)

r1 = EC.title_is(u"Silence&QH - 博客園")(driver) # 另外寫法
r2 = EC.title_contains("Silence&QH")(driver)
print r1
print r2

更多操作參考:

http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.support.expected_conditions

9、瀏覽器瀏覽器操作

瀏覽器最大化、最小化

browser.maximize_window() # 將瀏覽器最大化顯示
browser.minimize_window() # 將瀏覽器最小化顯示

瀏覽器設置窗口大小

browser.set_window_size(480, 800) # 設置瀏覽器寬480、高800顯示

瀏覽器前進後退

  • back() :後退
  • forward():前進
import time
from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://www.baidu.com/')
browser.get('https://www.taobao.com/')
browser.get('https://www.python.org/')
browser.back()
time.sleep(1)
browser.forward()
browser.close()

10、cookie操作

  • get_cookies()
  • delete_all_cookes()
  • add_cookie()
browser.get('https://www.zhihu.com/explore')
print(browser.get_cookies())
browser.add_cookie({'name': 'name', 'domain': 'www.zhihu.com', 'value': 'zhaofan'})
print(browser.get_cookies())
browser.delete_all_cookies()
print(browser.get_cookies())

11、多窗口管理

通過執行js命令實現新開選項卡window.open(),不同的選項卡是存在列表裡browser.window_handles。

通過browser.window_handles[0]就可以操作第一個選項卡,current_window_handle:獲得當前窗口句柄

import time

browser.get('https://www.baidu.com')
browser.execute_script('window.open()')
print(browser.window_handles)
browser.switch_to.window(browser.window_handles[1])
browser.get('https://www.taobao.com')
time.sleep(1)
browser.switch_to.window(browser.window_handles[0])
browser.get('https://python.org')

12、異常處理

這裡的異常比較復雜,官網的參考地址:

http://selenium-python.readthedocs.io/api.html#module-selenium.common.exceptions

這裡隻進行簡單的演示,查找一個不存在的元素

from selenium import webdriver
from selenium.common.exceptions import TimeoutException, NoSuchElementException

browser = webdriver.Chrome()
try:
    browser.get('https://www.baidu.com')
except TimeoutException:
    print('Time Out')
try:
    browser.find_element_by_id('hello')
except NoSuchElementException:
    print('No Element')
finally:
    browser.close()

13.警告框處理

在WebDriver中處理JavaScript所生成的alert、confirm以及prompt十分簡單,具體做法是使用 switch_to.alert 方法定位到 alert/confirm/prompt,然後使用text/accept/dismiss/ send_keys等方法進行操作。

方法

  • text : 返回 alert/confirm/prompt 中的文字信息
  • accept() : 接受現有警告框
  • dismiss() : 解散現有警告框
  • send_keys(keysToSend) : 發送文本至警告框。keysToSend:將文本發送至警告框。

實例演示

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time

driver = webdriver.Chrome("F:\Chrome\ChromeDriver\chromedriver")
driver.implicitly_wait(10)
driver.get('http://www.baidu.com')

# 鼠標懸停至“設置”鏈接
link = driver.find_element_by_link_text('設置')
ActionChains(driver).move_to_element(link).perform()

# 打開搜索設置
driver.find_element_by_link_text("搜索設置").click()

#在此處設置等待2s否則可能報錯
time.sleep(2)
 # 保存設置
driver.find_element_by_class_name("prefpanelgo").click()
 time.sleep(2)

# 接受警告框
driver.switch_to.alert.accept()

driver.quit()

14、下拉框選擇操作

導入選擇下拉框Select類,使用該類處理下拉框操作。

from selenium.webdriver.support.select import Select

Select類的方法:

  • select_by_value(“選擇值”) select標簽的value屬性的值
  • select_by_index(“索引值”) 下拉框的索引
  • select_by_visible_testx(“文本值”) 下拉框的文本值

有時我們會碰到下拉框,WebDriver提供瞭Select類來處理下拉框。 如百度搜索設置的下拉框。

from selenium import webdriver
 from selenium.webdriver.support.select import Select
 from time import sleep

driver = webdriver.Chrome("F:\Chrome\ChromeDriver\chromedriver")
 driver.implicitly_wait(10)
 driver.get('http://www.baidu.com')

#1.鼠標懸停至“設置”鏈接
driver.find_element_by_link_text('設置').click()
 sleep(1)
 #2.打開搜索設置
driver.find_element_by_link_text("搜索設置").click()
 sleep(2)

#3.搜索結果顯示條數
sel = driver.find_element_by_xpath("//select[@id='nr']")
 Select(sel).select_by_value('50')  # 顯示50條

sleep(3)
 driver.quit()

15、文件上傳

對於通過input標簽實現的上傳功能,可以將其看作是一個輸入框,即通過send_keys()指定本地文件路徑的方式實現文件上傳。

通過send_keys()方法來實現文件上傳:

from selenium import webdriver
import os

driver = webdriver.Firefox()
file_path = 'file:///' + os.path.abspath('upfile.html')
driver.get(file_path)

# 定位上傳按鈕,添加本地文件
driver.find_element_by_name("file").send_keys('D:\\upload_file.txt')

driver.quit()

16、窗口截圖

自動化用例是由程序去執行的,因此有時候打印的錯誤信息並不十分明確。如果在腳本執行出錯的時候能對當前窗口截圖保存,那麼通過圖片就可以非常直觀地看出出錯的原因。WebDriver提供瞭截圖函數get_screenshot_as_file()來截取當前窗口。

截屏方法:

get_screenshot_as_file(self, filename) 用於截取當前窗口,並把圖片保存到本地

from selenium import webdriver
from time import sleep

driver =webdriver.Firefox(executable_path ="F:\GeckoDriver\geckodriver")
driver.get('http://www.baidu.com')

driver.find_element_by_id('kw').send_keys('selenium')
 driver.find_element_by_id('su').click()
 sleep(2)

#1.截取當前窗口,並指定截圖圖片的保存位置
driver.get_screenshot_as_file("D:\\baidu_img.jpg")

driver.quit()

17、關閉瀏覽器

在前面的例子中我們一直使用quit()方法,其含義為退出相關的驅動程序和關閉所有窗口。除此之外,WebDriver還提供瞭close()方法,用來關閉當前窗口。例多窗口的處理,在用例執行的過程中打開瞭多個窗口,我們想要關閉其中的某個窗口,這時就要用到close()方法進行關閉瞭。

  • close() 關閉單個窗口
  • quit() 關閉所有窗口

18、selenium規避被檢測識別

現在不少大網站有對selenium采取瞭監測機制。比如正常情況下我們用瀏覽器訪問淘寶等網站的 window.navigator.webdriver的值為 
undefined。而使用selenium訪問則該值為true。那麼如何解決這個問題呢?

隻需要設置Chromedriver的啟動參數即可解決問題。在啟動Chromedriver之前,為Chrome開啟實驗性功能參數excludeSwitches,它的值為['enable-automation'],完整代碼如下:

from selenium.webdriver import Chrome
from selenium.webdriver import ChromeOptions

option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = Chrome(options=option)

19、實例:

自動登陸CSDN

import time
import numpy as np
from numpy import random
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


def ease_out_expo(x):
    if x == 1:
        return 1
    else:
        return 1 - pow(2, -10 * x)


def get_tracks(distance, seconds, ease_func):
    tracks = [0]
    offsets = [0]
    for t in np.arange(0.0, seconds+0.1, 0.1):
        ease = globals()[ease_func]
        offset = round(ease(t / seconds) * distance)
        tracks.append(offset - offsets[-1])
        offsets.append(offset)
    return offsets, tracks


def drag_and_drop(browser, offset):
    # 定位滑塊元素
    WebDriverWait(browser, 20).until(
        EC.visibility_of_element_located((By.XPATH, "//*[@class='nc_iconfont btn_slide']"))
    )
    knob = browser.find_element_by_xpath("//*[@class='nc_iconfont btn_slide']")
    offsets, tracks = get_tracks(offset, 0.2, 'ease_out_expo')
    ActionChains(browser).click_and_hold(knob).perform()
    for x in tracks:
        ActionChains(browser).move_by_offset(x, 0).perform()
    # 放開
    ActionChains(browser).pause(random.randint(6, 14) / 10).release().perform()


chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--start-maximized")
browser = webdriver.Chrome(chrome_options=chrome_options)

browser.get('http://www.baidu.com')
browser.find_element_by_id('kw').send_keys('CSDN')
browser.find_element_by_id('su').click()
WebDriverWait(browser, 20).until(
    EC.visibility_of_element_located((By.PARTIAL_LINK_TEXT, "-專業IT技術社區"))
)

browser.find_element_by_partial_link_text('-專業IT技術社區').click()

browser.switch_to.window(browser.window_handles[1])  # 移動句柄
time.sleep(1)
browser.find_element_by_partial_link_text('登錄').click()
browser.find_element_by_link_text('賬號密碼登錄').click()
browser.find_element_by_id('all').send_keys('yangbobin')
browser.find_element_by_name('pwd').send_keys('pass-word')
browser.find_element_by_css_selector("button[data-type='account']").click()
time.sleep(5)  # 等待滑動模塊和其他JS文件加載完畢!
while True:
    # 定義鼠標拖放動作
    drag_and_drop(browser, 261)
    # 等待JS認證運行,如果不等待容易報錯
    time.sleep(2)
    # 查看是否認證成功,獲取text值
    WebDriverWait(browser, 20).until(
        EC.visibility_of_element_located((By.LINK_TEXT, "刷新"))
    )
    browser.find_element_by_link_text('刷新').click()

自動登陸163郵箱

首先,是163.的登陸為iframe

browser.switch_to_frame('x-URS-iframe')

到此這篇關於python爬蟲之selenium模塊的文章就介紹到這瞭。希望對大傢的學習有所幫助,也希望大傢多多支持WalkonNet。

推薦閱讀: