Python爬虫類Selenium使用

15615 ワード

公式ドキュメント:
http://selenium-python.readthedocs.io/installation.html#introduction
ブラウザオブジェクトの宣言
Selenniumは多くのブラウザをサポートしていますが、システムにブラウザが存在しない場合はエラーが発生します.
from selenium import webdriver  #   webdriver 
browser = webdriver.Chrome()    #   chrome     
browser = webdriver.Firefox()
browser = webdriver.Edge()
browser = webdriver.Safari()

ページへのアクセス
from selenium import webdriver    #    

browser = webdriver.Chrome()    #      
browser.get('https://www.taobao.com')    #     
print(browser.page_source)    #        
browser.close()    #      

要素の検索
単一要素.find_element_*_*( )
browser = webdriver.Chrome()    #      
browser.get('https://www.taobao.com')    #     
input1 = browser.find_element_by_id('q')    #   id 'p'
input2 = browser.find_element_by_css_selector('#q')    #   css    id 'p'
input3 = browser.find_element_by_xpath('//*[@id="q"]')    #    xpath     id 'p'
print(input1, input2, input3)    #            
"3e230964450caa8b450fc5bfaf00bcaa", element="0.40898670165609774-1")> "3e230964450caa8b450fc5bfaf00bcaa", element="0.40898670165609774-1")> "3e230964450caa8b450fc5bfaf00bcaa", element="0.40898670165609774-1")>
browser.close()

個々のノードを取得する他の方法:
find_element_by_id
find_element_by_name
find_element_by_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

その他の使い方
#     find_element_by_id(id)
input1 = browser.find_element(By.ID, 'q')

複数の要素.find_elements_*_*()は単一の要素を検索するのと似ていますが、elementの後にsを追加しただけで、結果はリスト形式です.
要素の相互作用
取得した要素に対するインタラクションメソッドの呼び出し
from selenium import webdriver
import time

browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
input1 = browser.find_element_by_id('q')    #   id p   ,          
input1.send_keys('iPhone')      #      iPhone
time.sleep(1)
input1.clear()
input1.send_keys('iPad')    #        iPad
button = browser.find_element_by_class_name('btn-search')   #   class btn-search  ,     
button.click()  #       

http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.remote.webelement
インタラクティブアクション
動作チェーンに動作を付加するシリアル実行ウェブコードにframeが見つかった位置
from selenium import webdriver
from selenium.webdriver import ActionChains #        

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

JavaScriptの実行
execute_の使用script()インプリメンテーション進捗バードロップダウン
from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
#  execute_script  script           
browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')
browser.execute_script('alert("TO Bottom")')    #   JS  

要素情報、テキスト値の取得
from selenium import webdriver

browser = webdriver.Chrome()
url = 'https://www.zhihu.com/explore'
browser.get(url)
input = browser.find_element_by_id('zh-top-link-logo')

print(input.get_attribute('class'))  #           ,     
zu-top-link-logo

print(input.text)    #         
  

ID、場所、ラベル名、サイズの取得
print(input.id)         #   ID
0.04737602037454258-1

print(input.location)   #     
{'x': 28, 'y': 0}

print(input.tag_name)   #     
a

print(input.size)       #     
{'height': 45, 'width': 61}

Frame
前の例で操作したノードはiframeがサブフレームであり、サブページに相当し、サブノードframeの中では外のframeを操作できないため、switch_to.parent_frame()を使用する必要がある
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') #    frame
try:
    logo = browser.find_element_by_class_name('logo')   #           
except NoSuchElementException:        #           ,  NO LOGO
    print('NO LOGO')
browser.switch_to.parent_frame()    #      frame
logo = browser.find_element_by_class_name('logo')   #       
print(logo)     #       
print(logo.text)
#   :
NO LOGO
"1c1f828d79bea6676e5521e248e42449", element="0.7249380096596258-2")>
RUNOOB.COM

待ち受ける
Seleniumでは、get()メソッドは、Webフレームワークのロードが終了した後に実行を終了します.page_sourceを取得することは、ブラウザが完全にロードしたページではない可能性があります.一部のページに追加のAjaxリクエストがあれば、Webコードでも正常に取得できるとは限りません.そのため、ノードのロードを一定時間待つ必要があります.
暗黙的待機
ノードが検索され、ノードがすぐに現れない場合、暗黙的な待機はしばらく待ってから検索され、デフォルトの時間は0です.
from selenium import webdriver

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

明示的な待機
検索するノードを指定し、最長待機時間を指定します.指定した時間内にノードがロードされると、検索したノードが返され、そうでない場合はタイムアウト例外が放出されます.
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
# as   , EC  expected_conditions  
from selenium.webdriver.support import expected_conditions as EC

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

http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.support.expected_conditions
前進後退
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)    #   1 
browser.forward()    #        
browser.close()

Cookies
from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://www.zhihu.com/explore')
print(browser.get_cookies())    #   cookies
#       cookies 
browser.add_cookie({'name': 'name', 'domain': 'www.zhihu.com', 'value': 'germey'})                    
print(browser.get_cookies())    #     cookies
browser.delete_all_cookies()    #   cookies
print(browser.get_cookies())    #    cookies,  cookies  

タブアクション
import time
from selenium import webdriver

browser = webdriver.Chrome()
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')    #             

#    :
['CDwindow-4efe7c9f-d21d-42c9-964b-1f7743b4fc58', 'CDwindow-d2940963-7686-4325-a5ca-f944eeb6a0b7']
#