クローラー入門の学習ノート 5 日目 + 遭遇した小さな問題を記録する

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 に置き換えるだけです。

おすすめ

転載: blog.csdn.net/qq_51669241/article/details/122530796