首先,让我澄清一下术语。所谓隐形 Selenium,是指一种能够不被检测并绕过 Cloudflare 的 Selenium 版本。 我并非指代任何具体的隐身技术。您可以通过几种方式在 Selenium 中实现规避技术:既可以使用专门的包来处理,也可以通过 `execute_cdp_cmd` 直接与 Chrome API 交互。后者能提供更多控制权,但需要更多工作量。以下是一个利用该方法修改用户代理值的示例:
driver.execute_cdp_cmd('Emulation.setUserAgentOverride', {
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win32; x86) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36",
"platform": "Win32",
"acceptLanguage":"ro-RO"
})
但您需要查阅 CDP 文档,找出允许进行所有必要更改的 API。因此,目前我们先使用一些现成的包进行测试。
1.1. 隐形 Selenium
至少有两个包可用于实现 Selenium 的隐身模式。但截至目前,尚无任何包能保证绕过 Cloudflare。因此,我们需要再次进行测试,以验证它们是否有效。 首先,让我们研究 `selenium-stealth`。该包是 `puppeteer-extra-plugin-stealth` 的封装,使得 Python 版的 Selenium 能够使用 Puppeteer 的规避机制。要使用它,首先需要安装。打开终端窗口并输入以下命令:
# Install selenium-stealth
~ » python3 -m pip install selenium-stealth
现在一切就绪。我们可以利用它让之前的爬虫脚本更具隐蔽性:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium_stealth import stealth
import time
# Set Chrome to open in headless mode
options = Options()
options.headless = True
# Create a new Chrome instance
driver = webdriver.Chrome(options=options)
# Apply stealth to your webdriver
stealth(driver,
languages=["en-US", "en"],
vendor="Google Inc.",
platform="Win32",
webgl_vendor="Intel Inc.",
renderer="Intel Iris OpenGL Engine",
fix_hairline=True,
)
# Navigate to target
driver.get('https://www.snipesusa.com/')
# Give it some time to load
time.sleep(10)
# Take screenshot of page
driver.get_screenshot_as_file('stealth.png')
# Close browser
driver.quit()
与默认的 Selenium 设置相比,这次运行脚本的结果有所不同:
您可以使用的第二个选项是 `undetected_chromedriver`。该组件被描述为“优化的 Selenium chromedriver”。让我们来测试一下:
# Install undetected_chromedriver
~ » python3 -m pip install undetected_chromedriver
代码与我们的默认脚本非常相似。主要区别在于包名。以下是一个使用 `undetected_chromedriver` 的基本爬虫,让我们看看它能否绕过 Cloudflare:
import undetected_chromedriver as uc
import time
# Set Chrome to open in headless mode
options = uc.ChromeOptions()
options.headless = True
# Create a new Chrome instance and maximize the window
driver = uc.Chrome(options=options, executable_path='/Applications/Google Chrome.app/Contents/MacOS/Google Chrome')
driver.maximize_window()
# Navigate to target
driver.get('https://www.snipesusa.com/')
# Give it some time to load
time.sleep(10)
# Take screenshot of page
driver.get_screenshot_as_file('stealth-uc.png')
# Close browser
driver.quit()
再次运行脚本,结果依然顺利。看来至少这两个包能够成功绕过 Cloudflare 的防护。至少在短期内是如此。说实话,如果你大量使用这些脚本,Cloudflare 很可能会追踪到你的 IP 地址并将其封禁。
因此,让我向您介绍第三种方案:Web Scraping API。
1.2. Selenium 与 Web Scraping API
Web Scraping API 拥有一个名为“代理模式”的强大功能。您可以在此处了解更多详情。但我想特别指出的是,我们的代理模式可以与 Selenium 成功集成。这样,您就能使用我们已实现的所有规避功能。而且,请相信我们有一支专门的团队在研究定制化的规避技术。 从技术层面讲,我们处理 IP 轮换、使用多种代理、破解验证码,并利用 Chrome API 持续更新指纹。通俗来说,这意味着您无需费心操作,成功率却大幅提升。您将获得目前最隐蔽的 Selenium 版本。具体实现方法如下:
# Install selenium-wire
~ » python3 -m pip install selenium-wire
我们使用 `selenium-wire` 来实现 Selenium 与代理的结合。以下是脚本代码:
from seleniumwire import webdriver
import time
# Method to encode parameters
def get_params(object):
params = ''
for key,value in object.items():
if list(object).index(key) < len(object) - 1:
params += f"{key}={value}."
else:
params += f"{key}={value}"
return params
# Your WSA API key
API_KEY = '<YOUR_API_KEY>'
# Default proxy mode parameters
PARAMETERS = {
"proxy_type":"datacenter",
"device":"desktop",
"render_js":1
}
# Set Selenium to use a proxy
options = {
'proxy': {
"http": f"http://webscrapingapi.{ get_params(PARAMETERS) }:{ API_KEY }@proxy.webscrapingapi.com:80",
}
}
# Create a new Chrome instance
driver = webdriver.Chrome(seleniumwire_options=options)
# Navigate to target
driver.get('https://www.httpbin.org/get')
# Retrieve the HTML documeent from the page
html = driver.page_source
print(html)
# Close browser
driver.quit()
如果您运行此脚本几次,就会发现 IP 地址每次都在变化。这就是我们的 IP 轮换系统。在后台,它还会自动添加各种规避技术。您甚至无需为此操心。我们会处理 Cloudflare 绕过部分,以便您能更专注于数据解析。