之前一直在使用壁纸|2025手机壁纸大全|2025年高质量手机壁纸高清_彼岸手机壁纸彼岸网上面的壁纸当做手机上的壁纸。
刚开始编写了一段爬虫脚本从彼岸网上随机爬取一张图片并将该爬虫脚本部署到服务器上,搭配iOS系统上的快捷指令实现了自动换手机壁纸的效果。
但是在2024年11月17号晚上的时候,发现该脚本失效,无法获取图片了,通过检查发现壁纸|2025手机壁纸大全|2025年高质量手机壁纸高清_彼岸手机壁纸彼岸图片网站使用了大名鼎鼎的cloudflare对网站进行了保护,当请求发过来之后,就会通过cloudflaer进行验证,如果不是爬虫脚本就会返回cf_clearance
字段表现验证通过。
通过playwright,selenium都无法安全通过验证,因为cloudflare验证非常的严格,最终使用了undetected_chromedriver
它是一个为 Selenium 设计的优化版 ChromeDriver,主要用于自动化测试和数据抓取,它可以帮助绕过多数网站的反爬虫机制。
undetected_chromedriver
通过修改 ChromeDriver 的默认行为,使其更接近真实用户的浏览器行为,从而避免被目标网站检测到自动化行为。它可以绕过如 Distil Network、Imperva、DataDome 等反爬虫系统,undetected_chromedriver
是 Selenium 的一个补充工具,用于解决 Selenium 在自动化过程中可能遇到的被网站检测的问题。在某些情况下,当传统的 Selenium WebDriver 无法正常工作或被网站识别时,undetected_chromedriver
可以作为一个有效的替代方案。
undetected_chromedriver
能够做到不被检测为爬虫,主要是通过以下几种方式实现的:
修改默认行为:undetected_chromedriver
修改了 ChromeDriver 的一些默认行为,使其更接近于普通用户的浏览器行为。例如,它可能会修改浏览器的一些指纹信息,如用户代理(User-Agent)、Webdriver 属性等,以减少被识别的风险。
自动下载和补丁应用:该工具会自动下载与当前或指定版本的 Chrome 浏览器兼容的 Chromedriver,并对其应用一系列补丁。这些补丁旨在隐藏自动化工具的痕迹,使得自动化脚本执行时更难被检测到。
模拟真实用户行为:undetected_chromedriver
通过模拟真实用户的操作习惯,例如鼠标移动、页面滚动等,来减少被网站反爬虫系统识别的可能性。
避免特定的自动化痕迹:例如,某些网站会检查 window.navigator.webdriver
属性来识别是否由 Selenium 控制。undetected_chromedriver
会修改这些属性,使其看起来更像是普通用户的浏览器行为。
以下是 undetected_chromedriver
实现不被检测的一些具体技术细节:
移除自动化标志:它可能会移除或修改浏览器的一些标志,比如 window.navigator.webdriver
,这个属性在由 Selenium 控制的浏览器中通常会返回 true
,而 undetected_chromedriver
会使其返回 undefined
或其他值,以避免被检测。
自定义 ChromeOptions:通过自定义 Chrome 的启动选项,例如设置用户数据目录、禁用某些扩展或功能,来减少自动化行为的特征。
动态行为模拟:可能会在执行自动化任务时加入一些随机性,比如随机延迟、随机点击位置等,以模拟更自然的用户行为。
持续更新:由于网站的反爬虫机制会不断更新,undetected_chromedriver
也需要不断更新以应对新的检测技术。
通过验证之后需要将cookie和请求头放到一起,因为cloudflare生成的cf_clearance
字段和User-Agent是绑定的,需要保持一致, 否则会重新验证,将验证通过的cookies和user-agent放到headers中之后,并将headers放到Redis数据库中做保存,对headers进行复用,避免重复进行cloudflare验证,因为这样比较费时。
首先要注意,undetected_chromedriver会自动的去匹配当前系统中的chrome浏览器对应的驱动版本,原理是先请求https://googlechromelabs.github.io/chrome-for-testing/last-known-good-versions-with-downloads.json
该网址,然后匹配当前系统中chrome浏览器对应的驱动版本并使用。
在Linux服务器中可能存在发送该请求时出现证书问题raise URLError(err) urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:997)>
需要更新系统证书,具体步骤如下:
确保你的系统信任的证书颁发机构(CA)证书是最新的。在基于Debian的系统上,可以这样做:
sudo apt-get update
sudo apt-get install --reinstall ca-certificates
在你的Python脚本或服务启动之前,设置环境变量SSL_CERT_FILE
指向你的CA证书文件:
SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt
在项目信息界面的环境变量中,选择指定变量然后配置SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt
通常更新之后的证书路径就是/etc/ssl/certs/ca-certificates.crt
确保在运行Python脚本之前设置了此环境变量。
使用undetected_chromedriver需要当前系统中是已经安装过chrome浏览器的,安装步骤如下:
下载安装包:在终端中输入以下命令,下载适用于 64 位系统的 Chrome 浏览器安装包13:
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
安装 Chrome:使用以下命令进行安装1:
sudo dpkg -i google-chrome-stable_current_amd64.deb
若安装过程中出现依赖关系问题,可再执行以下命令修复依赖并完成安装:
sudo apt-get -f install
更新 Chrome:如需更新 Chrome 浏览器,可使用以下命令:
sudo apt install google-chrome-stable