2017-12-22 9 views
0

저는 방금 파이썬에 대한 소개 과정을 마치고 약간의 프로젝트를 진행하고 있습니다. 목표는 단순히 웹 사이트에서 데이터를 추출하는 것입니다. 요청 라이브러리가 어떻게 작동하는지 배우려고하기 때문에 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을 사용하면 브라우저에서 페이지를 사용할 때 브라우저별로 요청을 볼 수 있습니다. 어쩌면 양식이나 쿠키에 다른 헤더 나 숨겨진 필드가 필요하거나 쿠키 또는 시간/타임 스탬프를 사용하는 다른 요청에서 일부 필드가 다른 값으로 채워지는 경우 일 수 있습니다. – furas

+0

세션을 사용하면 모든 요청에서 값을 변경할 수있는 숨겨진 필드의 첫 번째 쿠키 (세션 ID)와 값을 페이지에서 가져올 수 있습니다. – furas

답변

0

두 가지, 먼저 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

쿨, 고마워! 이것은 정말로 도움이되었습니다. –