2017-04-16 13 views
1

私は、http://www.momondo.com.cn/が魔法の技術を利用していることに気付きました。 curlは動作しません。 URLはウェブブラウザでうまく表示されますが、curlはウェブブラウザのようにすべてのヘッダを追加しても常にタイムアウトを返します。実際のブラウザのヘッダーでもカールをブロックするウェブサイト

私も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 
> 

なぜこれが起こりますか?モモンドはどのようにしてcurlを逃れることができますか?

+0

これは広すぎます。ブラウザ以外のトラフィックを指紋処理する方法はたくさんあります。物をクロールする最善の方法は、ヘッドレスブラウザを使用することです。 –

+1

はい、私はこれを知っています、いくつかのウェブサイトはJavascriptで検出できます。しかし、私はmomondoが実際のブラウザとまったく同じ最初のクエストで検出できることに驚いています。 – redice

答えて

1

どのようにリクエストを設定していますか? requestsを使用している場合は、オブジェクトタイプSessionを使用して、ヘッダーを変更して再利用しやすくする必要があります。ブラウザで生成されたヘッダ(確かにtcpdumpでキャプチャされたヘッダ)を使ってそのサイト(すなわちtelnet www.momondo.com.cn 80)で直接telnetを使用すると、タイムアウトまでハングアップするのではなく内容が返されるため、何か特別なことをするようなことはありません。また、サイトにどのような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]> 

まったく魔法ではないようです。

+0

ありがとうございます。リクエストのセッションはキープアライブを使用し、エンコードのデフォルトを使用します。それは動作します。 – redice

0

私はその理由を把握:

momondoは非現実的なWebクライアントをブロックするには、次の方法を使用しています。

  1. ユーザーエージェントを検出します。カールのデフォルトのUAにすることはできません。
  2. "Connection"ヘッダーを検出します。最初のテストでは「キープアライブ」ではなく「キープアライブ」を使用する必要があります。
  3. "Accept-Encoding"ヘッダーを検出します。空ではありません。何でも使用できます。

最終的に私は今、コンテンツを取得するためにカールを使用することができます

カール-v -H「のUser-Agent:Mozillaの/ 5.0(Macintosh版、インテルのMac OS X 10_10_3)のAppleWebKit/537.36(ヤモリのようにKHTML、)クローム/ 44.0.2403.89 サファリ/ 537.36" -H "接続:キープアライブ" -H "同意エンコード: 何も" ところでhttp://www.momondo.com.cn/

、私は約7のためにウェブスクレイピングやってきました年。私は、この掻き取り防止方法を使用したウェブサイトに出会ったのは初めてです。それをマークする。

+0

'Accept-Encoding'ヘッダーは' Accept-Language'ヘッダーに置き換えることもできます。 '-H 'Accept-Language:zh-CN、zh; q = 0.8" '。かなりの数のヘッダーをチェックし、最小数がチェックアウトするとリクエストが通過することを確認してください。 – metatoaster

+0

あなたは正しいです。そして、私はそれがブラウザのバージョンでIPを追跡するかもしれないことに気付く。例えば'User Agent:Mozilla/5.0(Windows NT 6.2; WOW64; rv:56.0)Gecko/20100101 Firefox/50.0'は動作しますが、 'Firefox/17.0'は動作しません。 – redice

+0

また、ブラウザを覚えている可能性があります。 "Mozilla/5.0(Macintosh; Intel Mac OS X 10_10_3)AppleWebKit/537.36(GeckoのようなKHTML)Chrome/44.0.2403.89 Safari/537.36"を使用する場合、Mozilla/4.0(互換性あり、MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)」は機能しません。 – redice

関連する問題