在Python中发布

时间:2017-12-22 09:19:32

标签: python python-3.x web-scraping python-requests

我刚刚完成了python的入门课程,正在开展一个小项目。目标只是从网站中提取数据。我正在避免使用Selenium和Mechanize等库,因为我正在尝试了解请求库的工作原理。以下是我的代码。

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()

但这似乎给了我代码的代码。即使我不包含数据,此结果也不会更改,因此我假设数据未正确发布。在检查时,我看到页面没有查询字符串参数,而是有一个名为“表单数据”的东西。我不确定如何将参数发布到此。有人会善意地指出我正确的方向吗?

1 个答案:

答案 0 :(得分:0)

两件事,首先是请求表单编码POST数据,因此您不需要在POST之前执行GET以设置cookie等。

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)

输出:

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

...