如何通过Python使用Selenium设置爬虫代理
使用Selenium可以抓取动态网站,但是您的脚本可能会被检测为机器人并且您的 IP 被禁止。从好的方面来说,您可以使用 Selenium 代理来避免这一切。
什么是Selenium代理?
代理充当客户端和服务器之间的中介。通过它,客户端可以匿名和安全地向其他服务器发出请求,并避免地域限制。
无头浏览器支持像 HTTP 客户端这样的代理服务器。Selenium 代理有助于保护您的 IP 地址并避免在访问网站时被阻止。
继续阅读以了解如何在 Selenium 中设置代理以进行网络抓取!
准备工作
首先,您需要安装 Python 3。大多数平台默认都有它,因此您可以使用以下命令检查是否安装:
python --version
它应该返回这样的东西:
Python 3.11.2
如果出现错误或打印版本为2.x,则应下载Python 3.x并按照安装说明进行设置。
接下来,初始化一个新的 Python 项目并添加Selenium Python 绑定包:
pip install selenium
Selenium 可以控制许多浏览器,但我们将使用 Google Chrome,因为它是最常用的浏览器。确保您安装了最新的 Chrome 版本。
现在,将WebDriver Manager添加到您的项目中:
pip install webdriver-manager
这是一个简化驱动程序管理的 Python 包。详细来说,它可以让您免于每次升级 Chrome 时都下载新的 ChromeDriver 版本。
是时候使用您在 Python 脚本中安装的内容开始使用 Selenium 控制 Chrome 了。下面的代码片段导入工具,初始化ChromeWebDriver
实例并使用它来访问示例目标页面。
from selenium import webdriver from selenium.webdriver.chrome.service import Service as ChromeService from webdriver_manager.chrome import ChromeDriverManager driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install())) driver.get('https://example.com/')
您刚刚了解了如何在 Python 中开始使用 Selenium。让我们看看如何使用代理!
如何在 Selenium 中设置代理
要在 Selenium 中设置代理,您需要:
- 检索有效的代理服务器。
- 在 Chrome 选项中指定它
--proxy-server
。 - 访问您的目标页面。
让我们一步步回顾整个过程。
首先,从Free Proxy List获取代理服务器 URL 。然后,配置 Selenium 以使用Options
以下标志启动 Chrome --proxy-server
:
from selenium import webdriver from selenium.webdriver.chrome.service import Service as ChromeService from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.chrome.options import Options # define custom options for the Selenium driver options = Options() # free proxy server URL proxy_server_url = "157.245.97.60" options.add_argument(f'--proxy-server={proxy_server_url}') # create the ChromeDriver instance with custom options driver = webdriver.Chrome( service=ChromeService(ChromeDriverManager().install()), options=options )
Chrome 的受控实例现在将通过指定的代理执行所有请求。
接下来,导航到http://httpbin.org/ip
作为目标站点:
driver.get('http://httpbin.org/ip')
注意:此站点将返回请求来自的 IP,这对于本示例来说很方便。
您可以像这样打印目标网页中包含的 JSON 值:
print(driver.find_element(By.TAG_NAME, "body").text)
把它们放在一起:
from selenium import webdriver from selenium.webdriver.chrome.service import Service as ChromeService from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By # define custom options for the Selenium driver options = Options() # free proxy server URL proxy_server_url = "157.245.97.60" options.add_argument(f'--proxy-server={proxy_server_url}') # create the ChromeDriver instance with # custom options driver = webdriver.Chrome( service=ChromeService(ChromeDriverManager().install()), options=options ) # print the IP the request comes from print(driver.find_element(By.TAG_NAME, "body").text)
这是它将返回的内容:
{ "origin": "157.245.97.60" }
站点响应与代理服务器 IP 匹配。这意味着 Selenium 正在根据需要通过代理服务器访问页面。🥳
注意:免费代理是短暂且不可靠的,所以上面代码片段中使用的代理很可能不起作用。我们将在本教程后面看到一个更好的选择。
您现在了解了使用 Python Selenium 代理的基础知识。让我们深入研究更高级的概念!
使用 Python Selenium 进行代理身份验证:用户名和密码
一些代理服务器依靠身份验证来限制对具有有效凭据的用户的访问。商业解决方案或高级代理通常就是这种情况。
在经过身份验证的代理 URL 中指定用户名和密码的语法对于 Selenium 如下所示:
<PROXY_PROTOCOL>://<USERNAME>:<PASSWORD>@<PROXY_IP_ADDRESS>:<PROXY_PORT>
请注意,使用这样的 URL 是--proxy-server
行不通的,因为 Chrome 驱动程序默认会忽略用户名和密码。这就是第三方插件(例如Selenium Wire )的用武之地。
它扩展了 Selenium,使您可以访问浏览器发出的请求并根据需要更改它们。启动下面的命令来安装它:
pip install selenium-wire
接下来,使用 Selenium Wire 处理代理身份验证,如下例所示:
from seleniumwire import webdriver from selenium.webdriver.chrome.service import Service as ChromeService from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.by import By # Selenium Wire configuration to use a proxy proxy_username = 'fgrlkbxt' proxy_password = 'cs01nzezlfen' seleniumwire_options = { 'proxy': { 'http': f'http://{proxy_username}:{proxy_password}@185.199.229.156:7492', 'verify_ssl': False, }, } driver = webdriver.Chrome( seleniumwire_options=seleniumwire_options ) driver.get('http://httpbin.org/ip') print(driver.find_element(By.TAG_NAME, 'body').text) # { "origin": "185.199.229.156" }
注意:此代码可能会导致407: Proxy Authentication Required error
. 当凭据不正确时,代理服务器会以该 HTTP 状态进行响应,因此请确保代理 URL 包含有效的用户名和密码。
Selenium 代理的最佳协议:HTTP、HTTPS、SOCKS5
在为 Selenium 代理选择协议时,最常见的选项是 HTTP、HTTPS 和 SOCKS5。
HTTP 代理通过 Internet 发送数据,而 HTTPS 代理对其进行加密以提供额外的安全层。这就是为什么后者更受欢迎的原因。
Selenium 代理的另一个有用协议是 SOCKS5,也称为 SOCKS。它支持范围更广的网络流量,包括电子邮件和 FTP,这使其成为一种更加通用的协议。
总体而言,HTTP 和 HTTPS 代理适用于网络抓取和爬网,SOCKS 在涉及非 HTTP 流量的任务中找到应用程序。
Selenium Grid 中的“错误 403:禁止代理”
Selenium Grid允许您控制远程浏览器并并行运行跨平台脚本。您可能遇到的最常见的错误之一是Error 403: Forbidden for Proxy
。发生这种情况有两个原因:
- 另一个进程已经在端口 4444 上运行。
- 您没有
RemoteWebDriver
向正确的 URL 发送请求。
默认情况下,Selenium 服务器集线器侦听http://localhost:4444
. 因此,如果您有另一个进程在 4444 端口上运行,请结束它或使用另一个端口启动 Selenium Grid。
如果这不能解决问题,请确保将远程驱动程序连接到正确的中心 URL,如下所示:
import selenium.webdriver as webdriver # ... webdriver.Remote('http://localhost:4444/wd/hub', {})
通过 Python 在 Selenium 中使用旋转代理
如果您的脚本在短时间内发出多个请求,服务器可能会认为它可疑并阻止您的 IP。然而,这不会发生在轮换代理方法中,这是一种涉及在特定时间段或请求数量之后切换代理的技术。
您的最终 IP 将不断变化,使您每次都显示为不同的用户,从而防止服务器禁止您。这就是代理轮换的力量!
是时候学习如何使用selenium-wire
.
首先,您必须找到一个代理池。在本例中,我们将使用一些免费代理。
将它们存储在一个数组中,如下所示:
PROXIES = [ 'http://19.151.94.248:88', 'http://149.169.197.151:80', # ... 'http://212.76.118.242:97' ]
然后,提取一个随机代理random.choice()
并用它来初始化一个新的驱动程序实例:
from seleniumwire import webdriver from selenium.webdriver.chrome.service import Service as ChromeService from webdriver_manager.chrome import ChromeDriverManager import random # the list of proxy to rotate on PROXIES = [ 'http://19.151.94.248:88', 'http://149.169.197.151:80', # ... 'http://212.76.118.242:97' ] # randomly extract a proxy random_proxy = random.choice(PROXIES) # set the proxy in Selenium Wire seleniumwire_options = { 'proxy': { 'http': f'{random_proxy}', 'https': f'{random_proxy}', 'verify_ssl': False, }, } # create a ChromeDriver instance driver = webdriver.Chrome( service=ChromeService(ChromeDriverManager().install()), seleniumwire_options=seleniumwire_options ) driver.visit('https://example.com/') # scraping logic... driver.quit() # visit other pages...
每次要访问新页面时重复此逻辑。
做得好!您构建了一个 Selenium 旋转代理。在我们关于如何在 Python 中轮换代理的权威指南中了解更多信息。
但是,大多数请求都会失败,因为免费代理很容易出错。这就是为什么您应该添加带有随机超时的重试逻辑。
但这不是唯一的问题。尝试针对使用反机器人技术的目标测试 IP 旋转器逻辑:
driver.visit('https://www.g2.com/products/asana/reviews')
目标服务器将旋转代理 Selenium 请求检测为机器人并响应错误403 Unauthorized
。
事实上,免费代理大多数时候会让你被封锁。我们使用它们来展示基础知识,但您永远不应该在真实世界的脚本中依赖它们。
哪个代理最适合 Selenium?
如上所示,免费代理是不可靠的,您应该更喜欢高级代理来进行网络抓取。如果您需要了解从哪里获得它们,请查看我们的最佳抓取代理提供商列表。
同时,高级代理并不是最终的解决方案。由于 Selenium 的自动化特性,反抓取技术可以检测并阻止它,即使它与高级代理一起使用也是如此。
避免被阻止的更好选择是 ZenRows。此抓取 API 提供与 Selenium 类似的功能,但成功率更高。与代理公司不同,ZenRows 只对成功的请求收费。这使它成为一种更便宜、更灵活的解决方案。此外,它还消除了设置和维护代理的基础设施难题。
要像在 Selenium 中那样抓取动态网站,您需要选中“JavaScript Rendering”选项。此外,您应该选择Premium Proxy最大匿名选项并避免IP封锁。接下来,选择右侧的Python
语言和模式,然后单击“复制到剪贴板”按钮。
注意:通常也建议激活该Anti-bot
功能。
现在,安装requests
库:
pip install requests
然后,将 Python 代码粘贴到您的脚本中:
import requests proxy = "http://<YOUR_ZENROWS_API_KEY>:[email protected]:8001" proxies = {"http": proxy, "https": proxy} response = requests.get("https://www.g2.com/products/asana/reviews", proxies=proxies, verify=False) print(response.status_code)
这一次,代码片段将返回200
,不再是403
.
极好的!现在您有了一个具有 Selenium 功能的代理抓取解决方案,但效率更高!
结论
这个分步教程展示了如何使用 Python 在 Selenium 中设置代理。您从基础开始,已成为 Selenium Python 代理高手!
现在你知道了:
- 什么是 Selenium 代理。
- 在 Python 中使用 Selenium 设置代理的基础知识。
- 如何在 Selenium 中处理经过身份验证的代理。
- 如何实施轮换代理以及为什么这种方法不适用于免费代理。
- 什么是高级代理以及如何使用它。