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
Masterlxj
V2EX  ›  Python

想交流一个 CloudFlare 反爬问题

  •  2
     
  •   Masterlxj · 2023-07-14 10:08:30 +08:00 · 3791 次点击
    这是一个创建于 496 天前的主题,其中的信息可能已经有所发展或是发生改变。

    OP 需要采集一个网站,该网站用了 CloudFlare ,之前 OP 采用构造 TLS 指纹,绕过了风控,然后爬虫也运行了几个月,一直没啥问题,但是最近发现 OP 的请求已经被精准的识别为爬虫了。

    开始 OP 以为是光构造 TLS 指纹已经不行了( Chrome 已经不在固定 TLS ),想着是不是要加上 H2 指纹,然后就 H2 指纹也构造了,但是还是没用。

    这个时候让 OP 疑惑的地方就出现了,就是使用 go (前面都是 Python )去试了一下,只构造了 TLS 指纹就直接过了。可以肯定的是 TLS 指纹和 H2 指纹构造的都是一样的,但是为什么 go 能过,Python 不能过?

    OP 的疑问

    CloudFlare 是通过什么地方,或者采用什么方案精准识别到前面( Python 写的)那一套是爬虫呢?

    1. OP 不是想问什么工具可以绕过,或者什么工具可以构造 TLS/H2 指纹
    2. 不是 IP 的问题,已经挂了海外住宅代理,同时 go 那一套是可以过的
    3. 不是想交流 JS 逆向
    第 1 条附言  ·  2023-07-14 11:35:24 +08:00
    #### 补充
    1. 非 selenium
    2. 非不完全伪造 tls ,h2 ,非 hook

    OP 的猜测是,CloudFlare 通过一段时间的特征收集,将我所用的这一套请求过程给逐渐识别为爬虫(因为有风控率逐渐提高的迹象),所以比较疑惑是从哪一方面特征识别到的,行为轨迹(非浏览器)?还是请求过程中其他什么参数?

    一般 CloudFlare 通过 IP ,TLS 指纹,H2 指纹,浏览器指纹这几个维度识别爬虫
    IP 已采用美国住宅代理
    TLS 指纹已经完全伪造(非修改加密套件顺序,非 hook ,而是完全实现 tls 握手过程)
    H2 指纹已完全伪造(同上)
    浏览器指纹没做(因为还能用,所以 JS 逆向这一块不想花时间去肝,而且使用 go 不做浏览器相关的特征伪造也是可以过的)
    24 条回复    2023-07-16 10:52:13 +08:00
    0o0O0o0O0o
        1
    0o0O0o0O0o  
       2023-07-14 10:20:20 +08:00 via iPhone
    如果真的控制好了变量,那就拿 wireshark 对比下
    chiron688
        2
    chiron688  
       2023-07-14 10:23:16 +08:00
    不懂,一直都是用的这几个库
    import re
    import logging
    from selenium import webdriver
    from selenium.webdriver.chrome.options import Options
    from selenium.webdriver.chrome.service import Service
    from bs4 import BeautifulSoup
    yingxiangyu
        3
    yingxiangyu  
       2023-07-14 10:43:09 +08:00   ❤️ 2
    wuchujie
        4
    wuchujie  
       2023-07-14 11:14:42 +08:00
    OP 是用 selenium 爬?
    Masterlxj
        5
    Masterlxj  
    OP
       2023-07-14 11:23:32 +08:00
    @0o0O0o0O0o 对比看了一下,相比 go ,是有一点不一样,不过不同的地方很少,就拓展有点差异
    - supported_versions 少 0x0302,0x0301
    - signature)algorithms 少 0x0603, 0x0203, 0x0201
    - padding 长度少一点
    目前不确定是不是这 3 个的原因,试试看
    qq78660651
        6
    qq78660651  
       2023-07-14 11:25:46 +08:00   ❤️ 1
    @chiron688 from selenium.webdriver.chrome.options import Options
    这样引入编辑器会有波浪线提示,看着不难受么,
    Masterlxj
        7
    Masterlxj  
    OP
       2023-07-14 11:26:16 +08:00
    @yingxiangyu 不是,凡是基于 openssl 的请求包都只能构造加密组件来伪造 tls 指纹。自己实现的请求过程,加密套件,拓展都是可以修改的,所以不存在这个问题
    Masterlxj
        8
    Masterlxj  
    OP
       2023-07-14 11:26:34 +08:00
    @wuchujie 不是
    timnottom
        9
    timnottom  
       2023-07-14 11:31:27 +08:00
    所以可以分享你的的基本 go 代码吗,对 go 构建指纹比较有兴趣
    Masterlxj
        10
    Masterlxj  
    OP
       2023-07-14 11:37:25 +08:00
    @timnottom go 的话,这一块支持的比较多,底层组件很多都支持。我用的 cycletls ,git 找一下就有
    2333wz
        11
    2333wz  
       2023-07-14 11:38:46 +08:00
    @qq78660651 要怎么做正确呢?我也有这个问题,纠结了好久;好像问题也只有波浪线
    qq78660651
        12
    qq78660651  
       2023-07-14 11:50:13 +08:00   ❤️ 1
    @2333wz
    from selenium.webdriver import ChromeOptions
    好像和 python 解释器版本也有关系,家里 3.11 会有提示,3.10 及以下好像没提示的
    大概率是 selenium 库有更新,这种写法是兼容以前的项目吧,
    毕竟代码和人能有一个能跑就没事
    sunshijie
        13
    sunshijie  
       2023-07-14 13:25:36 +08:00
    https://github.com/yifeikong/curl_cffi
    用这个包请求试试 或者提供一下网站,github 上有很多 chrome tls 指纹的包,可以再参考胰腺癌
    HunSiKing
        14
    HunSiKing  
       2023-07-14 13:38:51 +08:00
    所以可以分享你的的基本 go 代码
    Masoud2023
        15
    Masoud2023  
       2023-07-14 13:41:39 +08:00
    为什么不用 headless chrome 方案?
    lopssh
        16
    lopssh  
       2023-07-14 13:53:44 +08:00
    不会有什么时序上面的检测吧。。
    Masterlxj
        17
    Masterlxj  
    OP
       2023-07-14 13:58:05 +08:00
    @lopssh 大佬指的时序是哪一方面?
    yingdashi
        18
    yingdashi  
       2023-07-14 15:57:36 +08:00
    cf 不是用机器学习检测的吗
    alukongfu
        20
    alukongfu  
       2023-07-14 17:02:53 +08:00
    可以参考一下这个 @Masterlxj
    Masterlxj
        21
    Masterlxj  
    OP
       2023-07-14 18:58:47 +08:00 via Android
    @yingdashi 是的,不过不清楚它识别的是哪些参数
    Masterlxj
        22
    Masterlxj  
    OP
       2023-07-14 19:03:21 +08:00 via Android
    @alukongfu 首先感谢大佬的回复,不过这个不是我想要的,文中所提到的方法,对于强检测的网站是没用的,python 在这一块有很大劣势(是的,python 在爬虫方面相比其他语言竟然有劣势)。所有基于 openssl 的请求库都没法完全构造 tls ,更别说一向好用的 requests 连 h2 都不支持
    lanlanye
        23
    lanlanye  
       2023-07-15 01:27:50 +08:00
    盲猜一手 ChatGPT ,好像有一些 Chrome 插件可以实现长期驻留在页面上并模拟出活跃状态,你可以找找看他们怎么实现的。
    chiron688
        24
    chiron688  
       2023-07-16 10:52:13 +08:00
    @qq78660651 你没有下 chrome 的 webdrive 吧,下了放在指定文件夹里面就会消除波浪线了
    也有可能是我用的 vscode
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1074 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 19:20 · PVG 03:20 · LAX 11:20 · JFK 14:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.