Selenium+Python 爬取网站公开数据,遇到网站过滤机制,无法打开。 尝试了网上多种伪装 selenium 方法,均未实现。 https://bot.sannysoft.com/ 全绿也不行,查了资料说是网站判断是 webdriver 的途径和方法很多。
现在大致的想法是:能否控制已手动打开的浏览器,定位到对应的标签页,来实现绕过机器人监测。 或者有其他办法的也可以。
目标网站: https://www.nmpa.gov.cn/datasearch/home-index.html#category=ylqx
备注:公开数据,非商业用途
|  |      1wind1986      2023-12-25 14:41:49 +08:00 Puppeteer 能用本机浏览器 | 
|  |      2hubaq      2023-12-25 14:47:20 +08:00 药监局用的是定制版的瑞数 | 
|      3forQ      2023-12-25 14:49:31 +08:00 提前加载 stealth.min.js https://github.com/requireCool/stealth.min.js | 
|      5peanutBark      2023-12-25 16:05:05 +08:00 能否控制已手动打开的浏览器,定位到对应的标签页 -------能,你搜索一下 chrome.exe --remote-debugging-port=9222 | 
|      6yaleyu      2023-12-25 16:06:59 +08:00  1 反爬技术日新月异,Selenium 越来越力不从心,试试 drissionpage, https://gitee.com/g1879/DrissionPage | 
|  |      8elevioux      2023-12-25 16:50:33 +08:00 写个浏览器扩展? 虽然不能做到控制浏览器的程度 | 
|      9jko123      2023-12-25 17:44:30 +08:00 @yaleyu 这个毕竟是个人作品,会出现一些莫名其妙的 bug ,刚开始用的时候确实很惊艳,但是自从几个项目从 selenium 改到 DrissionPage 都出现了莫名的 bug 之后,我就彻底不敢乱用这个自动化框架了 | 
|  |      10xyz8899      2023-12-25 18:05:06 +08:00 瑞数 5 代的 cookie 值也有很多种,目前 yao 监局是 neCYtZEjo8GmO ,neCYtZEjo8GmP | 
|      11jianchang512      2023-12-25 18:34:02 +08:00 直接开启 chrome 开发模型,写个小扩展控制页面抓取和请求过滤,似乎是更可行的方案,可以配合后端发送数据接收指令。 除此外 楼上说的 drissionpage, https://gitee.com/g1879/DrissionPage 也可以试试。 | 
|  |      13Laimf      2023-12-25 19:13:14 +08:00 先通过 selenium 把浏览器拉起来,进入目标网站,如果没问题,说明 selenium 没被限制。那么就可以在代码里面加等待时间,进行判断匹配到了就运行逻辑。 | 
|  |      14zeusho871      2023-12-25 20:41:40 +08:00 指纹浏览器 | 
|      15NoOneNoBody      2023-12-25 21:34:19 +08:00 问题应该不在浏览器,在其他地方,例如频率和踩到蜜罐了 我这里就随手拿个 pyqt6 写的 webview 都能打开正常浏览几页 | 
|      16NoOneNoBody      2023-12-25 21:37:51 +08:00 呃,背景有 canvas 动图,可能里面有指纹检测 | 
|      17llbqwhtxi      2023-12-25 22:04:31 +08:00 chrome.exe --remote-debugging-port=**** --user-data-dir="C:\********"   5 楼说的没错 | 
|  |      18cctv6      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 理论上访问网页和自己用浏览器访问网页是一模一样的,据我所知应该是没有什么特征的。 | 
|  |      19cctv6      2023-12-25 22:25:49 +08:00 感觉你可以试试上面说的 remote-debugging-port ,这个看上去好像没问题。 | 
|      20yaleyu      2023-12-26 09:26:59 +08:00 @chen2016  嗯,主要是用这个绕开 CF 的人机检查,有的网站 Selenium 实在绕不过,用了 undected-chromdriver 都绕不过。 | 
|  |      23whoosy      2023-12-26 10:34:21 +08:00 用 playwright +虚拟显示器 可以看下这个项目 https://github.com/who0sy/crawloop | 
|      24zhangxh1023      2023-12-26 10:38:48 +08:00 这个网站以前抓过。。。用 puppeteer 失败了,后来用 electron 成功了,只是很不稳定 | 
|      26yaleyu      2023-12-26 13:50:59 +08:00  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) |