1

いくつかのコード

headers = {}
headers['user-agent'] = 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:16.0) Gecko/20100101 Firefox/16.0'
headers['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
headers['Accept-Language'] = 'en-gb,en;q=0.5'
#headers['Accept-Encoding'] = 'gzip, deflate'

request = urllib.request.Request(sURL, headers = headers)
try:
    response = urllib.request.urlopen(request)
except error.HTTPError as e:
    print('The server couldn\'t fulfill the request.')
    print('Error code: {0}'.format(e.code))
except error.URLError as e:
    print('We failed to reach a server.')
    print('Reason: {0}'.format(e.reason))
else:
    f = open('output/{0}.html'.format(sFileName),'w')
    f.write(response.read().decode('utf-8'))

URL

http://groupon.cl/descuentos/santiago-centro

状況

これが私がしたことです:

  1. ブラウザで JavaScript を有効にする
  2. 上記の URL を開き、コンソールを監視します
  3. JavaScript を無効にする
  4. 手順 2 を繰り返します (チューニングしたばかりの場合は、javascript が無効になっています)。
  5. urllib2 を使用して Web ページを取得し、ファイルに保存します。
  6. JavaScript を有効にする
  7. ブラウザでファイルを開き、コンソールを観察します
  8. JavaScriptをオフにして7を繰り返します

結果

  • ステップ 2 では、ページ コンテンツの多くが ajax を使用して動的に読み込まれていることがわかりました。そのため、到着した HTML は一種のスケルトンであり、ギャップを埋めるために ajax が使用されました。これは素晴らしいことであり、まったく驚くべきことではありません

  • ページは seo に適している必要があるため、js がなくても問題なく動作するはずです。ステップ 4 では、コンソールで何も起こらず、スケルトン ページがロードされ、ajax は不要になります。これも全く紛らわしくない

  • ステップ 7 では、ajax 呼び出しが行われますが失敗します。彼らが使用している URL はローカルではないため、これも問題ありません。したがって、呼び出しは壊れています。ページはスケルトンのように見えます。これも期待大です。

  • ステップ 8: ajax 呼び出しは行われず、スケルトンは単なるスケルトンです。これはステップ4のように振る舞うべきだと思っていたでしょう

質問

私がやりたいことは、urllib2 を使用してステップ 4 から html を取得することですが、その方法がわかりません。私は何が欠けていますか、どうすればこれをやってのけることができますか?

言い換えると

もし私がスパイダーを書いていたら、普通の HTML を取得できるようにしたいと思うでしょう (ステップ 4 の結果のように)。私はajaxのものやJavaScriptをまったく実行したくありません。動的に何かを入力したくありません。HTMLが欲しいだけです。

SEO フレンドリーなサイトは、私が欲しいものを手に入れることを望んでいます。それが SEO のすべてだからです。

私が概説した状況を考えると、プレーンな HTML コンテンツを取得するにはどうすればよいでしょうか?

手動で行うには、js をオフにし、ページに移動し、ソースを表示し、ctrl-a、ctrl-c、ctrl-v (便利な場所) を使用します。

私のためにそれを行うスクリプトを取得するには...?

私が試したこと

Wireshark を使用してパケット ヘッダーを調べましたが、手順 2 と 4 で PC から送信された GET には同じヘッダーが含まれています。SEO について読むと、これはごく普通のことであり、そうでなければ、ハイジャックなどの手法は使用されないだろうと思います。

私のブラウザが送信するヘッダーは次のとおりです。

Host: groupon.cl
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:16.0) Gecko/20100101 Firefox/16.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive

スクリプトが送信するヘッダーは次のとおりです。

Accept-Encoding: identity
Host: groupon.cl
Accept-Language: en-gb,en;q=0.5
Connection: close
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:16.0) Gecko/20100101 Firefox/16.0

違いは次のとおりです。

  • 私のスクリプトには、キープアライブではなく Connection = close があります。これがどのように問題を引き起こすのかわかりません
  • 私のスクリプトには Accept-encoding = identity があります。これが問題の原因である可能性があります。ただし、ホストがこのフィールドを使用してユーザーエージェントを決定する理由はよくわかりません。ブラウザーの要求ヘッダーに一致するようにエンコードを変更すると、デコードに問題が発生します。私は今これに取り組んでいます...

このスペースを見てください。新しい情報が出たら質問を更新します

4

0 に答える 0