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