目次
1. ラベルオブジェクトはテキストコンテンツと属性値を抽出します
1. テキストの取得: element_text
2. 属性値の取得: element.get_attribute("属性名")
コード:(4日目の学習をもとにforループの内容を書き直す)
import time
from selenium import webdriver
url = 'https://bj.58.com/chuzu/?PGTID=0d200001-0000-1fd0-27cd-e5f5a55e18c9&ClickID=1'
driver = webdriver.Chrome()
driver.get(url)
#取出标题
el_list = driver.find_elements_by_xpath('/html/body/div[6]/div[2]/ul/li/div[2]/h2/a')
for el in el_list:
print(el.text, el.get_attribute('href'))
for ループの最終出力は次のようになります: (テキスト + 属性値)
2. ラベル切り替え
1. ウィンドウ ハンドル (リスト)
ハンドルを取得します。タブ ページ オブジェクトの ID を指します。
current_windows = driver.window_handles
2. ウィンドウ ハンドル (リスト インデックスの添字)
driver.switch_to.window(current_windows[0])を介してラベルを切り替えます。
コード:
上の図で「rent」ボタンを見つけます - 右クリックしてチェックを入れます - xpath をコピーします - find_element() に記入します
from selenium import webdriver
from selenium.webdriver.common.by import By
url = 'http://jn.58.com/'
driver = webdriver.Chrome()
driver.get(url)
#先打印出来检查一下
print(driver.current_url)
print(driver.window_handles)
#定位并且点击租房按钮
el = driver.find_element(By.XPATH,'/html/body/div[3]/div[1]/div[1]/div/div[1]/div[1]/span[1]/a')
el.click()
#点击以后再打印一下url和句柄
print(driver.current_url)
print(driver.window_handles)
上記のコードはハンドルのリストを取得するものです。(最初は find_element_by_xpath() を使用しましたが、後でエラーが見つかりました。修正方法については以下のハイパーリンクを参照して、最終的には代わりに find_element() を使用します)。
上記のコードを実行すると、クリックがない場合の出力ハンドルは 1 行のみですが、クリック後はウィンドウが 2 つあるため、ハンドル リストは 2 行であることがわかります。
こちらのURLからは、ホームページ上での操作が主であり、新しく開いたページにジャンプして操作しているわけではないことがわかります。
ウィンドウを切り替えたい場合は、次のコードを追加します。
注: 開いているページのタイトルの xpath を find_elements() にコピーし、li タグのインデックスを削除してすべてのタイトルを選択します。
コードの後に次のように追加します。
driver.switch_to.window(driver.window_handles[-1])
el_list = driver.find_elements(By.XPATH,'/html/body/div[6]/div[2]/ul/li/div[2]/h2/a')
print(len(el_list)) #switch切换之后长度不为0
switch_to.window() がコメントアウトされている場合、ページが切り替わる前のホームページには対応するラベルがないため、出力 len は 0 になります。
3. ウィンドウの切り替え
ログイン QQ スペースを例に挙げます。
チェック - 「アカウント パスワード ログイン」ボタン、アカウント番号とパスワードの入力ボックスの ID、およびログイン ボタンの ID をチェックします。
コード: (以下の send_keys() で、ログインするにはアカウントとパスワードを入力する必要があります)
from selenium import webdriver
from selenium.webdriver.common.by import By
url = 'https://qzone.qq.com/'
driver = webdriver.Chrome()
driver.get(url)
el_frame = driver.find_element(By.XPATH,'//*[@id="login_frame"]')
driver.switch_to.frame('login_frame')
driver.find_element(By.ID,'switcher_plogin').click()
driver.find_element(By.ID,'u').send_keys('自己的账号')
driver.find_element(By.ID,'p').send_keys('自己的密码')
driver.find_element(By.ID,'login_button').click()
4. クッキーの運用について
コード:
from selenium import webdriver
url = 'https://www.baidu.com/'
driver = webdriver.Chrome()
driver.get(url)
# print(driver.get_cookies())
# cookies = {}
# for data in driver.get_cookies():
# cookies[data['name']] = data['value']
#上面三行写成正则表达式,如下:
cookies = {
data['name']:data['value'] for data in driver.get_cookies()}
print(cookies)
操作結果:
5、jsコードを実行する
新しいページに遭遇したとき、クリックすべきボタンがページ上にありません (ボタンをプルダウンして表示する必要があります)
スクロールバーのドラッグ:
js = 'scrollTo(x,y)'
ここで、x は通常 0 ですが、下にドラッグする場合は y に 0 より大きい値を入力する必要があります。
コード:
from selenium import webdriver
import time
url = 'https://www.某个网址.com/'
driver = webdriver.Chrome()
driver.get(url)
#js语句
js = 'window.scrollTo(0,document.body.scrollHeight)'
#执行js语句
driver.execute_script(js)
time.sleep(5)
driver.quit()
6. ページ待機中
ページ待機の 3 つのカテゴリ:
1. 必須の分類
固定待ち時間を設定します。
タイムスリープ(5)
2. 暗黙的な分類 (推奨)
待ち時間を設定します。時間が経過する前に対応する要素が見つかった場合は、次のステップに進みます。
driver.implicitly_wait(10)
3. 表示分類(理解)
要素を明示的に待ちます。
4. ケース:(淘宝網のページめくり)
コード:
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
url = 'https://www.taobao.com/'
driver = webdriver.Chrome()
driver.get(url)
time.sleep(1)
for i in range(10):
i += 1
try:
time.sleep(3)
element = driver.find_element(By.XPATH,'//div[@class="shop-inner"]/h3[1]/a')
print(element.get_attribute('href'))
break
except:
js = 'window.scrollTo(0,{})'.format(i*500)
driver.execute_script(js)
driver.quit()
7、構成オブジェクト
ヘッドレスモードを有効にする
コード:
from selenium import webdriver
url = 'http://www.baidu.com/'
#创建配置对象
opt = webdriver.ChromeOptions()
#添加配置参数
opt.add_argument('--headless')
opt.add_argument('--disable-gpu')
#创建浏览器对象的时候添加配置对象
driver = webdriver.Chrome(options=opt)
driver.get(url)
driver.save_screenshot('无界面浏览器截图.png')
ちょっとした問題が発生しました
1. Selenium要素の配置方法の文法が変更されました
エラー: 非推奨警告: find_element_by_* コマンドは非推奨です。代わりに find_element() を使用してください
el = driver.find_element_by_xpath は、
ここで xpath を使用したい解決策に対応しています:
deprecate by_xpath
同様に、find_element_by_id、class、およびその他のメソッドも find_element() メソッドに置き換えられます。
新しい位置決め方法
最後に忘れずにインポートしてください:
selenium.webdriver.common.by からインポート
2. オブジェクトの構成時に、chrome_options パラメータがエラーを報告する
冒頭のコード:
#创建浏览器对象的时候添加配置对象
driver = webdriver.Chrome(chrome_options=opt)
エラー:
非推奨の警告: chrome_options の代わりにオプションを使用してください
おそらく、パラメータ chrome_options が廃止されたためです。
chrome_options を options に置き換えるだけです。