1

私は現在、HTTP 解析が初めてで、Python を使用して HTTP でリクエストを送受信しています。リクエストの送信で扱っているWebサイトはヘッダーとPOSTだけを必要としないため、小さな問題があります。Web ページのボタンをクリックすると、次のリクエストに応答するようにサーバーに指示する JavaScript コードが実行されます。

したがって、通常同じヘッダーと POST リクエストでページを開くと、通常の GET としてページが開かれ、POST で指定したデータは読み取られません。

私のコード:

import cookielib
import urllib
import urllib2




# Store the cookies and create an opener that will hold them
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))

# Add our headers
opener.addheaders = [('User-agent', 'RedditTesting'),
                     ('Cookie', '')
                     ]


urllib2.install_opener(opener)

# The action/ target from the form
authentication_url = 'http://plapal.pla/Search.aspx'

# Input parameters we are going to send
payload = {
  '_EVENTTARGET': 'btnSearch',
  '_VIEWSTATE': 'plapla',
  'ctl04%24ddNavigate': 'plapla',
  'chkDate': 'on',
  '_EVENTARGUMENT': '',
  '_LASTFOCUS': '',
  'txtResvCode': '',
  'txtCustName': '',
  'txtFromDate': '27%2F01%2F2013',
  'txtToDate': '27%2F09%2F2013',
  'ddSearchType': '1',
  'ddChannel': '-1',
  'ddNetGross': 'NET'
  }

# Use urllib to encode the payload
data = urllib.urlencode(payload)

# Build our Request object (supplying 'data' makes it a POST)
req = urllib2.Request(authentication_url, data)

# Make the request and read the response
resp = urllib2.urlopen(req)
contents = resp.read()

print contents

しかし、うまくいきません。そして、ウェブページで検索ボタンをホバーすると、次のようになります。

javascript:WebForm_DoPostBackWithOptions(new%20WebForm_PostBackOptions("btnSearch",%20"",%20true,%20"",%20"",%20false,%20true))

このJSを実行して、実際に投稿データを入力できるようにする方法。

4

1 に答える 1

3

ヘッドレス ブラウザで JavaScript を使用する

JavaScript を実行する必要がある場合は、JavaScript エンジンが利用できると簡単です。

Python の代わりに、 PhantomJSなどのヘッドレス ブラウザーの使用を検討します。次に、ページをスクレイピングして、必要な JavaScript を実行します。独自の JS を実行するか、ページ自体からコードを実行します。

PhantomJSの例のページには、ページの自動化セクションにいくつかの例があり、必要なものに似ている可能性があります。

ページ内の既存の関数を実行したいようです: WebForm_DoPostBackWithOptions()。そこで、スクリプトをページに挿入するinjectme.jsの例を見てみましょう。次に、そのスクリプトは、必要なページ内の任意の関数を呼び出すことができます。

または、何をしているかによっては、PhantomJS を使用してさらに簡単な方法があるかもしれません。彼らには、参考になる良い例とドキュメントがたくさんあります。

Python と JavaScript デバッガーの使用

もちろん、実際に関数を直接実行する必要はないかもしれませんWebForm_DoPostBackWithOptions()。その名前から、かなり単純な JavaScript 関数のように思えます。Web ブラウザーでページを手動で操作しながら、そのコードを調べてトレースしたことはありますか? コードをトレースすると、関数が実際に何をするかを簡単に確認できるはずです。(Chrome 開発者ツールでこれを行い、「縮小」されているためにコードが判読できないことがわかった場合は、{}ボタンを使用してきれいに印刷してください。)

または、簡単に言うと、[ネットワーク] タブまたは任意のブラウザー デバッガーの同等のPOST機能を使用すると、その関数によって生成された要求を正確に確認できます。次に、Python コードで同じことを行うことができます。

現在のブラウザーの開発者ツールに慣れていない場合は、ご褒美があります。最近の開発者ツールは非常に優れています。私は Chrome に組み込まれているものを気に入っていますが、Firebug (Firefox 用) と Internet Explorer ツールも優れています。

于 2013-09-29T19:40:24.940 に答える