
这个站本来准备练练手写爬虫,却严重打击了写爬虫的信心,不限制 ip,没 captcha,你即使复制浏览器的所有 headers,服务器还是能直接一个 403 扔过来,但你用正常浏览器:chrome、Firefox 就能正常访问,这个用的什么反爬技术
1 qsnow6 Mar 20, 2020 就不给你爬 |
2 sphawkcn Mar 20, 2020 既然能用正常浏览器访问,那你用无头浏览器爬不就行了? |
3 b821025551b Mar 20, 2020 |
4 crella Mar 20, 2020 禁用了 js 就看不到图片群了,有没有试过 selenium 那些? |
5 mooyo Mar 20, 2020 <p data-translate="why_captcha_detail"> <ol> <li>检测到您的 IP 有风险行为,通过输入验证码来确认非机器访问</li> <li>网站管理员开启了某些安全功能,需要对访客进行验证</li> <li>您的网络是公共出口 IP (比如,网吧、公司、ADSL 拨号等),其他人的行为导致出口 IP 被标记为风险,需要用户通过验证方式访问</li> <li>您的网络环境可能存在风险</li> </ol> </p> |
6 mooyo Mar 20, 2020 这不是有验证码么 |
7 kisshere OP @b821025551b 能纯文本一下你的 curl 命令吗?我大致看了下跟我的 curl 命令差不多,我本地网络试试 |
8 b821025551b Mar 20, 2020 @kisshere #7 chrome 可以直接复制 cURL |
9 XGF Mar 20, 2020 给爬 |
10 azoon Mar 20, 2020 这个网站还用了百度云加速。。 |
11 loading Mar 20, 2020 via Android 帅不过 3 分钟。(3 楼) |
12 zhangpeter Mar 20, 2020 用谷歌推出的 puppeteer |
13 azoon Mar 20, 2020 @b821025551b。。。看看 tittle。都被禁止访问了 |
14 lululau Mar 20, 2020 有 body 就不是 403 了? 我试了 Chrome dev tools 复制出来的 curl 命令确实还是 403,有点意思,研究研究 |
15 nullboy Mar 20, 2020 |
16 kisshere OP @b821025551b 清除这网站的所有 cookie,刷新 pixabay.com ,能正常访问,然后 F12 里面 copy cURL,403 了,好神奇 |
17 zhenjiachen Mar 20, 2020 @kisshere 确实是的,用 chrome 复制的 curl 出来还是 403,确实很神奇 |
18 mywaiting Mar 20, 2020 我能爬,防护的原理不复杂,但是你要自己去发现一下 |
19 b821025551b Mar 20, 2020 |
20 b821025551b Mar 20, 2020 原理很简单,你直接 cURL 出来的东西无法执行 js,只有浏览器环境下才是正常的请求,所以要依靠浏览器去渲染,chrome 的 headless 模式了解一下。 |
21 kisshere OP @b821025551b chrome 首先得到的是 HTML,再去执行 js,network 面板里面,你去复制得到 HTML 那一步(也就是第一步)的 cURL,浏览器能得到正常 HTML,但是 cURL 却 403 |
22 vanton Mar 20, 2020 请使用能解析 js 的无头浏览器做爬虫,不能解析 js 的不能算是爬虫。 没有 js 直接 403 又没有什么难度。 |
23 b821025551b Mar 20, 2020 @kisshere #21 仔细看 19L 的图,和原站对比一下。先开启 headless 做好代理,cURL 就可用了。 |
24 kisshere OP @vanton 只是纯技术的好奇,chrome 第一步得到 HTML 的时候,没有执行 js 啊?为啥 chrome 能得到正常的 HTML,而复制出来的 cURL 去执行却返回 403 |
25 eluotao Mar 20, 2020 这个网站很好爬啊,直接爬去所有类型 改 id 就可以了 |
26 fancy111 Mar 20, 2020 太简单,过 |
27 InternetExplorer Mar 20, 2020 用这个网站的域名在 GitHub 上搜一下 |
28 azoon Mar 20, 2020 #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() |
29 fenghuang Mar 20, 2020 浏览器能打开,headerless 基本可以,关键是怎么检测的是否是浏览器请求的,请求头和 Chrome 完全一样,直接跳百度云加速,而使用 Chrome 打开就不跳,真的很奇怪 |
30 luoleng Mar 20, 2020 cookie.__cfduid??? |
31 vanton Mar 20, 2020 |
32 haha370104 Mar 20, 2020 印象中某些时候,chrome 的调试工具并不会显示所有的请求头。 说 js 的先考虑这么一个问题:浏览器的加载顺序是下载 HTML->解析 HTML->下载 HTML 内的所有引用资源、那么请问,在执行第一步的时候,服务器是怎么知道一个浏览器能不能加载 js 的?更加方便的一个反驳方式:请直接进入设置禁用掉 chrome 的 Javascript 代码,页面虽然加载略微有点不正常但是不会 403 我们换种方式,先禁用掉 Javascript (非必要步骤),然后打开 Charles,解析 https 包,然后发现浏览器被 403 了,在通过验证码认证后,cookies 里面多出了一个 key:cf_clearance,curl 的时候加上这个 cookie 就可以正常请求了 |
33 a494836960 Mar 20, 2020 直接用浏览器插件爬,哈哈 |
34 dtsdao Mar 20, 2020 Cloudflare 罢了,Cookie 里加了东西 |
35 JamesChan21 Mar 20, 2020 好了,是时候收网了。。。 |
36 kisshere OP @haha370104 但为什么浏览器能无 cookie 访问,cURL 就不行 |
37 fenghuang @haha370104 #32 这就是奇怪的地方,首次访问(无 cookies )非浏览器请求必 403,这个是怎么检测的 |
38 fenghuang Mar 20, 2020 @kisshere #36 好像是 不管什么方式访问都是 403 响应体内有 Set-Cookie,然后跳转之后又 cookies 后就可以正常请求了 |
39 dtsdao Mar 20, 2020 @kisshere 朋友,你听说过 CF 五秒验证吗?后台可能有机制会自动判断哪些机器过了哪些没过 https://support.cloudflare.com/hc/en-us/articles/200170156-Understanding-the-Cloudflare-Cookies |
40 haha370104 Mar 20, 2020 @fenghuang 你即使用浏览器,外面套一层 charles 的代理照样会被检测,我其实还是挺怀疑浏览器的调试工具并没有告诉你全部的请求头或者说做了一些你不知道的事情 |
41 fenghuang Mar 20, 2020 @haha370104 #40 确实是,用 fiddler 抓包还是跳到检测,难道是检测的证书? |
42 iamfhd Mar 20, 2020 大佬们就是厉害。。。。 |
43 kisshere OP @fenghuang 这个感觉就是双缝干涉试验了,你不检测就返回正常 HTML,用 fiddler 一检测,直接就扔 recaptcha 验证了 |
44 monkeyWie Mar 20, 2020 测试了一下,初步怀疑是 http1.0 协议的客户端直接被 pass,但是我用 curl 指定 http2.0 协议请求也是 403,但是验证肯定还是在 TLS 这层,不是 http 这层,估计 curl 和浏览器的 TLS 握手还是有区别的。 |
45 IGJacklove Mar 20, 2020 @a494836960 这种到底犯不犯法?上次用浏览器插件爬了一次别人的视频,很慌。。。 |
46 scriptB0y Mar 20, 2020 |
47 zzzmh Mar 20, 2020 建议别爬了,直接申请 api |
48 leetom Mar 20, 2020 插个楼问一句 谷歌浏览器开发者工具,有没有 “清除当前网站 Cookies” 类似功能?只清除当前域名下的 Cookies |
49 no1xsyzy Mar 20, 2020 |
51 ShundL Mar 20, 2020 尝试在 charles 下抓完再复制 cURL,请求无效;在手机上用 stream 抓包直接弹验证码。 有点儿意思,关注学习中。 |
53 vanton Mar 20, 2020 |
54 tlday Mar 20, 2020 去掉 RequestHeader 里面的 authority 头,然后加--tlsv1.3 就可以了 |
55 tlday Mar 20, 2020 至于 Chrome 为什么可以发 authority 头。我这里没有同时支持 http/2 和 tls/1.3 的 curl,不知道加了--http2 和--tlsv1.3 的 curl 能不能加 authority 头。 |
56 ethusdt Mar 20, 2020 brew tap bolmaster2/curl-openssl brew install [email protected] /usr/local/opt/[email protected]/bin/curl --tlsv1.3 *** |
57 nifury Mar 20, 2020 |
58 Delon Mar 20, 2020 @ShundL cURL 直接请求无效,cURL 设置 Charles 代理无效,cURL 设置 Charles 代理 + MITM 有效,估计是 SSL 握手的问题,再 Charles 外面再设置一层代理或者 wireshark 直接对比应该可以看出来,懒得折腾了 |
59 no1xsyzy Mar 20, 2020 @tlday 我这边默认 TLSv1.3 不行,结果加上 --tls-max 1.2 竟然可以了…… authority 是在哪?我闭着眼睛按 -v 都没有…… |
60 lqzhgood Mar 20, 2020 F12 复制 curl 导入 postman 正常。。。 |
61 AmberJiang Mar 20, 2020 有意思 观望一下 |
62 sunziren Mar 20, 2020 @JamesChan21 你要笑死我 |
63 woscaizi Mar 20, 2020 很明显啊,不是这个网站在反爬,是 cloudflare 的反爬策略生效了。 |
65 fzhyzamt Mar 20, 2020 试了一下拷贝 curl 直接执行,正常页面。。。。 |
66 hellov22ex Mar 20, 2020 楼主,你学爬虫要知道一个原理,你人能看到的任何东西,都可以爬下来,就算是图片里面的文字,你喜欢也可以做 OCR,只有想不到,没有做不到 |
67 seiuneko Mar 20, 2020 @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 |
68 fenghuang Mar 20, 2020 http/2 和 tls/1.3 的问题,不支持这两个协议的浏览器打不开这个网站了? |
70 fishfisher Mar 20, 2020 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 |
71 tlday Mar 20, 2020 @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 的浏览器应该已经很少了,影响不了绝大多数客户的浏览体验。 |
72 tlday Mar 20, 2020 不支持 tls/1.2 的浏览器应该已经很少了 => 不支持 tls/1.3 的浏览器应该已经很少了 |
73 monospace Mar 20, 2020 所以,输了的话会怎样? |
74 goobai Mar 20, 2020 via Android splash 随便爬 |
75 nmdx Mar 20, 2020 via Android @tlday 旧版 Edge 是 tls1.2 win10 的 ie11 也是 可以直接打开,并没有什么问题,所以 tls 版本不是问题 |
78 dsg001 Mar 20, 2020 cloudflare 的五秒盾,试试能不能找到源 ip |
79 douglas1997 Mar 20, 2020 via iPhone @nullboy #15 分享一下 common 呗:-P |
80 nullboy Mar 20, 2020 @douglas1997 就创建一个 chrome driver,网上多的是 |
81 hicdn Mar 20, 2020 |