在 Selenium 4.10 中使用有效的 Python HTTPS 代理(机器人检测和错误)

Using Working Python HTTPS Proxies with Selenium 4.10 (Bot Detection and Errors)

提问人:CraigslistCesium 提问时间:8/1/2023 最后编辑:CraigslistCesium 更新时间:8/1/2023 访问量:113

问:

我一直在互联网上搜索让我的 Selenium Web 爬虫与代理一起工作。 我的系统是Mac OS High Sierra 10.13.6

我目前已更新到 Selenium 4.10、Python 3.11.4,并制作了一些代码来登录我的网页。我正在测试 Undetected ChromeDriver 和 Chromedriver 114.05735.90,有和没有代理,看看自动化的区别。

这个 Option 参数是我一直在用于 Chromedriver 114 的参数

opts.add_argument(f'--proxy-server=https://{proxy_use}')

我正在传入代理的数组索引,索引中都有 IP 和 PORT。然后,我将变量传递给执行 Selenium 代码的类。这是 Chrome 114 First 的代码片段。最初在 if1 语句中调用 chromedriver 的原因是在随机选择的第一个索引变量 i2 为零时设置驱动程序选项和服务,这也包括初始代理设置。索引变量 ii3 是代理数组索引。设置函数中的驱动程序被传递到一个类中,然后该类被索引到 for4 循环的主体。

for x in range(0, i):

                    if choice == '1':
                        if ii == len(arr):
                                    print("Recycle Proxies...")
                                    ii = 0
                        if Choice == 'Y' and i > 0:
                                proxy_use = str(arr[ii])
                                opts.add_argument('--proxy-server=https://{proxy_use}'))
                                print("\nProxy " + str(arr[ii]))
                        if i == 0:
                            url = "www.example.com"
                            opts,s = drive_setup(opts,Choice,arr,ii)
                            driver = webdriver.Chrome(service=s, options = opts)
                            driver.get(url)
                
                        Bot(driver, arr_U, arr_P, i, w_file)
                        time.sleep(5)
                        driver.execute_script("window.open('');")
                        driver.switch_to.window(driver.window_handles[1])
                        driver.get(url)
                        driver.switch_to.window(driver.window_handles[0])
                        driver.close()
                        driver.switch_to.window(driver.window_handles[0])

错误是ERR_TIME_OUT

以下是我的驱动程序选项:

def drive_setup(opts,Choice,arr,ii):
            header = {'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36',
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
            'Accept-Language': 'en-US,en;q=0.9',
            'Accept-Encoding': 'gzip, deflate, br'}
            #opts.add_argument('--no-sandbox')
            opts.add_argument(f"user-agent={header}")
            opts.add_argument('--disable-blink-features')
            opts.add_argument('--disable-blink-features=AutomationControlled')
            opts.add_argument('--window-size=1920,1080')
            opts.add_argument('--disable-gpu')
            opts.add_argument('--allow-running-insecure-content')
            opts.add_argument("--disable-dev-shm-usage")
            if Choice == 'Y':
                                proxy_use = str(arr[ii])
                                opts.add_argument(f'--proxy-server=https://{proxy_use}')
                                print("\nProxy " + str(arr[ii]))
            #opts.add_argument("--headless")
            s = Service('driver_chrome.exe')
            return opts, s

然后,使用未检测到的Chrome,我注意到选项和代理的使用存在差异。当选项变成时,我研究了 GitHub 上的故障排除,为了让代理工作,我注意到了导入 pproxy。我也尝试使用它,制作一个本地服务器并使用远程 HTTPS 作为带有自签名证书的给定代理,同时一直使用 --sys 和 -vv 标志来设置系统代理,我知道 Google Chrome 使用。opts = uc.ChromeOptions()

此代码片段中此未检测到的 Chrome 驱动程序中的错误是 ERR_PROXY_NOT_SUPPORTED,它使用 pproxy,该命令的哪一部分需要侦听两个端口,因为网站在端口 80 (HTTP) 和 443 (HTTPS) 上运行。

for x in range(0, i):
                    proxy_server = '127.0.0.1'
                    lport1 = 443
                    lport2 = 80

                    if choice == '1':
                        if ii == len(arr):
                                    print("Recycle Proxies...")
                                    ii = 0
                        if Choice == 'Y' and i > 0:
                                opts.add_argument(f'--proxy-server=https://{proxy_server}:{lport1}')
                                print("\nProxy " + str(arr[ii]))
                        if i == 0:
                            url = "www.example.com"
                            opts,s = drive_setup(opts,Choice,arr,ii)
                            driver = webdriver.Chrome(service=s, options = opts)
                            pproxy_command = f"pproxy -l https://{proxy_server}:{l_port1} -l http://{proxy_server}:{lport2} --ssl -cert server.cert,server.key -r https://{proxy_use} --sys -vv'
                            process = subprocess.Popen(pproxy_command.split())
                            driver.get(url)
                
                        Bot(driver, arr_U, arr_P, i, w_file)
                        time.sleep(5)
                        driver.execute_script("window.open('');")
                        driver.switch_to.window(driver.window_handles[1])
                        driver.get(url)
                        driver.switch_to.window(driver.window_handles[0])
                        driver.close()
                        driver.switch_to.window(driver.window_handles[0])
                        process.terminate()

我的程序无需代理即可运行,但是我想找到实现机器人检测的最佳方法。

  1. 在当前版本的 selenium 的机器人检测方面,实现代理的最佳方法是什么?
  2. 在代理方面,未检测到的 ChromeDriver 或 ChromeDriver 14.xxx.xx(来源)是实现反机器人检测的最佳方式吗?
  3. 导入是否令人满意,以达到通过 Class(模块) 的最终目标?

我用多个代理进行了测试

我试过了:

  1. 格式化代理,使用不同的代理,在Mac OS中检查系统自动代理发现。 使用原始方法,出现错误超时

  2. 使用 pproxy import 为远程格式化代理数组索引的 HTTP 和 HTTPS 侦听器创建本地服务器,并使用未检测到的 chromedriver。

  3. 调用类时使用 PPROXY 创建并行进程,并出现隧道连接错误

selenium-webdriver http-proxy 未检测到的 chromedriver 代理

评论


答: 暂无答案