Python爬虫類Selenium使用
15615 ワード
公式ドキュメント:
http://selenium-python.readthedocs.io/installation.html#introduction
ブラウザオブジェクトの宣言
Selenniumは多くのブラウザをサポートしていますが、システムにブラウザが存在しない場合はエラーが発生します.
ページへのアクセス
要素の検索
単一要素.find_element_*_*( )
個々のノードを取得する他の方法:
その他の使い方
複数の要素.find_elements_*_*()は単一の要素を検索するのと似ていますが、elementの後にsを追加しただけで、結果はリスト形式です.
要素の相互作用
取得した要素に対するインタラクションメソッドの呼び出し
http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.remote.webelement
インタラクティブアクション
動作チェーンに動作を付加するシリアル実行ウェブコードにframeが見つかった位置
JavaScriptの実行
execute_の使用script()インプリメンテーション進捗バードロップダウン
要素情報、テキスト値の取得
ID、場所、ラベル名、サイズの取得
Frame
前の例で操作したノードはiframeがサブフレームであり、サブページに相当し、サブノードframeの中では外のframeを操作できないため、switch_to.parent_frame()を使用する必要がある
待ち受ける
Seleniumでは、get()メソッドは、Webフレームワークのロードが終了した後に実行を終了します.page_sourceを取得することは、ブラウザが完全にロードしたページではない可能性があります.一部のページに追加のAjaxリクエストがあれば、Webコードでも正常に取得できるとは限りません.そのため、ノードのロードを一定時間待つ必要があります.
暗黙的待機
ノードが検索され、ノードがすぐに現れない場合、暗黙的な待機はしばらく待ってから検索され、デフォルトの時間は0です.
明示的な待機
検索するノードを指定し、最長待機時間を指定します.指定した時間内にノードがロードされると、検索したノードが返され、そうでない場合はタイムアウト例外が放出されます.
http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.support.expected_conditions
前進後退
Cookies
タブアクション
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']
#