V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
kisshere
V2EX  ›  程序员

爬虫大佬进来,这个没验证码、不限制 ip、不混淆字符的网站能爬出来算我输

  •  4
     
  •   kisshere · 2020-03-20 10:01:30 +08:00 · 8525 次点击
    这是一个创建于 674 天前的主题,其中的信息可能已经有所发展或是发生改变。

    https://pixabay.com

    这个站本来准备练练手写爬虫,却严重打击了写爬虫的信心,不限制 ip,没 captcha,你即使复制浏览器的所有 headers,服务器还是能直接一个 403 扔过来,但你用正常浏览器:chrome、Firefox 就能正常访问,这个用的什么反爬技术

    第 1 条附言  ·  2020-03-20 10:37:35 +08:00
    chrome 清除 cookie 能正常访问,但是对已访问的网址 copy as cURL, 用 copy 的 cURL 命令请求,就 403 了,这种反爬如果能破解,感觉可以推广一下,体验很好,不伤用户
    qsnow6
        1
    qsnow6  
       2020-03-20 10:03:47 +08:00   ❤️ 6
    就不给你爬
    sphawkcn
        2
    sphawkcn  
       2020-03-20 10:04:53 +08:00   ❤️ 1
    既然能用正常浏览器访问,那你用无头浏览器爬不就行了?
    b821025551b
        3
    b821025551b  
       2020-03-20 10:06:15 +08:00
    crella
        4
    crella  
       2020-03-20 10:06:20 +08:00
    禁用了 js 就看不到图片群了,有没有试过 selenium 那些?
    mooyo
        5
    mooyo  
       2020-03-20 10:07:00 +08:00
    <p data-translate="why_captcha_detail">
    <ol>
    <li>检测到您的 IP 有风险行为,通过输入验证码来确认非机器访问</li>
    <li>网站管理员开启了某些安全功能,需要对访客进行验证</li>
    <li>您的网络是公共出口 IP (比如,网吧、公司、ADSL 拨号等),其他人的行为导致出口 IP 被标记为风险,需要用户通过验证方式访问</li>
    <li>您的网络环境可能存在风险</li>
    </ol>
    </p>
    mooyo
        6
    mooyo  
       2020-03-20 10:07:11 +08:00
    这不是有验证码么
    kisshere
        7
    kisshere  
    OP
       2020-03-20 10:07:27 +08:00
    @b821025551b 能纯文本一下你的 curl 命令吗?我大致看了下跟我的 curl 命令差不多,我本地网络试试
    b821025551b
        8
    b821025551b  
       2020-03-20 10:08:39 +08:00
    @kisshere #7 chrome 可以直接复制 cURL
    XGF
        9
    XGF  
       2020-03-20 10:08:57 +08:00
    给👨爬
    azoon
        10
    azoon  
       2020-03-20 10:09:15 +08:00
    这个网站还用了百度云加速。。
    loading
        11
    loading  
       2020-03-20 10:11:17 +08:00 via Android
    帅不过 3 分钟。(3 楼)
    zhangpeter
        12
    zhangpeter  
       2020-03-20 10:12:29 +08:00
    用谷歌推出的 puppeteer
    azoon
        13
    azoon  
       2020-03-20 10:12:59 +08:00
    @b821025551b。。。看看 tittle。都被禁止访问了
    lululau
        14
    lululau  
       2020-03-20 10:13:16 +08:00
    有 body 就不是 403 了?

    我试了 Chrome dev tools 复制出来的 curl 命令确实还是 403,有点意思,研究研究
    nullboy
        15
    nullboy  
       2020-03-20 10:16:37 +08:00
    kisshere
        16
    kisshere  
    OP
       2020-03-20 10:22:42 +08:00
    @b821025551b 清除这网站的所有 cookie,刷新 pixabay.com ,能正常访问,然后 F12 里面 copy cURL,403 了,好神奇
    zhenjiachen
        17
    zhenjiachen  
       2020-03-20 10:31:32 +08:00
    @kisshere 确实是的,用 chrome 复制的 curl 出来还是 403,确实很神奇
    mywaiting
        18
    mywaiting  
       2020-03-20 10:36:27 +08:00
    我能爬,防护的原理不复杂,但是你要自己去发现一下
    b821025551b
        19
    b821025551b  
       2020-03-20 10:37:42 +08:00
    b821025551b
        20
    b821025551b  
       2020-03-20 10:40:50 +08:00
    原理很简单,你直接 cURL 出来的东西无法执行 js,只有浏览器环境下才是正常的请求,所以要依靠浏览器去渲染,chrome 的 headless 模式了解一下。
    kisshere
        21
    kisshere  
    OP
       2020-03-20 10:44:55 +08:00
    @b821025551b chrome 首先得到的是 HTML,再去执行 js,network 面板里面,你去复制得到 HTML 那一步(也就是第一步)的 cURL,浏览器能得到正常 HTML,但是 cURL 却 403
    vanton
        22
    vanton  
       2020-03-20 10:46:27 +08:00
    请使用能解析 js 的无头浏览器做爬虫,不能解析 js 的不能算是爬虫。
    没有 js 直接 403 又没有什么难度。
    b821025551b
        23
    b821025551b  
       2020-03-20 10:48:48 +08:00
    @kisshere #21 仔细看 19L 的图,和原站对比一下。先开启 headless 做好代理,cURL 就可用了。
    kisshere
        24
    kisshere  
    OP
       2020-03-20 10:48:51 +08:00
    @vanton 只是纯技术的好奇,chrome 第一步得到 HTML 的时候,没有执行 js 啊?为啥 chrome 能得到正常的 HTML,而复制出来的 cURL 去执行却返回 403
    eluotao
        25
    eluotao  
       2020-03-20 10:50:00 +08:00
    这个网站很好爬啊,直接爬去所有类型 改 id 就可以了
    fancy111
        26
    fancy111  
       2020-03-20 10:58:38 +08:00
    太简单,过
    InternetExplorer
        27
    InternetExplorer  
       2020-03-20 11:00:01 +08:00   ❤️ 3
    用这个网站的域名在 GitHub 上搜一下 🤔
    azoon
        28
    azoon  
       2020-03-20 11:06:18 +08:00
    #coding=utf-8
    from selenium import webdriver
    browser = webdriver.Chrome()
    print(type(browser))
    browser.get('https://pixabay.com')
    eles = browser.find_elements_by_css_selector('div.flex_grid.credits > div > a')

    for e in eles:
    print(e.get_attribute('href'))
    browser.quit()
    fenghuang
        29
    fenghuang  
       2020-03-20 11:08:23 +08:00
    浏览器能打开,headerless 基本可以,关键是怎么检测的是否是浏览器请求的,请求头和 Chrome 完全一样,直接跳百度云加速,而使用 Chrome 打开就不跳,真的很奇怪
    luoleng
        30
    luoleng  
       2020-03-20 11:10:12 +08:00   ❤️ 1
    cookie.__cfduid???
    vanton
        31
    vanton  
       2020-03-20 11:11:30 +08:00
    @kisshere #24

    ‘’‘’
    curl -svo /dev/null https://pixabay.com
    ‘’‘’

    有 http 执行的路由信息
    haha370104
        32
    haha370104  
       2020-03-20 11:21:21 +08:00   ❤️ 1
    印象中某些时候,chrome 的调试工具并不会显示所有的请求头。

    说 js 的先考虑这么一个问题:浏览器的加载顺序是下载 HTML->解析 HTML->下载 HTML 内的所有引用资源、那么请问,在执行第一步的时候,服务器是怎么知道一个浏览器能不能加载 js 的?更加方便的一个反驳方式:请直接进入设置禁用掉 chrome 的 javascript 代码,页面虽然加载略微有点不正常但是不会 403

    我们换种方式,先禁用掉 JavaScript (非必要步骤),然后打开 Charles,解析 https 包,然后发现浏览器被 403 了,在通过验证码认证后,cookies 里面多出了一个 key:cf_clearance,curl 的时候加上这个 cookie 就可以正常请求了
    a494836960
        33
    a494836960  
       2020-03-20 11:22:24 +08:00
    直接用浏览器插件爬,哈哈
    dtsdao
        34
    dtsdao  
       2020-03-20 11:26:50 +08:00
    Cloudflare 罢了,Cookie 里加了东西
    JamesChan21
        35
    JamesChan21  
       2020-03-20 11:31:59 +08:00   ❤️ 2
    好了,是时候收网了。。。
    kisshere
        36
    kisshere  
    OP
       2020-03-20 11:32:49 +08:00
    @haha370104 但为什么浏览器能无 cookie 访问,cURL 就不行
    fenghuang
        37
    fenghuang  
       2020-03-20 11:34:19 +08:00
    @haha370104 #32 这就是奇怪的地方,首次访问(无 cookies )非浏览器请求必 403,这个是怎么检测的
    fenghuang
        38
    fenghuang  
       2020-03-20 11:40:20 +08:00
    @kisshere #36 好像是 不管什么方式访问都是 403 响应体内有 Set-Cookie,然后跳转之后又 cookies 后就可以正常请求了
    dtsdao
        39
    dtsdao  
       2020-03-20 11:40:44 +08:00
    @kisshere 朋友,你听说过 CF 五秒验证吗?后台可能有机制会自动判断哪些机器过了哪些没过

    https://support.cloudflare.com/hc/en-us/articles/200170156-Understanding-the-Cloudflare-Cookies
    haha370104
        40
    haha370104  
       2020-03-20 11:41:29 +08:00
    @fenghuang 你即使用浏览器,外面套一层 charles 的代理照样会被检测,我其实还是挺怀疑浏览器的调试工具并没有告诉你全部的请求头或者说做了一些你不知道的事情
    fenghuang
        41
    fenghuang  
       2020-03-20 11:45:10 +08:00
    @haha370104 #40 确实是,用 fiddler 抓包还是跳到检测,难道是检测的证书?
    iamfhd
        42
    iamfhd  
       2020-03-20 11:45:12 +08:00
    大佬们就是厉害。。。。
    kisshere
        43
    kisshere  
    OP
       2020-03-20 11:46:14 +08:00
    @fenghuang 这个感觉就是双缝干涉试验了,你不检测就返回正常 HTML,用 fiddler 一检测,直接就扔 recaptcha 验证了
    monkeyWie
        44
    monkeyWie  
       2020-03-20 11:50:37 +08:00
    测试了一下,初步怀疑是 http1.0 协议的客户端直接被 pass,但是我用 curl 指定 http2.0 协议请求也是 403,但是验证肯定还是在 TLS 这层,不是 http 这层,估计 curl 和浏览器的 TLS 握手还是有区别的。
    IGJacklove
        45
    IGJacklove  
       2020-03-20 11:53:12 +08:00
    @a494836960 这种到底犯不犯法?上次用浏览器插件爬了一次别人的视频,很慌。。。
    scriptB0y
        46
    scriptB0y  
       2020-03-20 12:05:45 +08:00
    zzzmh
        47
    zzzmh  
       2020-03-20 12:14:23 +08:00
    建议别爬了,直接申请 api
    leetom
        48
    leetom  
       2020-03-20 12:25:40 +08:00
    插个楼问一句
    谷歌浏览器开发者工具,有没有 “清除当前网站 Cookies” 类似功能?只清除当前域名下的 Cookies
    no1xsyzy
        49
    no1xsyzy  
       2020-03-20 12:29:18 +08:00
    uMatrix 拉到全红页面显示不全但还是 200 OK
    Postman,Chrome 版 200,但独立版也是 403
    这个不太确定是否有关:
    no1xsyzy
        50
    no1xsyzy  
       2020-03-20 12:30:26 +08:00
    @leetom Application 选项卡,Storage -> Cookies -> 右键域名 -> Clear
    ShundL
        51
    ShundL  
       2020-03-20 12:33:43 +08:00
    尝试在 charles 下抓完再复制 cURL,请求无效;在手机上用 stream 抓包直接弹验证码。

    有点儿意思,关注学习中。
    leetom
        52
    leetom  
       2020-03-20 12:35:50 +08:00
    @no1xsyzy 谢谢!
    不过这个还是不如在 Network 选项卡那里直接清除方便,搞不懂那里为啥只有一个清除所有 Cookies 的选项
    vanton
        53
    vanton  
       2020-03-20 12:55:26 +08:00
    tlday
        54
    tlday  
       2020-03-20 13:09:10 +08:00   ❤️ 4
    去掉 RequestHeader 里面的 authority 头,然后加--tlsv1.3 就可以了
    tlday
        55
    tlday  
       2020-03-20 13:26:30 +08:00   ❤️ 1
    至于 Chrome 为什么可以发 authority 头。我这里没有同时支持 http/2 和 tls/1.3 的 curl,不知道加了--http2 和--tlsv1.3 的 curl 能不能加 authority 头。
    FaiChou
        56
    FaiChou  
       2020-03-20 13:43:02 +08:00
    brew tap bolmaster2/curl-openssl
    brew install [email protected]
    /usr/local/opt/[email protected]/bin/curl --tlsv1.3 ***
    nifury
        57
    nifury  
       2020-03-20 14:00:21 +08:00
    Delon
        58
    Delon  
       2020-03-20 14:58:12 +08:00
    @ShundL cURL 直接请求无效,cURL 设置 Charles 代理无效,cURL 设置 Charles 代理 + MITM 有效,估计是 SSL 握手的问题,再 Charles 外面再设置一层代理或者 wireshark 直接对比应该可以看出来,懒得折腾了
    no1xsyzy
        59
    no1xsyzy  
       2020-03-20 15:47:52 +08:00
    @tlday 我这边默认 TLSv1.3 不行,结果加上 --tls-max 1.2 竟然可以了……
    authority 是在哪?我闭着眼睛按 -v 都没有……
    lqzhgood
        60
    lqzhgood  
       2020-03-20 16:21:10 +08:00
    F12 复制 curl 导入 postman 正常。。。
    AmberJiang
        61
    AmberJiang  
       2020-03-20 16:32:49 +08:00
    有意思 观望一下
    sunziren
        62
    sunziren  
       2020-03-20 16:49:12 +08:00
    @JamesChan21 你要笑死我😀
    woscaizi
        63
    woscaizi  
       2020-03-20 17:01:47 +08:00
    很明显啊,不是这个网站在反爬,是 cloudflare 的反爬策略生效了。
    hicdn
        64
    hicdn  
       2020-03-20 17:04:44 +08:00
    @FaiChou brew install curl-openssl 就行,不用 tap
    fzhyzamt
        65
    fzhyzamt  
       2020-03-20 17:14:01 +08:00
    试了一下拷贝 curl 直接执行,正常页面。。。。
    hellov22ex
        66
    hellov22ex  
       2020-03-20 17:15:48 +08:00
    楼主,你学爬虫要知道一个原理,你人能看到的任何东西,都可以爬下来,就算是图片里面的文字,你喜欢也可以做 OCR,只有想不到,没有做不到
    F0nebula
        67
    F0nebula  
       2020-03-20 17:19:16 +08:00
    @tlday # 54 我这里直接加 --tlsv1.3 就可以了

    curl -V
    curl 7.69.1 (x86_64-pc-linux-gnu) libcurl/7.69.1 OpenSSL/1.1.1d zlib/1.2.11 libidn2/2.3.0 libpsl/0.21.0 (+libidn2/2.2.0) libssh2/1.9.0 nghttp2/1.39.2
    Release-Date: 2020-03-11
    Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp
    Features: AsynchDNS GSS-API HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM NTLM_WB PSL SPNEGO SSL TLS-SRP UnixSockets
    fenghuang
        68
    fenghuang  
       2020-03-20 17:42:57 +08:00
    http/2 和 tls/1.3 的问题,不支持这两个协议的浏览器打不开这个网站了?
    ik
        69
    ik  
       2020-03-20 18:11:39 +08:00 via iPhone
    @leetom 不介意使用扩展的话可以试试 editthiscookies
    fishfisher
        70
    fishfisher  
       2020-03-20 18:12:33 +08:00
    curl 'https://pixabay.com/' -o /dev/null -s -w %{http_code} \
    -H 'authority: pixabay.com' \
    -H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36' \
    -H 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9' \
    -H 'accept-language: zh-CN,zh;q=0.9,en;q=0.8'; echo

    试了一下 curl, 上面 4 个-H 少一个都会 403
    tlday
        71
    tlday  
       2020-03-20 18:14:58 +08:00
    @fenghuang 我测试下来 tls/1.3 是必须的,我没有其他不支持 tls/1.3 的浏览器可以测试,所以不知道不支持 tls/1.3 的浏览器能不能看。但是可以 bypass 反爬机制的就是:
    1.用 http/1.x,tls/1.3,去掉 authority 头
    2.用 http/2,tls/1.3,可以不用去掉 authority 头(推断)

    authority 头是 http/2 特有的头,所以不会存在用 http/1.x,却发了 authority 头的浏览器。如果出现这种行为一定不是真人。
    https://stackoverflow.com/questions/36019868/authority-http-header-in-chrome-dev-tools

    即使真的有人在用不支持 tls/1.3 的浏览器,不是还有个验证页面和 cf_clearance 的 cookie 可以用么。只是体验差一点,但是 CF 他们既然敢这么做,说明现在不支持 tls/1.2 的浏览器应该已经很少了,影响不了绝大多数客户的浏览体验。
    tlday
        72
    tlday  
       2020-03-20 18:16:29 +08:00
    不支持 tls/1.2 的浏览器应该已经很少了 => 不支持 tls/1.3 的浏览器应该已经很少了
    monospace
        73
    monospace  
       2020-03-20 18:20:53 +08:00
    所以,输了的话会怎样?
    goobai
        74
    goobai  
       2020-03-20 18:37:38 +08:00 via Android
    splash 随便爬
    nmdx
        75
    nmdx  
       2020-03-20 18:55:53 +08:00 via Android
    @tlday 旧版 Edge 是 tls1.2 win10 的 ie11 也是 可以直接打开,并没有什么问题,所以 tls 版本不是问题
    9684xtpa
        76
    9684xtpa  
       2020-03-20 19:40:51 +08:00
    @crella #4 +1 ,selenium 轻松搞定
    ihipop
        77
    ihipop  
       2020-03-20 21:27:03 +08:00 via Android
    @nmdx ua case ?
    dsg001
        78
    dsg001  
       2020-03-20 22:01:59 +08:00
    cloudflare 的五秒盾,试试能不能找到源 ip
    douglas1997
        79
    douglas1997  
       2020-03-20 22:50:06 +08:00 via iPhone
    @nullboy #15 分享一下 common 呗:-P
    nullboy
        80
    nullboy  
       2020-03-20 23:21:34 +08:00
    @douglas1997 就创建一个 chrome driver,网上多的是
    hicdn
        81
    hicdn  
       2020-03-20 23:48:27 +08:00
    一个可以通过验证的最小参数的 curl 命令

    curl 'https://pixabay.com/' -H 'Accept-Language: en' --tlsv1.3 -A curl
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2526 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 41ms · UTC 13:10 · PVG 21:10 · LAX 05:10 · JFK 08:10
    ♥ Do have faith in what you're doing.