当前位置: 首页 > news >正文

“桌面自动化”解救“浏览器自动化”受阻(反爬虫检测)(pywinauto、pyautogui、playwright)

桌面自动化拯救浏览器自动化

使用playwright自动化访问或爬取一些网页时,网站需要用户登录信息,一些网站在检测到用户是使用浏览器自动化工具登录时会阻止用户进入,怎么办?其实解决办法很简单:使用pywinauto、pyautogui等桌面自动化工具直接操控真实的浏览器(保存有用户登录信息),这样就可以绕过网站的各种反爬虫检测,顺利进入目标网站。再把网页内容通过文件的形式保存下来,之后再通过playwright的set_content等功能,直接加载已经保存在本地的网页文件,其后的网页内容获取流程和一般的playwright抓取网页内容流程就一样了。

一般的playwright爬虫易受网站反爬虫检测拒绝用户获取内容:

编写
操作
访问
反爬虫检测
拒绝访问
用户
playwright
浏览器自动化
爬虫程序
chromium浏览器
目标网站

使用桌面自动化工具可解决上述难题

编写
操作
访问
正常返回信息
无法拒绝访问
保存
编写
爬取目标内容细节
用户
pywinauto
桌面自动化
爬虫程序
真实浏览器
重复利用
用户登录信息
目标网站
网页文件
playwright
浏览器自动化
爬虫程序

实现

import os
import pyperclip
import pywinauto
import pyautogui
import time
import subprocess
from playwright.sync_api import sync_playwright####################################
def chrome_browse(url:str,js:str="")->str:'''使用chrome打开指定url'''#-------------------------------------# 子程序:def graceful_close_chrome():'''优雅关闭Chrome浏览器,避免启动时弹出提醒对话框'''try:# 先尝试正常关闭已有的Chrome窗口app = pywinauto.Application(backend="uia").connect(title_re=".*Chrome.*", class_name="Chrome_WidgetWin_1", timeout=5)chrome_window = app.window(title_re=".*Chrome.*", class_name="Chrome_WidgetWin_1")if chrome_window.exists():chrome_window.set_focus()chrome_window.type_keys("%{F4}")  # Alt+F4关闭窗口time.sleep(2)except Exception as e:print(f"尝试正常关闭Chrome时出错: {e}")# 如果还有残留进程,使用taskkill但不加/f参数(允许Chrome自我清理)try:os.system('taskkill /im chrome.exe /t')time.sleep(3)except Exception:pass# 子程序结尾#-------------------------------------  graceful_close_chrome()  #-------------------------------------# 通过subprocess启动chrome,添加启动参数,禁用弹出对话框chrome_args = [r"C:\Program Files\Google\Chrome\Application\chrome.exe","--force-renderer-accessibility","--disable-features=TranslateUI,BlinkGenPropertyTrees","--disable-session-crashed-bubble",  # 禁用崩溃气泡提示"--no-default-browser-check","--no-first-run","--disable-prompt-on-repost","--disable-background-mode"]# 启动chromesubprocess.Popen(chrome_args)time.sleep(3)#-------------------------------------# pywinauto连接chrome窗口app = pywinauto.Application(backend="uia").connect(title_re=".*Chrome.*", class_name="Chrome_WidgetWin_1")time.sleep(3)# # 启动chrome应用# app = pywinauto.Application(backend="uia").start(r"C:\Program Files\Google\Chrome\Application\chrome.exe --force-renderer-accessibility")# time.sleep(3)#-------------------------------------# 找到chrome窗口chrome_window=app.window(title_re=".*Chrome.*", class_name="Chrome_WidgetWin_1")#chrome_window = app.top_window()chrome_window.print_control_identifiers()time.sleep(1)#-------------------------------------# 窗口设置为焦点chrome_window.set_focus()# 按下Ctrl+L组合键,快捷键锁定地址栏chrome_window.type_keys("^l")time.sleep(1)# 输入url# 通过剪贴板输入url,防止中文输入法数字导致输入错误pyperclip.copy(url)pyautogui.hotkey("ctrl", "v")time.sleep(1)# 按下Enter键chrome_window.type_keys("{ENTER}")time.sleep(3)#-------------------------------------# 鼠标移动到指定位置pyautogui.moveTo(100, 300)# 滚屏20次for i in range(20):# 按下Ctrl+PgDn组合键pyautogui.scroll(-2000)print(f'滚屏{i}次')time.sleep(1)#-------------------------------------# 通过快捷键ctrl+s保存当前页面chrome_window.type_keys("^s")time.sleep(3)# 利用时间戳,构造唯一文件名time_stamp=time.time()file_name=f"test.{time_stamp}.html"# 将文件名复制到剪贴板备用pyperclip.copy(file_name)    # 先删除旧的文件名pyautogui.press("backspace")# 从剪贴板粘贴文件名pyautogui.hotkey("ctrl", "v")# 保存类型:网页,全部(*.htm;*.html),可先手动操作一遍,浏览器会记住偏好print(f'文件名: {file_name}')time.sleep(1)# 按下Enter键pyautogui.press("enter")time.sleep(1)# pyautogui.press("enter")# 等待文件保存完毕for i in range(20):print(f'已经等待{i}秒')time.sleep(1)#-------------------------------------# 关闭chrome窗口chrome_window.close()print('chrome窗口已关闭')#-------------------------------------# 下载的html文件默认保存在Downloads目录下html_filename=f'C:/Users/admin/Downloads/{file_name}'print(html_filename)#-------------------------------------# playwright打开html文件    with sync_playwright() as p:browser = p.chromium.launch(headless=False)context=browser.new_context(ignore_https_errors=True)      page = context.new_page()#直接读取文件内容,并用playwright加载content=""try:with open(html_filename, 'r', encoding='utf-8') as file:content = file.read()# print(content) except Exception as e:print(f"读取保存的网页文件时出错: {e}")page.set_content(content)page.wait_for_load_state("domcontentloaded")#可定制更加精细的内容获取脚本:if js is None or js=="":js="""()=>{return document.body.innerText;}"""else:passresult=""try:result=page.evaluate(js)page.wait_for_timeout(3000)except Exception as e:print(f"执行js脚本时出错: {e}")print(result)browser.close()return result####################################
if __name__ == "__main__":# 运行主程序url="https://example.com"# “\”字符需使用r字符串,如不用r字符串,这写为“\\”js=r"""()=>{let ls=document.querySelectorAll("tr td:nth-child(2)");let r="";for(let l of ls){r+=l.innerText+"\n";}return r;}"""result=chrome_browse(url,js=js)print(result)
http://www.dtcms.com/a/498718.html

