mondbyte
V2EX  ›  Python

如何控制已打开的浏览器,从而实现 selenium 伪装

By mondbyte at 2023 年 12 月 25 日 · 8240 次点击

Selenium+Python 爬取网站公开数据,遇到网站过滤机制,无法打开。 尝试了网上多种伪装 selenium 方法,均未实现。 https://bot.sannysoft.com/ 全绿也不行,查了资料说是网站判断是 webdriver 的途径和方法很多。

现在大致的想法是:能否控制已手动打开的浏览器,定位到对应的标签页,来实现绕过机器人监测。 或者有其他办法的也可以。

目标网站: https://www.nmpa.gov.cn/datasearch/home-index.html#category=ylqx

备注:公开数据,非商业用途

第 1 条附言  ·  2023 年 12 月 26 日
#5 说的 chrome --remote-debugging-port=9222 ,这种方法之前也试了,其他网站可以,NMPA 这个不行。
说是 NMPA 这个网站用了瑞数 6 目前最高级的反爬虫方案
第 2 条附言  ·  2023 年 12 月 26 日
目前尝试了隐藏 webdriver/remote-debugging-port/stealth.min.js 等多种方案,感觉 Selenium 过不了 NMPA 这个网站的反爬虫机制,就像 6#说的 Selenium 有点力不从心(也有可能我技术应用不行)。

后续的想法是放开 selenium ,试试其他的框架或工具,先试 6#说的 DrissionPage
第 3 条附言  ·  2023 年 12 月 26 日
感谢#6 和#11 的建议,使用 DrissionPage 框架已可正常访问 NMPA
28 条回复  •  2024-02-05 04:09:28 +08:00
wind1986
   1
wind1986  
   2023 年 12 月 25 日
Puppeteer 能用本机浏览器
hubaq
   2
hubaq  
   2023 年 12 月 25 日
药监局用的是定制版的瑞数
forQ
   3
forQ  
   2023 年 12 月 25 日
mondbyte
   4
mondbyte  
OP
   2023 年 12 月 25 日
@forQ 感谢方案!但还是没通过检测,打开依然 400
peanutBark
   5
peanutBark  
   2023 年 12 月 25 日
能否控制已手动打开的浏览器,定位到对应的标签页 -------能,你搜索一下 chrome.exe --remote-debugging-port=9222
yaleyu
   6
yaleyu  
   2023 年 12 月 25 日   ❤️ 1
反爬技术日新月异,Selenium 越来越力不从心,试试 drissionpage, https://gitee.com/g1879/DrissionPage
Belmode
   7
Belmode  
   2023 年 12 月 25 日
@yaleyu 请问这个可以通过 headless 方式使用吗
elevioux
   8
elevioux  
   2023 年 12 月 25 日
写个浏览器扩展?

虽然不能做到控制浏览器的程度
jko123
   9
jko123  
   2023 年 12 月 25 日
@yaleyu 这个毕竟是个人作品,会出现一些莫名其妙的 bug ,刚开始用的时候确实很惊艳,但是自从几个项目从 selenium 改到 DrissionPage 都出现了莫名的 bug 之后,我就彻底不敢乱用这个自动化框架了
xyz8899
   10
xyz8899  
   2023 年 12 月 25 日
瑞数 5 代的 cookie 值也有很多种,目前 yao 监局是 neCYtZEjo8GmO ,neCYtZEjo8GmP
jianchang512
   11
jianchang512  
   2023 年 12 月 25 日
直接开启 chrome 开发模型,写个小扩展控制页面抓取和请求过滤,似乎是更可行的方案,可以配合后端发送数据接收指令。
除此外 楼上说的 drissionpage, https://gitee.com/g1879/DrissionPage 也可以试试。
tudou527
   12
tudou527  
   2023 年 12 月 25 日
apify.com 能用么?
Laimf
   13
Laimf  
   2023 年 12 月 25 日
先通过 selenium 把浏览器拉起来,进入目标网站,如果没问题,说明 selenium 没被限制。那么就可以在代码里面加等待时间,进行判断匹配到了就运行逻辑。
zeusho871
   14
zeusho871  
   2023 年 12 月 25 日
指纹浏览器
NoOneNoBody
   15
NoOneNoBody  
   2023 年 12 月 25 日
问题应该不在浏览器,在其他地方,例如频率和踩到蜜罐了
我这里就随手拿个 pyqt6 写的 webview 都能打开正常浏览几页
NoOneNoBody
   16
NoOneNoBody  
   2023 年 12 月 25 日
