playwright--自動化(三): 跳過檢測 使用正常谷歌 指定使用者資料 下載檔案

發表於2022-01-04

首先上一個被拷貝的慘不忍睹 上一個是滑塊驗證[https://www.cnblogs.com/carl-/p/15761861.html]

還是前兩天做一個商城後臺爬蟲,限制使用者快取,不能用谷歌開發版本,同時需要下載檔案。

話不多說上程式碼[https://www.cnblogs.com/carl-/p/15762714.html]

import getpass
from playwright.sync_api import sync_playwright
# 不出意外這個可以獲取到你google的本地快取檔案
__USER_DATE_DIR_PATH__ = f"C:\\Users\\{getpass.getuser()}\\AppData\Local\Google\Chrome\\User Data"

playwright = sync_playwright().start()
browser = playwright.chromium.launch_persistent_context(
                    # 指定本機使用者快取地址
                    user_data_dir=__USER_DATE_DIR_PATH__,
                    # 指定本機google客戶端exe的路徑
                    executable_path=__EXECUTABLE_PATH__,
                    # 要想通過這個下載檔案這個必然要開  預設是False
                    accept_downloads=True,
                    # 設定不是無頭模式
                    headless=False,
                    bypass_csp=True,
                    slow_mo=10,
                    #跳過檢測
                    args=['--disable-blink-features=AutomationControlled']
                )

注意用這個方法啟動的瀏覽器會自帶一個頁面存在,當然你還是可以重新再起一個

# 開啟新頁
page = browser.new_page()
# 訪問谷歌首頁
page.goto('https://www.google.com',wait_until='networkidle',timeout=90000)
wait_until='networkidle' 意思是 跳轉過後再一定時間內沒有網路請求連結
timeout 很好理解 超時時間90秒

js注入(用途的話是選擇器選擇元素用的,具體的js 你們自己寫)

# 算是獲得控制程式碼吧
window_handle = page.evaluate_handle("window")
# 選擇元素
window_handle.evaluate("document.querySelectorAll('#drrReportRangeTypeRadioMonthly')[0].checked=true")
# 自帶select選擇 data自行補充
drrMonthlySelect = page.wait_for_selector('//select[@id="drrMonthlySelect"]')
drrMonthlySelect.select_option(date)

接下來是下載操作

# 開啟下載器
with page.expect_download() as download_info:
  #找到你要下載的東西,找到點選的元素,點選
  page.wait_for_selector('//a[@id="sspa-reports:report-settings-page:-download-button"]').click()
# 下載的東西
download = download_info.value
# 下載的路徑
download.path()
# 下載的檔名
download.suggested_filename
# 關閉頁面
page.close()
# 關閉瀏覽器
browser.stop()

剩下的操作 你想幹啥幹啥

# 補充幾個
# 點選
page.click('//input[@id="signInSubmit"]')
# 等待完成
self.page.wait_for_load_state("domcontentloaded")
# 輸入
page.fill('//input[@id="ap_email"]', user_str)
# 查詢元素
page.wait_for_selector('//select[@id="drrMonthlySelect"]')

相關文章