相关文章:

  • 线程安全集合源码速读:Hashtable、Vector、Collections.synchronizedMap
  • 大文件上传与文件下载
  • React Native 项目中 WebSocket 的完整实现方案
  • 电脑建设银行怎样设置网站查询密码手机网站建设价钱是多少
  • Linux内核ida数据结构使用
  • SAP MM委外采购订单执行报表分享
  • Docker中授权普通用户使用docker命令以及解决无权限访问/var/run/docker.sock错误
  • 算法奇妙屋(八)-泰波那契数列模型
  • 荆门哪里做网站女生学建筑工程技术就业前景
  • HarmonyOS中ArkTS与Flutter数据类型对比详解
  • 【11408学习记录】考研数学核心突破:线性变换的深度解析与应用实例
  • PHP8.5 的新 URI 扩展
  • 基于单片机的 220v车载逆变电源的设计与制作(论文+图纸)
  • 网站建设定制设计南京企业网站开发
  • python|运算符
  • 基于精准营养与数字表型的糖尿病生活方式干预新范式
  • 基于开源AI大模型、AI智能名片与S2B2C商城小程序的购物中心精准零售数据架构研究
  • 深度学习进阶(八)——AI 操作系统的雏形:AgentOS、Devin 与多智能体协作
  • 旧物新生,从二手回收小程序开启绿色生活
  • 网站建设模板代理手机购物app排行榜前十名
  • openharmony之分布式购物车开发实战
  • 音乐网站建设的意义全媒体运营技巧和工具
  • 关于最简单的机器学习的梯度下降公式的求导过程
  • 【AI】一文说清楚神经网络、机器学习、专家系统
  • C语言数据结构:算法复杂度(2)
  • MySQL————索引
  • 建设网站具体步骤电子报 网站开发
  • 站外引流推广渠道专业的高密网站建设
  • (Kotlin高级特性二)kotlin内联函数(inline)的作用?为什么noinline和crossinline?
  • 网站关键词在哪里看做网站工作量怎么算