呃,背景有 canvas 动图,可能里面有指纹检测
llbqwhtxi
   17
llbqwhtxi  
   2023 年 12 月 25 日
chrome.exe --remote-debugging-port=**** --user-data-dir="C:\********" 5 楼说的没错
cctv6
   18
cctv6  
   2023 年 12 月 25 日
太巧了,正好最近在写一个工具,就是做这个,还没发布。

主要是利用 chrome 扩展的 API 去控制浏览器,支持新建 tab 、刷新、前进后退等等,还可以给网页注入 JS/CSS 等等。

chrome 插件启动,然后设置服务端的地址后,会使用 websocket 去连接服务端。在服务端可以接收 HTTP 请求,然后通过调用 http 请求,就可以实时控制浏览器做一些操作。

比如
curl http://host/_cat/tabs
curl http://host/tabs/open?url=https://xxx.com
curl http://host/tabs/_reload?sid=xxx

理论上访问网页和自己用浏览器访问网页是一模一样的,据我所知应该是没有什么特征的。
cctv6
   19
cctv6  
   2023 年 12 月 25 日
感觉你可以试试上面说的 remote-debugging-port ,这个看上去好像没问题。
yaleyu
   20
yaleyu  
   2023 年 12 月 26 日
@chen2016 嗯,主要是用这个绕开 CF 的人机检查,有的网站 Selenium 实在绕不过,用了 undected-chromdriver 都绕不过。
g1879
   21
g1879  
   2023 年 12 月 26 日
@chen2016 有 bug 要向作者提,开源项目就是靠大家多用多提意见才能完善。现在 4.0 改进很大了。
mondbyte
   22
mondbyte  
OP
   2023 年 12 月 26 日
@cdlnls 等你发布哈
whoosy
   23
whoosy  
   2023 年 12 月 26 日
用 playwright +虚拟显示器 可以看下这个项目 https://github.com/who0sy/crawloop
zhangxh1023
   24
zhangxh1023  
   2023 年 12 月 26 日
这个网站以前抓过。。。用 puppeteer 失败了,后来用 electron 成功了,只是很不稳定
mondbyte
   25
mondbyte  
OP
   2023 年 12 月 26 日
@yaleyu 感谢!
yaleyu
   26
yaleyu  
   2023 年 12 月 26 日   ❤️ 1
@Belmode 之前都是有头模式在跑,无图形界面的 Linux 下用 xvfb + pyvirtualdisplay 模拟图形界面也能跑,看到这里问无头模式能不能跑,试了一下,能跑,不过有几点注意事项:
1. ua 和实际打开浏览器的 ua 必须一致
2. macOS 下,有头无头都能跑
3. 无图形界面的 Linux - 有头:因为我跑的是有个打开页面后倒计时几秒才能点的按钮,在不用 xvfb + pyvirtualdisplay 的情况下,不能跑,就算显式等待一段时间也点不了那个按钮,用了 xvfb + pyvirtualdisplay 就没问题
4. 无图形界面的 Linux - 无头,我要跑的那个页面,就算是无头并不实际打开浏览器,也得用用 xvfb + pyvirtualdisplay 模拟界面,有点奇怪

from DrissionPage import WebPage, ChromiumOptions
co = ChromiumOptions()
co.set_headless(True)
# ua 和实际打开浏览器的 ua 必须一致,才能通过 Cloudflare, 因为浏览器升级,ua 不固定,先打开百度得到目前的 ua
page = WebPage(driver_or_options=co)
page.get("https://www.baidu.com")
ua = page.user_agent.replace("Headless", "")
page.quit()
co.set_user_agent(ua)
page = WebPage(driver_or_options=co)
page.get(你真正要跑的 URL)
Belmode
   27
Belmode  
   2023 年 12 月 26 日
@yaleyu 好的,非常感谢,回头实验一下
Tspm1eca
   28
Tspm1eca  
   2024 年 2 月 5 日
@yaleyu 方法成功,謝謝
推荐学习书目
› Learn Python the Hard Way
Python Sites
› PyPI - Python Package Index
› http://diveintopython.org/toc/index.html
› Pocoo
值得关注的项目
› PyPy
› Celery
› Jinja2
› Read the Docs
› gevent
› pyenv
› virtualenv
› Stackless Python
› Beautiful Soup
› 结巴中文分词
› Green Unicorn
› Sentry
› Shovel
› Pyflakes
› pytest
Python 编程
› pep8 Checker
Styles
› PEP 8
› Google Python Style Guide
› Code Style from The Hitchhiker's Guide
© 2026 V2EX · 75ms · 3.9.8.5