2014-11-21 58 views
1

我试图发送POST请求到this site以在其数据库中执行搜索,但它只是返回相同的页面,而不是页面I正在寻找。如果我尝试使用我的参数访问该网站,它会拒绝我的请求。我觉得我错过了一些东西,也许有人可以帮助我。尝试使用urllib.request发送POST请求返回相同的页面

import urllib.request 

from bs4 import BeautifulSoup 

DATA = urllib.parse.urlencode({'plz_ff': 50000, 'plz_ff2': 50030}) 
DATA = DATA.encode('utf-8') 

request = urllib.request.Request("http://www.altenheim-adressen.de/schnellsuche/index.cfm", 'POST') 
# adding charset parameter to the Content-Type header. 
request.add_header("text/html;charset=UTF-8","application/x-www-form-urlencoded;charset=utf-8Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:33.0) Gecko/20100101 Firefox/33.0") 
f = urllib.request.urlopen(request, DATA) 

soup = BeautifulSoup(f) 

print(soup.prettify) 

f.close() 
soup.close 

编辑2:现在的代码工作,非常感谢。我不得不调整搜索参数来寻找suche1.cfm,现在它返回我正在寻找的结果。这是成品:

import urllib.request 

from bs4 import BeautifulSoup 

params = { 
'name_ff': '', 
'strasse_ff': '', 
'plz_ff': 50000, 
'plz_ff2': 50030, 
'ort_ff': '', 
'bundesland_ff': '', 
'land_ff': '', 
'traeger_ff': '', 
'Dachverband_ff': '', 
'submit2' : 'Suchen' 
} 

DATA = urllib.parse.urlencode(params) 
DATA = DATA.encode('utf-8') 

request = urllib.request.Request(
"http://www.altenheim-adressen.de/schnellsuche/suche1.cfm", 
DATA) 
# adding charset parameter to the Content-Type header. 
request.add_header("Content-Type", "application/x-www-form-urlencoded;charset=utf-8") 
request.add_header("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:33.0) Gecko/20100101 Firefox/33.0") 
f = urllib.request.urlopen(request) 

soup = BeautifulSoup(f) 

print(soup.prettify) 

f.close() 
+0

'soup.close'什么也不做(它搜索名为标签''),但你不不需要关闭BeautifulSoup树。 'soup.prettify()'需要被*调用*。 – 2014-11-21 17:24:25

+0

啊,是的,谢谢。 – 2014-11-21 18:18:10

回答

1

您需要添加DATARequest对象;您现在将发送文字'POST'作为发布主体。

正确的方法是:

request = urllib.request.Request(
    "http://www.altenheim-adressen.de/schnellsuche/index.cfm", 
    DATA) 
# adding charset parameter to the Content-Type header. 
request.add_header("Content-Type", "application/x-www-form-urlencoded;charset=utf-8") 
request.add_header("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:33.0) Gecko/20100101 Firefox/33.0") 
f = urllib.request.urlopen(request) 

请注意,我还添加了用户代理内容类型头那里。无论你添加的是不是一个可识别的标题。

我注意到这个页面上的2个窗体使用了不同的目标;无论职位,以index.cfm

>>> for form in soup.find_all('form'): 
...  print(form.attrs.get('action')) 
... 
suche1.cfm 
suche1b.cfm 

所以如果你希望使用这些形式,你需要在这里使用了正确的目标URL一个。您还需要验证您的POST表单字段;我发现发布到suche1b.cfm的表单有类似的表单字段,但它们使用的是plz_ffbplz_ff2b,而不是plz_ffplz_ffb

你可能也想送所有表单域,即使空字符串:

params = { 
    'name_ffb': '', 
    'ort_ffb': '', 
    'strasse_ffb': '', 
    'plz_ffb': '50000', 
    'plz_ff2b': '50030', 
    'land_ff': '', 
    'rubrik_ff': '', 
    'submit22': 'Suchen' 
} 
DATA = urllib.parse.urlencode(params) 
DATA = DATA.encode('utf-8') 
+0

感谢您的快速回答。我用你的代码替换了我的代码,并试图发布到'suche1.cfm'和'suche1b.cfm',但它返回一个HTTP 500错误。 – 2014-11-21 17:47:18

+0

@FreshPrince:或许他们也期待其他领域至少有空值? – 2014-11-21 17:49:39

+0

@FreshPrince:传入所有字段产生200 OK响应。 – 2014-11-21 17:58:49