免責事項:この記事は調査および研究のみを目的としており、違法な目的での使用は禁じられています。それ以外の場合は、自己責任で行ってください。違反がある場合は、通知して削除してください。ありがとうございます。
プロジェクトシーン:
これはまだ私の最初の駆け出しの話です。当時、私は会社のインターンでした。仕事に行った最初の日、お尻が熱くなる前に運転するように呼ばれました。ディレクターは私にクローラープロジェクトを独立して担当するように頼みました。一般的な需要:フロントエンド入力会社名前、バックエンドはデータを取得してmysqlに保存し、クローラーは会社名に従ってqccのデータ情報をクロールしてmysqlに保存し、バックエンドから対応する情報を取得してフロントエンドディスプレイに送信します。会社の応答時間は5秒以内である必要があります。私はqccに登っていませんが、私の心はまだ少し想像上のものです。1週間以内にオンラインでテストを行い、自動テストツールのセレンを使用できるようにする必要があります(当時はまったく触れていませんでした~~)ゆっくり教えて...
問題の説明:
ピット1
ログインせずに完全な電話および電子メール情報を取得することはできません。
ピット2
時々ポップアップして、ログインを求めます。
ピット3
リクエストが多すぎるため、列をクリックするたびにログインを求められます。
ピット4
リクエストが特定の回数に達すると、qccのクローラー検出がトリガーされるため、検出されたスライダー検証コードを手動でスライドする必要があります。
原因分析:
当然、これはこのウェブサイトのクロール防止対策であり、完全なデータはログインした場合にのみ提供されます。
解決:
したがって、何があっても、このWebサイトで完全なデータを取得するには、ログインする必要があります。ログインする方法はいくつありますか。qccログインページを見つけました。ここでは、3つの直接ログインと3つの許可されたログインを確認できます。パスワードログインを選択しました(もちろん、他の方法も可能です)。
スライダーをスライドさせたいので、ナビゲーションバーを描きすぎないように、最初にスライドする必要のある距離を計算する必要があります。下の図からわかるように、ナビゲーションバーの長さは348、スライダーの長さは40なので、distance = 348-40 = 308
次に、セレンを使用してマウスのクリックと動きを模倣しました。前のコードは見つかりませんでした。最終的な結果として、スライダーを最後までスライドさせることはできましたが、ページにログインできず、例外が発生しました。
これは、セレンがブラウザを起動したことをシステムページが検出すると、パラメータwindow.navigator.webdriverがデフォルトでtrueに設定され
、独自のブラウザが実際には未定義またはfalseであるためです。
したがって、この問題を解決する方法は、セレンがデフォルトのtrueの表示を提供するため、もちろんtrueに設定せず、次のパラメーターを追加するだけです。
option.add_experimental_option('excludeSwitches', ['enable-automation']) # webdriver防检测
OK!これまでのところ、スライダーを確認できます!
ここにテストコードを添付してください
import time
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
url = "https://www.qcc.com/user_login?back=%2F"
option = webdriver.ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation']) # webdriver防检测
option.add_argument("--no-sandbox")
option.add_argument("--disable-dev-usage")
desired_capabilities = DesiredCapabilities.CHROME # 修改页面加载策略
desired_capabilities["pageLoadStrategy"] = "none" # 注释这两行会导致最后输出结果的延迟,即等待页面加载完成再输出
driver = webdriver.Chrome(options=option)
driver.get(url)
time.sleep(2)
driver.find_element_by_id('normalLogin').click() # 点击密码登入
time.sleep(1)
#输入账号密码
driver.find_element_by_id('nameNormal').send_keys('123456')
driver.find_element_by_id('pwdNormal').send_keys('123456')
#获取滑块
button = driver.find_element_by_id('nc_1_n1z')
# 滑动滑块
ActionChains(driver).click_and_hold(button).perform()
ActionChains(driver).move_by_offset(xoffset=308, yoffset=0).perform()
ActionChains(driver).release().perform()
time.sleep(11111)