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