网站屏蔽了curl,即使是真正的浏览器的标题

2024-06-16 17:54:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我注意到http://www.momondo.com.cn/正在使用一些神奇的技术: curl不起作用。URL在web浏览器中显示得很好,但是curl总是返回一个超时,即使我像web浏览器一样添加所有的标题。在

我还尝试了Python请求和urllib2,但它们也不起作用。在

C:\Users\Administrator>curl -v -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36" -H "Connection: Keep-Alive" -H "Accept-Encoding:gzip, deflate, sdch" -H "Cache-Control:no-cache" -H "Upgrade-Insecure-Requests:1" -H "Accept-Language:zh-CN,zh;q=0.8" -H "Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
http://www.momondo.com.cn/
* About to connect() to www.momondo.com.cn port 80 (#0)
*   Trying 184.50.91.106...
* connected
* Connected to www.momondo.com.cn (184.50.91.106) port 80 (#0)
> GET / HTTP/1.1
> Host: www.momondo.com.cn
> User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36
> Connection: Keep-Alive
> Accept-Encoding:gzip, deflate, sdch
> Cache-Control:no-cache
> Upgrade-Insecure-Requests:1
> Accept-Language:zh-CN,zh;q=0.8
> Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
>

为什么以及如何发生?莫蒙多是如何逃逸的?在


Tags: tocomwebhttpapplicationwww浏览器xml
2条回答

我找到了原因:

momondo使用以下方法来阻止不真实的web客户端。在

  1. 检测用户代理。不能是curl的默认UA。在
  2. 检测“Connection”报头。在我的初始测试中必须使用“keep alive”而不是“keep alive”。在
  3. 检测“接受编码”标头。不能空,可以用任何东西。在

最后,我现在可以使用curl来获取内容:

curl -v -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36" -H "Connection: keep-alive" -H "Accept-Encoding: nothing" http://www.momondo.com.cn/

顺便说一句,我已经做了七年的网络垃圾。这是我第一次遇到一个网站使用这种防刮方法。标记一下。在

您是如何设置请求的?如果您使用的是requests,那么您应该使用^{}对象类型,并更改其中的头,以便可以轻松地重用它们。看起来他们并没有做什么特别的事情,因为直接在那个站点上使用telnet(例如,telnet www.momondo.com.cn 80)和由浏览器生成的报头(通过tcpdump捕获的)会导致内容返回,而不是挂起直到超时。此外,它还关注站点背后的CDN(内容交付网络),在这种情况下,地址解析为akamaiedge.net的某个子域,这意味着检查why they might have blocked you可能有用。在

总之,使用您随requests.Session对象提供的头,就生成了一个响应。在

>>> from requests import Session
>>> session = Session()
>>> session.headers  # check the default headers
{'User-Agent': 'python-requests/2.12.5', 'Connection': 'keep-alive', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*'}
>>> session.headers['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
>>> session.headers['Accept-Language'] = 'en-GB,en-US;q=0.8,en;q=0.6,zh-TW;q=0.4'
>>> session.headers['Cache-Control'] = 'max-age=0'
>>> session.headers['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36'
>>> response = session.get('http://www.momondo.com.cn/')
>>> response
<Response [200]>

一点也不神奇。在

相关问题 更多 >