一个业务需求是从一个网站上抓取客户的评论信息,评论数据已经渲染好在html上由接口返回的,只能从HTML上一个个扣数据。一开始是使用的HtmlUnit来处理,但期间一直抛出拒绝访问提示
但是从浏览器可以直接访问,我就换别的网站进行访问,别的网站能够正常抓取数据,期间也试过设置请求头,直到在调试时偶然抛出不一样的错误>at script.M(https://challenges.cloudflare.com/turnstile/v0/g/d2a97f6b6ec9/api.js?onload=KHGO2&render=explicit:1)没截到图,搜了才发现该网站使用了cloudflare的人机检查,猜想HtmlUnit可能不是真正的请求,而是模拟的请求所以被cloudflare拦了下来。所以换了Selenium来处理
Selenium不能单独使用,需要和不同浏览器的Driver来配合使用,我使用的是ChromeDriver
1.下载Chrome和对应版本的ChromeDriver
Chrome版本和ChromeDriver版本要对手不让回抛出错误
我的chrome是126的版本
![图片[1]-Selenium+ChromeDriver 绕过cloudflare人机检查 获取页面数据 - 拾光赋-拾光赋](https:https://image.baidu.com/search/down?url=https://img2024.cnblogs.com/blog/3384189/202407/3384189-20240704151000913-761804680.png)
chromeDriver就也需要下载126版本 114及114之前的版本可以从这下载
http://chromedriver.storage.googleapis.com/index.html
最新版本需要到这下载
https://googlechromelabs.github.io/chrome-for-testing/
2.添加selenium依赖
![图片[2]-Selenium+ChromeDriver 绕过cloudflare人机检查 获取页面数据 - 拾光赋-拾光赋](https:https://image.baidu.com/search/down?url=https://img2024.cnblogs.com/blog/3384189/202407/3384189-20240704152142234-726599003.png)
3.访问页面
相关代码
![图片[3]-Selenium+ChromeDriver 绕过cloudflare人机检查 获取页面数据 - 拾光赋-拾光赋](https:https://image.baidu.com/search/down?url=https://img2024.cnblogs.com/blog/3384189/202407/3384189-20240704152502130-436722231.png)
还是抛出403 禁止访问
![图片[4]-Selenium+ChromeDriver 绕过cloudflare人机检查 获取页面数据 - 拾光赋-拾光赋](https:https://image.baidu.com/search/down?url=https://img2024.cnblogs.com/blog/3384189/202407/3384189-20240704152357212-706048884.png)
将selenium依赖升级到4.10 访问成功
![图片[5]-Selenium+ChromeDriver 绕过cloudflare人机检查 获取页面数据 - 拾光赋-拾光赋](https:https://image.baidu.com/search/down?url=https://img2024.cnblogs.com/blog/3384189/202407/3384189-20240704152711822-1328247183.png)
可是这里访问的页面不是网站页面而是cloudflare人机检查的页面
![图片[6]-Selenium+ChromeDriver 绕过cloudflare人机检查 获取页面数据 - 拾光赋-拾光赋](https:https://image.baidu.com/search/down?url=https://img2024.cnblogs.com/blog/3384189/202407/3384189-20240705101400862-1136578027.png)
看来selenium也绕不过cloudflare人机检查
只能再换方法了
这次使用undetected_chromedriver解决了cloudflare的人机检查成功访问了主页
undetected_chromedriver是用python编写的,所以转型用python实现
1.下载undetected_chromedriver 安装python就不做赘述了
pip install undetected-chromedriver
查看undetected-chromedriver
pip show undetected-chromedriver
下载的时候可能会抛出错误
WARNING: Failed to write executable – trying to use .deleteme logic
ERROR: Could not install packages due to an OSError: [WinError 2] 系统找不到指定的文件。: ‘C:\Python312\Scripts\wsdump.exe’ -> ‘C:\Python312\Scripts\wsdump.exe.deleteme’
这时往前面翻一下会有一个WARNING提示pip版本不够,用它提示的语句升级pip的版本就可以了
使用undetected_chromedriver连接网站试试 抛出错误
ModuleNotFoundError: No module named ‘distutils’
下载module就行
pip install setuptools
相关代码
![图片[7]-Selenium+ChromeDriver 绕过cloudflare人机检查 获取页面数据 - 拾光赋-拾光赋](https:https://image.baidu.com/search/down?url=https://img2024.cnblogs.com/blog/3384189/202407/3384189-20240705105354479-655919160.png)
成功访问主页
![图片[8]-Selenium+ChromeDriver 绕过cloudflare人机检查 获取页面数据 - 拾光赋-拾光赋](https:https://image.baidu.com/search/down?url=https://img2024.cnblogs.com/blog/3384189/202407/3384189-20240705105644806-1733449987.png)
结尾报错是undetected_chromedriver未正常关闭的原因
从提示的路径找到__init__.py文件
修改第 798 行time.sleep(0.1)
为try: time.sleep(0.1) except OSError: pass
错误消失
2.下载selenium
pip install selenium
3.使用selenium+undetected_chromedriver+chromedriver.exe测试(chromedriver.exe可以换成webdriver_manager)
代码
![图片[9]-Selenium+ChromeDriver 绕过cloudflare人机检查 获取页面数据 - 拾光赋-拾光赋](https:https://image.baidu.com/search/down?url=https://img2024.cnblogs.com/blog/3384189/202407/3384189-20240705110253871-1309303660.png)
数据
![图片[10]-Selenium+ChromeDriver 绕过cloudflare人机检查 获取页面数据 - 拾光赋-拾光赋](https:https://image.baidu.com/search/down?url=https://img2024.cnblogs.com/blog/3384189/202407/3384189-20240705110315240-250323506.png)
接下来就是使用selenium定位元素获取了
后续
使用selenium定位元素使,在循环的过程中使用XPATH的方式获取子节点时注意用相对路径否则会出现结果全部一样的情况
经过测试其实不使用undetected_chromedriver也可以完成绕过检查,可以直接使用selenium(前提需要使用代理,undetected_chromedriver也需要代理)
最后是需要部署到linux上运行的,为了环境的准备不那么的麻烦,下载对应版本的ChromeDriver和浏览器,我使用了docker的selenium/standalone-chrome镜像,内置有ChromeDriver和浏览器,就不用在处理了,
相关代码变动为

结尾
有一说一python是真的很方便,需要处理一些东西时像连接数据库或发送邮件,直接下载相关的包,就可以直接使用了,相当的简洁和方便,完全不需要额外的配置


![表情[baoquan]-拾光赋](https://blogs.ink/wp-content/themes/zibll/img/smilies/baoquan.gif)


暂无评论内容