问题:“被网站检测出来是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,无法进入网站相关推荐

  1. 爬虫与反爬:一场无休止之战

    现实生活中,其实很多人都与爬虫"打过交道". 比如,逢年过节之时,为确保能买到回家火车票,有人会选择使用"抢票软件",这个软件就是利用网络爬虫来登录铁路售票网络 ...

  2. Python爬虫-2019年我破解了商标网数据爬虫-破解反爬技术那些事情

    Python爬虫-2019年我破解了商标网!数据爬虫-破解反爬技术那些事情 由于自己一直做Python大数据挖掘技术开发,最近有不少的朋友要做大数据分析,找我帮忙商标网的数据挖掘,实现爬取中国商标网全 ...

  3. python爬虫反爬-python爬虫--爬虫与反爬

    爬虫与反爬 爬虫:自动获取网站数据的程序,关键是批量的获取. 反爬虫:使用技术手段防止爬虫程序的方法 误伤:反爬技术将普通用户识别为爬虫,从而限制其访问,如果误伤过高,反爬效果再好也不能使用(例如封i ...

  4. 第三百四十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫和反爬的对抗过程以及策略—scrapy架构源码分析图...

    第三百四十五节,Python分布式爬虫打造搜索引擎Scrapy精讲-爬虫和反爬的对抗过程以及策略-scrapy架构源码分析图 1.基本概念 2.反爬虫的目的 3.爬虫和反爬的对抗过程以及策略 scra ...

  5. 16.网络爬虫—字体反爬(实战演示)

    网络爬虫-字体反爬 一·字体反爬原理 二·字体反爬模块Fonttools TTF文件 三·FontCreator 14.0.0.2790 FontCreatorPortable下载与安装 四·实战演示 ...

  6. python 下载文件 限速-Python网络爬虫---scrapy通用爬虫及反爬技巧

    一.通用爬虫 通用爬虫一般有以下通用特性:爬取大量(一般来说是无限)的网站而不是特定的一些网站. 不会将整个网站都爬取完毕,因为这十分不实际(或者说是不可能)完成的.相反,其会限制爬取的时间及数量. ...

  7. python爬虫常见反爬措施_爬虫常见的反爬措施有哪些

    爬虫常见的反爬措施有三种: 1.header头部信息 解决方法: 加User-Agent值: 如果不加header头,部分网站服务器判断不到用户的访问来源,所以会返回一个404错误来告知你是一个爬虫, ...

  8. 爬虫必备反爬技能:使用动态ip

    目录 一.为什么要使用动态代理ip? 二.如何申请动态代理ip? 三.如何使用动态ip? 一.为什么要使用动态代理ip? 使用它的好处在哪里呢? 保护你的网络免受外部攻击 屏蔽你的IP地址 限制不必要 ...

  9. Python爬虫技巧!网站有反爬?我们有selenium!

    Selenium 是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样. 文章最后有免费的Python资料,获取方式,关注头条号,私信回复资料获取下载链 ...

最新文章

  1. openid java_微信小程序调用微信登陆获取openid及java做为服务端示例
  2. LDAP配置+主从+双主
  3. 补零对有限长序列频谱及DFT的影响
  4. 数据结构与算法:Python语言描述
  5. vue获取当前日期和时间并进行格式化
  6. Tensorflow源码解析6 -- TensorFlow本地运行时
  7. Python之OS模块:os.access()检验权限模式(验证文件及目录权限)
  8. 海量数据挖掘MMDS week1: Link Analysis - PageRank
  9. Stack (算法入门4)
  10. 学好Python能做什么 python就业方向有哪些
  11. 域名解析成功但ping不通解决方案
  12. 获取选中状态复选框的值并添加id
  13. 股票买卖接口源码分享
  14. Mendix低代码开发
  15. Java实战项目详细教程+文档+PPT+源码等]javaweb点餐系统全套|餐饮就餐订餐餐厅
  16. JetBrains PyCharm 设置显示行号
  17. 广告拦截—Adblocks Plus (F*cking shit Ads!
  18. 2019我干了什么!2020我该干些什么?
  19. autoware的icp_maching解读
  20. C++实现简易(多人弹幕控制主播游戏人物类型,CMD_迷宫小游戏)(二)

热门文章

  1. 条码打印软件如何使用Excel表批量打印条码标签
  2. LinuxShell宝典
  3. 2021计算机技术考研非全日制,2021考研考非全日制还是全日制?盘点你不懂的非全日制深层含义~...
  4. ldpc译码讲解_LDPC码编译码原理及应用
  5. MySQL,刷题之对完整性约束操作,题+代码!!
  6. 芝麻信用网页api php,谈谈php对接芝麻信用踩的坑
  7. 重新理解 Go 实战
  8. 椭圆曲线密码学(ECC)简介
  9. c语言一剑穿心图案编程,通达信一剑穿心指标公式(附图,源码,贴图)
  10. 业务系统如何集成工作流引擎?