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