2011-12-09 9 views
1

私はPythonプログラムを使用してフォームを記入しようとしていますが、これは特定のサイトではうまく動作しますが、この特定のものではありません。urllib2.urlopen()は別の結果を返します

これはコードですが

query = { 
'adults':'1', 
'children':'0', 
'infants':'0', 
'trip':'RT', 
'deptCode':'LOS', 
'arrvCode':'ABV', 
'searchType':'D', 
'deptYear':'2011', 
'deptMonth':'12', 
'deptDay':'10', 
'retYear':'2011', 
'retMonth':'12', 
'retDay':'11', 
'cabin':'E', 
'currency':'NGN', 
'deptTime':'', 
'arrvTime':'', 
'airlinePref':''} 

encoded = urllib.urlencode(query) 



url = 'http://www.wakanow.com/ng/flights/SearchProcess.aspx?' + encoded 
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)' 
headers = { 'User-Agent' : user_agent } 
req = urllib2.Request(url, encoded, headers) 

response = urllib2.urlopen(req) 

print 'RESPONSE:', response 
print 'URL  :', response.geturl() 

headers = response.info() 
print 'DATE :', headers['date'] 
print 'HEADERS :' 
print '---------' 
print headers 

data = response.read() 
print 'LENGTH :', len(data) 
print 'DATA :' 
print '---------' 
print data 

をsnipetそれはすべて正常に動作しますが、私が得る結果は私に正しい結果を与えることを、私は直接WebブラウザにURL全体を入力すると表示されるものではありません。

誰かが私を助けてくれるのはどういう問題なのでしょうか? urllib2.Requestための第2のパラメータ(data)が設けられている場合

+1

その要求は私のために動作するようには思えません。これは、コードが実行されるときの '' 'url''の値です:[link](http://www.wakanow.com/ng/flights/SearchProcess.aspx?retYear=2011&airlinePref=&adults=1&searchType=D&retDay=11&retMonth = 12&arrvCode = ABV&deptDay = 10&trip = RT&deptMonth = 12&currency = NGN&deptCode = LOS&deptYear = 2011&infants = 0&deptTime =&children = 0&cabin = E)それはちょうどハングアップします。 (実際には私はサイトに接続できないようです。) – FakeRainBrigand

答えて

1

は次にurllib2.urlopen(req)POST要求を行います。

使用encodedいずれかのURL(GET)またはurllib2.RequestPOST)のようにdataないで、両方すなわち、

いずれかGET要求:

url = 'http://www.wakanow.com/ng/flights/SearchProcess.aspx?' + encoded 
req = urllib2.Request(url, headers=headers) #NOTE: no `encoded` 

またはPOST要求:

url = 'http://www.wakanow.com/ng/flights/SearchProcess.aspx' #NOTE: no `encoded` 
req = urllib2.Request(url, data=encoded, headers=headers) 
+0

申し訳ありませんが、私はあなたをよく理解していませんでした。私はちょうどurllib2.urlopen(URL)を直接使うべきですか? – TiOLUWA

+0

'urllib2.urlopen(url)'では、ヘッダを送ることができません。したがって、リクエストにヘッダーが必要ない場合は、先に進んでください。そうでない場合は、私の答えを確認してください。これには、使用する必要があるものがあります。 –

+0

@TiOLUWA:回答にconrecteの例を追加しました。 – jfs

2

あなたはおそらくしているお使いのブラウザではが表示されますが、コード内で実際にはPOSTというURLをクエリデータとし、クエリデータをPOSTデータとしています。あなたはたぶんGETをしたいだけです。

urllib2.Request(url[, data][, headers][, origin_req_host][, unverifiable])

this pageからのデータは、そのようなデータが必要でない場合は、サーバー、またはNoneに送信するために追加のデータを指定する文字列かもしれません。現在、HTTPリクエストはデータを使用する唯一のリクエストです。データ要求が提供されたときにHTTPリクエストはGETではなくPOSTになります。データは標準アプリケーション/ x-www-form-urlencoded形式のバッファでなければなりません。 urllib.urlencode()関数は2タプルのマッピングまたはシーケンスを取り、この形式の文字列を返します。

だから、あなたが本当に欲しいもの、である:

req = urllib2.Request(url, headers=headers)

0

このURLがハングします。あまり重い検索文字列で試してみてください。

そして、あなたはタイムアウトでこれを制御する検討することがあります。

import urllib,urllib2,socket 

timeout = 10 
socket.setdefaulttimeout(timeout) 
+0

私はサイトがダウンしていると思う、私は今すぐ直接私のブラウザを形成するサイトにアクセスすることはできません。 – TiOLUWA

+0

はい私もそうしなかった – soField

関連する問題