4 回答
TA贡献1799条经验 获得超9个赞
我在使用 Firefox 时也遇到了同样的问题。我通过切换到 Chrome 解决了这个问题。
示例代码:
from selenium import webdriver
url = "<WEBSITE>"
options = webdriver.ChromeOptions()
options.add_argument("--disable-blink-features=AutomationControlled")
driver = webdriver.Chrome(options=options)
driver.get(url)
“--disable-blink-features=AutomationControlled”隐藏“navigator.webdriver”标志。
请参阅Selenium webdriver:修改 navigator.webdriver 标志以防止 selenium 检测
编辑
您还必须更改 chromedriver 的一些默认变量。
使用 perl 的示例:
perl -pi -e 's/cdc_/dog_/g' /path/to/chromedriver
欲了解更多详细信息,请查看原始帖子。
请参阅当您将 selenium 与 chromedriver 一起使用时,网站可以检测到吗?
编辑2
Cloudflare 不断调整其算法,因此您可以尝试使用未检测到的 chromedriver,而不是手动更改 chromedriver。
unDetected-chromedriver是一个优化的 Selenium Chromedriver 补丁,不应触发反机器人服务。它会自动下载驱动程序二进制文件并对其进行修补。
这是否有效取决于网站和当前的开发状态。Cloudflare 似乎跟踪unDetected-chromedriver的开发。
import undetected_chromedriver as uc
url = "<WEBSITE>"
driver= uc.Chrome()
driver.get(url)
TA贡献1844条经验 获得超8个赞
在 Docker Linux 镜像上使用 headless Selenium 时,我遇到了同样的问题。
我通过在调用网络驱动程序之前创建一个虚拟显示器来解决这个问题:
from pyvirtualdisplay import Display
display = Display(visible=0, size=(800, 800))
display.start()
不要忘记安装 pyvirtualdisplay 和 xvfb: pip install pyvirtualdisplay并且sudo apt-get install xvfb
并且您必须删除 ChromeDriver 中的“无头”选项,这是我使用的完整代码:
#Display in order to avoid CloudFare bot detection
display = Display(visible=0, size=(800, 800))
display.start()
options = webdriver.ChromeOptions()
options.add_argument('--no-sandbox')
options.add_argument('start-maximized')
options.add_argument('enable-automation')
options.add_argument('--disable-infobars')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--disable-browser-side-navigation')
options.add_argument("--remote-debugging-port=9222")
# options.add_argument("--headless")
options.add_argument('--disable-gpu')
options.add_argument("--log-level=3")
driver = webdriver.Chrome(ChromeDriverManager().install(), chrome_options=options)
由于它在我的本地计算机上无需无头即可正常工作,因此我认为模拟真实的显示器也可以完成这项工作。我不太明白为什么,但据我了解,CloudFare 尝试执行 JavaScript 代码以确认您不是机器人。拥有模拟网页显示有助于做到这一点。
TA贡献1871条经验 获得超13个赞
尝试使用 Chrome 数据文件夹
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from webdriver_manager.utils import ChromeType
# Configure browser
options = webdriver.ChromeOptions()
options.add_argument(f"--user-data-dir=C:\\Users\\daria\\AppData\\Local\\Google\\Chrome\\User Data")
options.add_argument("--disable-blink-features=AutomationControlled")
chromedriver = ChromeDriverManager(chrome_type=ChromeType.GOOGLE,
log_level='0',
print_first_line=False).install()
driver = webdriver.Chrome(chromedriver,
options=options,
service_log_path=None)
input ("End?")
TA贡献1909条经验 获得超7个赞
这是因为浏览器使用来cloudfare
保护自己免受DDOS (Distributed Denial Of Service) Attacks
. 有两种方法可以解决这个问题:
使用
time.sleep
- 如果网页加载需要 5 秒,则只需使用time.sleep(5)
。使用
WebDriverWait
-- 例如,button
带有id
“sample-btn”的 a 仅出现在该屏幕之后。那么你能做的是:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
btn = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'sample-btn'))) #Web driver waits for 10 seconds until element is visible
推荐第2个。但如果第二个不适合你,那就选择第一个。希望这有帮助!
添加回答
举报