2017-12-22 14 views
0

私はちょうどPythonのイントロコースを終え、小さなプロジェクトに取り組んでいます。目標は単にWebサイトからデータを抽出することです。リクエストライブラリの仕組みを学びたいので、SeleniumやMechanizeなどのライブラリの使用は避けています。以下は私のコードです。Pythonで投稿する

s = requests.Session() 
url = 'https://services2.hdb.gov.sg/webapp/BB33RTIS/BB33SSearchWidget' 
data = {'FLAT_TYPE':'03', 
     'NME_NEWTOWN':'AMK+++++Ang+Mo+Kio', 
     'NME_STREET':'', 
     'NUM_BLK_FROM':'', 
     'NUM_BLK_TO':'', 
     'dteRange':'12', 
     'DTE_APPROVAL_FROM':'Dec+2015', 
     'DTE_APPROVAL_TO':'Dec+2017+', 
     'AMT_RESALE_PRICE_FROM':'', 
     'AMT_RESALE_PRICE_TO':'', 
     'Process':'continue', 
     'null':'null' 
     } 

userAgent = {'User-Agent':'Mozilla/5.0','Referer':'https://services2.hdb.gov.sg/webapp/BB33RTIS/BB33PReslTrans.jsp'} 

page = s.post(url,data=data,headers=userAgent).content 
print(page) 
s.close() 

しかし、これは私の代わりにフォームのコードを与えるようです。この結果は、データが含まれていなくても変更されないため、データが正しくポストされていないと見なします。調べると、ページにクエリ文字列パラメータがないことがわかりましたが、代わりに 'フォームデータ'と呼ばれるものがあります。私はどのようにこれにパラメータを投稿するか分からない。誰かが私を正しい方向に向けるのに十分な親切な人ですか?

+0

Chrome/FirefoxでDevToolを使用して、ブラウザでページを使用するときにブラウザでリクエストを表示します。たぶんフォームやクッキーに他のヘッダーや隠しフィールドが必要な場合や、Cookieや時間/タイムスタンプを使用して別のリクエストで異なるフィールドに値が入力されるフィールドがあります。 – furas

+0

セッションを使用する場合は、最初にgey cookie(セッションID)と隠されたフィールドの値を取得して、すべてのリクエストで値を変更できます。 – furas

答えて

0

2つのことは、まずPOSTは、クッキーなど

import requests 
from bs4 import BeautifulSoup 

s = requests.Session() 
url = 'https://services2.hdb.gov.sg/webapp/BB33RTIS/BB33SSearchWidget' 

data = {'USER_PROFILE': '2', 
     'FLAT_TYPE': '03', 
     'NME_NEWTOWN': 'AMK  Ang Mo Kio', 
     'NME_STREET': '', 
     'NUM_BLK_FROM': '', 
     'NUM_BLK_TO': '', 
     'dteRange': '12', 
     'DTE_APPROVAL_FROM': 'Dec 2015', 
     'DTE_APPROVAL_TO': 'Dec 2017', 
     'AMT_RESALE_PRICE_FROM': '', 
     'AMT_RESALE_PRICE_TO': '', 
     'Process': 'continue', 
     'null': 'null' 
     } 

userAgent = {'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0', 
      'Referer': 'https://services2.hdb.gov.sg/webapp/BB33RTIS/BB33PReslTrans.jsp'} 

s.get(url, headers=userAgent) 
page = s.post(url, data=data, headers=userAgent) 
# print(page.text) 
s.close() 


# just to check 
soup = BeautifulSoup(page.text, 'lxml') 
for tr in soup.find_all('tr', {'height': '30'}): 
    print (tr.text) 

出力セットアップする前に、第二に、あなたがGETを実行する必要がありますする必要はありませんので、POSTデータをフォームには、encodeds要求:

220 
 Ang Mo Kio Ave 1 
10 to 12 
67.00New Generation 
1977 
58 years 
$280,000.00 
Dec 2017 


225 
 Ang Mo Kio Ave 1 
07 to 09 
82.00New Generation 
1978 
59 years 
$350,000.00 
Dec 2017 

... 
+0

ああねえ!ありがとう。ここ数日はこれをやろうとしています...私がURLを取得すると、いくつかのことが明らかになりますが、それはすべてのクッキーと一緒にページをロードします。ブラウザ?どのような場合には、私は変数に格納してそれをポストリクエストに渡す必要なくセッションを保存しますか?私はまだ要求を完全に理解していないように見えます。しかし、助けてくれてありがとう! –

+0

はい、URLでGETを使用すると、ブラウザのページに行くようなものになります。クッキーは要求セッションオブジェクトによって自動的に設定および保存されます。 POSTを実行すると、フォームを送信するようなものになります。リクエストセッションでは、以前のリクエストから得たクッキーが自動的に渡されます。 –

+0

クール、ありがとう!これは本当に助けになりました。 –

関連する問題