V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
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
mondbyte
V2EX  ›  Python

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

  •  1
     
  •   mondbyte · 2023-12-25 13:57:06 +08:00 · 4262 次点击
    这是一个创建于 365 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

    主要是利用 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

    理论上访问网页和自己用浏览器访问网页是一模一样的,据我所知应该是没有什么特征的。
    cdlnls
        19
    cdlnls  
       2023-12-25 22:25:49 +08:00
    感觉你可以试试上面说的 remote-debugging-port ,这个看上去好像没问题。
    yaleyu
        20
    yaleyu  
       364 天前
    @chen2016 嗯,主要是用这个绕开 CF 的人机检查,有的网站 Selenium 实在绕不过,用了 undected-chromdriver 都绕不过。
    g1879
        21
    g1879  
       364 天前
    @chen2016 有 bug 要向作者提,开源项目就是靠大家多用多提意见才能完善。现在 4.0 改进很大了。
    mondbyte
        22
    mondbyte  
    OP
       364 天前
    @cdlnls 等你发布哈
    whoosy
        23
    whoosy  
       364 天前
    用 playwright +虚拟显示器 可以看下这个项目 https://github.com/who0sy/crawloop
    zhangxh1023
        24
    zhangxh1023  
       364 天前
    这个网站以前抓过。。。用 puppeteer 失败了,后来用 electron 成功了,只是很不稳定
    mondbyte
        25
    mondbyte  
    OP
       364 天前
    @yaleyu 感谢!
    yaleyu
        26
    yaleyu  
       364 天前   ❤️ 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  
       364 天前
    @yaleyu 好的,非常感谢,回头实验一下
    Tspm1eca
        28
    Tspm1eca  
       323 天前
    @yaleyu 方法成功,謝謝
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1309 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 17:33 · PVG 01:33 · LAX 09:33 · JFK 12:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.