当前位置: 首页 > 知识库问答 >
问题:

Python Selenium Web驱动程序-代理:查询参数

沈琛
2023-03-14

我看到的挑战是,通过selenium,我试图点击一个网站元素(一个带有一些js的div)。“按钮”可将您导航到另一页。

如何配置浏览器以通过代理自动路由请求

我的代理设置如下:http://api.myproxy.com?key=AAA111BBB6

我试图将webdriver(chrome)置于代理之后

from selenium import webdriver   
options = webdriver.ChromeOptions()
driver = webdriver.Chrome(chrome_options=options)

到目前为止,选项是浏览器窗口大小的一些基本配置。

我看过很多例子(ex1、ex2、ex3),但不知何故,我找不到一个适合我需要的例子。

import os 
dir_path = os.path.dirname(os.path.realpath(__file__)) + "\\chromedriver.exe"
PROXY = "http://api.scraperapi.com?api_key=1234&render=true"

from selenium import webdriver   
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server=%s' % PROXY)
driver = webdriver.Chrome(executable_path = dir_path, chrome_options=chrome_options)

driver.get("https://stackoverflow.com/questions/11450158/how-do-i-set-proxy-for-chrome-in-python-webdriver")

共有2个答案

蔚学林
2023-03-14

经过无数次的实验,我发现这个东西可以用:

apiURL = "http://api.scraperapi.com/?api_key="+APIKEY+"&render=true&url="

而惨败与

apiURL = "http://api.scraperapi.com?api_key="+APIKEY+"&render=true&url="

我不得不承认我的无知:我认为两者应该是等价的

融泓
2023-03-14

虽然您使用的代理地址似乎不是实际的代理,但它是一个API,在处理代理、验证码或任何IP阻塞后返回页面本身的HTML内容。但对于不同的场景,可能会有不同的解决方案。其中一些如下。

情景1

因此,据我所知,如果您的API提供了通过代理返回访问页面响应的功能,那么您使用此API的方式是错误的。

所以它应该直接在driver.get()中使用,地址="http://api.scraperapi.com/?api_key=YOURAPIKEY

示例代码如下:

import os
dir_path = os.path.dirname(os.path.realpath(__file__)) + "\\chromedriver.exe"
APIKEY=1234 #replace with your API Key
apiURL = "http://api.scraperapi.com/?api_key="+APIKEY+"&render=true&url="

visit_url = "https://stackoverflow.com/questions/11450158/how-do-i-set-proxy-for-chrome-in-python-webdriver"

from selenium import webdriver
driver = webdriver.Chrome(executable_path = dir_path)
driver.get(apiURL+visit_url)

情景2

但是如果你有一些提供代理地址和登录凭据作为响应的应用编程接口,那么它可以在chrome选项中被捏造出来,用于chrome本身。

若api的响应类似于

  • "PROTOCOL://user:password@proxyserver: proxyport"(在认证的情况下)
  • PROTOCOL://proxyserver: proxyport(在空身份验证的情况下)

在这两种情况下,协议可以像HTTP、HTTPS、SOCKS4、SOCKS5等。

代码应该看起来像:

import os 
dir_path = os.path.dirname(os.path.realpath(__file__)) + "\\chromedriver.exe"
import requests
proxyapi = "http://api.scraperapi.com?api_key=1234&render=true" 
proxy=requests.get(proxyapi).text

visit_url = "https://stackoverflow.com/questions/11450158/how-do-i-set-proxy-for-chrome-in-python-webdriver"

from selenium import webdriver   
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server='+proxy)
driver = webdriver.Chrome(executable_path = dir_path, chrome_options=chrome_options)
driver.get(visit_url)

情景3

但是如果你有一些API本身是一个带有空身份验证的代理,那么可以在chrome选项中使用它来与chrome本身一起使用。

代码应该看起来像:

import os 
dir_path = os.path.dirname(os.path.realpath(__file__)) + "\\chromedriver.exe"
proxyapi = "http://api.scraperapi.com?api_key=1234&render=true" 

visit_url = "https://stackoverflow.com/questions/11450158/how-do-i-set-proxy-for-chrome-in-python-webdriver"

from selenium import webdriver   
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server='+proxyapi)
driver = webdriver.Chrome(executable_path = dir_path, chrome_options=chrome_options)
driver.get(visit_url)

因此,该解决方案可以根据不同的场景使用。

 类似资料:
  • 我正在尝试使用MongoDBJava驱动程序作为聚合命令的一部分创建查询。目前我允许日期范围或特定日期数组作为参数。例如 日期范围查询工作正常,我解析xml并将其转换为在mongo中生成以下查询的DBObject; 对于指定日期,我只想返回在给定日期的00:00:00.000和第二天的00:00:00.000之间发生的结果。根据我对mongo查询的基本了解,我希望做一个类似于日期范围的$匹配,但是

  • 我使用python脚本,它传递给卡桑德拉批处理查询,如下所示: 这是一段时间的工作,但在启动脚本失败并打印后约2分钟内: 我将超时从 更改为: read_request_timeout_in_ms:15000 range_request_timeout_in_ms:20000 write_request_timeout_in_ms:20000 cas_contention_timeout_in_m

  • 问题内容: 我有一个使用mongodb本机驱动程序的node.js应用程序。在使用节点v8.9.1将应用程序代码迁移到异步/等待的过程中,我努力寻找一种适合mongodb查询的好方法。mongodb驱动程序的主要问题是,所有查询都使用回调,其中对异步方法来说,promise函数是必需的。 备择方案: 猫鼬 -承诺不赞成使用查询,它会强制使用Schema模型,这对我的应用程序来说有点开销。 mong

  • 通过使用MongoDB和Java驱动程序,我有一个用户集合,我想根据他们的ObjectId进行查询(总体情况:我从ObjectId推断出对象的创建时间戳)。 问题是,用ObjectId查询似乎不起作用:我总是没有结果。为了测试的目的,我在搜索查询中硬编码了数据库中现有用户的ObjectId,只是为了确保我能得到结果: {“_id”:ObjectId(“565ef85ee4b0a4db3c2fc96

  • 问题内容: 我在以下代码中: 我想打印用户代理HTTP标头,并可能对其进行更改。可能吗? 问题答案: Selenium中无法读取请求或响应头。您可以通过指示浏览器通过记录此类信息的代理进行连接来实现。 在Firefox中设置用户代理 更改Firefox用户代理的通常方法是在Firefox配置文件中设置变量。请注意,这与硒无关。 您可以指示Selenium使用与默认配置文件不同的配置文件,如下所示:

  • 我试图在MongoDB\驱动程序\查询中使用选项: 如果$选项似乎可以: --------$options: 数组([排序]= $query没有给我好的选项: 限制和批量大小不等于20,为什么?请问怎么办? 提前感谢