解决方案:爬虫被反爬,检测出是selenium,报400,无法进入网站
问题:“被网站检测出来是selenium,不让爬了”。
以下是报错及解决方案:
!!!文中出现的网站是一个有此检测的案例,仅供学习参考!!!
一、报错:
1.报错截图(记住这个 true
哈,间接地代表你是selenium;咱们正常F12这里都是 false
的哈):
2.报错截图对应的代码:
from selenium import webdriver
import timeclass Crawl_ZhuanLi(object):def __init__(self):chromeoption = webdriver.ChromeOptions()# chromeoption.add_argument('--headless') # 无头浏览器chromeoption.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36')self.driver_path = './windows_chromedriver.exe'self.driver = webdriver.Chrome(self.driver_path, chrome_options=chromeoption)def get_value(self,url):self.driver.get(url)print("开始爬取...")time.sleep(60)Crawl_ZhuanLi().get_value(url='http://cpquery.cnipa.gov.cn/')
3.备注:
(1)driver_path
对应的chromedriver路径请自行填写,
(2)chromedriver下载地址:http://chromedriver.storage.googleapis.com/index.html;
(3)非爬虫操作时,我们在F12控制台输入window.navigator.webdriver
时,显示的是false;
二、解决方案:
1.在driver.get(url)
前加入如下代码:
self.driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"""})
2.效果:
三、完整代码:
from selenium import webdriver
import timeclass Crawl_ZhuanLi(object):def __init__(self):chromeoption = webdriver.ChromeOptions()# chromeoption.add_argument('--headless') # 无头浏览器chromeoption.add_argument('--no-sandbox') # 解决linux DevToolsActivePort文件不存在的报错chromeoption.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36')self.driver_path = './windows_chromedriver.exe'self.driver = webdriver.Chrome(self.driver_path, chrome_options=chromeoption)def get_value(self,url):# 下面这行代码目的为:防止网站识别出是seleniumself.driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {"source": """Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"""})self.driver.get(url)print("开始爬取...")time.sleep(60)Crawl_ZhuanLi().get_value(url='http://cpquery.cnipa.gov.cn/')
四、分析总结:
1.为什么我们进不了网站:
待爬取网站运行自己的 JavaScript 代码,对我们(爬虫)发送过去的请求信息进行检测,然后发现我们是selenium后,把我们(爬虫)的请求禁掉了。
(比如待爬网站做了一个 window.navigator.webdriver
检测,发现你返回的是 true
)
2.解决思路:
在待爬取的网站运行其自带的 JavaScript 代码前,先执行下我们的js代码,去隐藏或修改掉我们的window.navigator.webdriver
信息。
3.按照思路,如何解决:
利用Chrome 开发工具协议( 简称CDP ),在 Selenium 中调用 CDP 的命令。
即:在使用selenium时,使用driver.execute_cdp_cmd
命令,传入需要调用的 CDP 命令和参数,之后selenium会帮我们对Chrome的window.navigator.webdriver
信息进行调整。
selenium会给定一段 JavaScript 代码,让 Chrome 刚打开页面,还没运行网站自带的 js 代码时,就先执行一个js,修改Chrome的window.navigator.webdriver
。
4.查找文档,逐个分析:
(1)execute_cdp_cmd
: selenium去执行CDP方法。
这里的英文逐字拼起来,我理解为:执行(execute),按照Chrome开发协议(CDP),在终端命令行(cmd)。
即:在Chrome浏览器控制台终端,按照其开发协议,执行XX命令。
(2)Page.addScriptToEvaluateOnNewDocument
:
从CDP 的官方文档,我们可以看到 Page.addScriptToEvaluateOnNewDocument
的作用是:在页面创建前(也是被爬页面的script加载前),先执行截图里的 javascript。
即:1.添加javascript; 2.在frame(页面)加载前;
(这里做过前端的可以参考下vue的生命周期,这里涉及了html的生命周期);
(3)
Object.defineProperty(navigator, 'webdriver', {get: () => undefined
})
作用:定义webdriver浏览器驱动的 navigator
的值为 undefined。
4.备注:
(1)除了上述这个方法,还有别的方法解决此问题;
(2)仅较新版本的 Chrome+ChromeDriver 适用此方法,不兼容的话,可以考虑升级下,不过较老版本的Chrome,也有对应老版本的方法来解决此问题(不过老版本方法,不兼容新版本)。
五、参考资料:
1.CPD 的官方文档: https://chromedevtools.github.io/devtools-protocol/tot/Page#method-addScriptToEvaluateOnNewDocument
2.selenium官方文档:https://www.selenium.dev/selenium/docs/api/py/webdriver_chromium/selenium.webdriver.chromium.webdriver.html?highlight=execute_cdp_cmd#selenium.webdriver.chromium.webdriver.ChromiumDriver.execute_cdp_cmd
3.最初参考网站(感谢):
https://www.cnblogs.com/presleyren/p/12936553.html
解决方案:爬虫被反爬,检测出是selenium,报400,无法进入网站相关推荐
- 爬虫与反爬:一场无休止之战
现实生活中,其实很多人都与爬虫"打过交道". 比如,逢年过节之时,为确保能买到回家火车票,有人会选择使用"抢票软件",这个软件就是利用网络爬虫来登录铁路售票网络 ...
- Python爬虫-2019年我破解了商标网数据爬虫-破解反爬技术那些事情
Python爬虫-2019年我破解了商标网!数据爬虫-破解反爬技术那些事情 由于自己一直做Python大数据挖掘技术开发,最近有不少的朋友要做大数据分析,找我帮忙商标网的数据挖掘,实现爬取中国商标网全 ...
- python爬虫反爬-python爬虫--爬虫与反爬
爬虫与反爬 爬虫:自动获取网站数据的程序,关键是批量的获取. 反爬虫:使用技术手段防止爬虫程序的方法 误伤:反爬技术将普通用户识别为爬虫,从而限制其访问,如果误伤过高,反爬效果再好也不能使用(例如封i ...
- 第三百四十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫和反爬的对抗过程以及策略—scrapy架构源码分析图...
第三百四十五节,Python分布式爬虫打造搜索引擎Scrapy精讲-爬虫和反爬的对抗过程以及策略-scrapy架构源码分析图 1.基本概念 2.反爬虫的目的 3.爬虫和反爬的对抗过程以及策略 scra ...
- 16.网络爬虫—字体反爬(实战演示)
网络爬虫-字体反爬 一·字体反爬原理 二·字体反爬模块Fonttools TTF文件 三·FontCreator 14.0.0.2790 FontCreatorPortable下载与安装 四·实战演示 ...
- python 下载文件 限速-Python网络爬虫---scrapy通用爬虫及反爬技巧
一.通用爬虫 通用爬虫一般有以下通用特性:爬取大量(一般来说是无限)的网站而不是特定的一些网站. 不会将整个网站都爬取完毕,因为这十分不实际(或者说是不可能)完成的.相反,其会限制爬取的时间及数量. ...
- python爬虫常见反爬措施_爬虫常见的反爬措施有哪些
爬虫常见的反爬措施有三种: 1.header头部信息 解决方法: 加User-Agent值: 如果不加header头,部分网站服务器判断不到用户的访问来源,所以会返回一个404错误来告知你是一个爬虫, ...
- 爬虫必备反爬技能:使用动态ip
目录 一.为什么要使用动态代理ip? 二.如何申请动态代理ip? 三.如何使用动态ip? 一.为什么要使用动态代理ip? 使用它的好处在哪里呢? 保护你的网络免受外部攻击 屏蔽你的IP地址 限制不必要 ...
- Python爬虫技巧!网站有反爬?我们有selenium!
Selenium 是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样. 文章最后有免费的Python资料,获取方式,关注头条号,私信回复资料获取下载链 ...
最新文章
- openid java_微信小程序调用微信登陆获取openid及java做为服务端示例
- LDAP配置+主从+双主
- 补零对有限长序列频谱及DFT的影响
- 数据结构与算法:Python语言描述
- vue获取当前日期和时间并进行格式化
- Tensorflow源码解析6 -- TensorFlow本地运行时
- Python之OS模块:os.access()检验权限模式(验证文件及目录权限)
- 海量数据挖掘MMDS week1: Link Analysis - PageRank
- Stack (算法入门4)
- 学好Python能做什么 python就业方向有哪些
- 域名解析成功但ping不通解决方案
- 获取选中状态复选框的值并添加id
- 股票买卖接口源码分享
- Mendix低代码开发
- Java实战项目详细教程+文档+PPT+源码等]javaweb点餐系统全套|餐饮就餐订餐餐厅
- JetBrains PyCharm 设置显示行号
- 广告拦截—Adblocks Plus (F*cking shit Ads!
- 2019我干了什么!2020我该干些什么?
- autoware的icp_maching解读
- C++实现简易(多人弹幕控制主播游戏人物类型,CMD_迷宫小游戏)(二)
热门文章
- 条码打印软件如何使用Excel表批量打印条码标签
- LinuxShell宝典
- 2021计算机技术考研非全日制,2021考研考非全日制还是全日制?盘点你不懂的非全日制深层含义~...
- ldpc译码讲解_LDPC码编译码原理及应用
- MySQL,刷题之对完整性约束操作,题+代码!!
- 芝麻信用网页api php,谈谈php对接芝麻信用踩的坑
- 重新理解 Go 实战
- 椭圆曲线密码学(ECC)简介
- c语言一剑穿心图案编程,通达信一剑穿心指标公式(附图,源码,贴图)
- 业务系统如何集成工作流引擎?