尝试使用urllib.request发送POST请求将返回相同的页面

时间:2014-11-21 17:16:15

标签: python

我尝试向this site发送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

EDIT2:“守则”现在有效,非常感谢。我必须将搜索参数调整为地址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()

1 个答案:

答案 0 :(得分:1)

您需要将DATA添加到Request对象;您现在正在发送文本'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)

请注意,我还在那里添加了 User-Agent Content-Type 标头;无论你添加什么都不是一个可识别的标题。

我注意到此页面上的2个表单使用不同的目标;既不发布到index.cfm

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

因此,如果您希望使用其中一种表单,则需要在此处使用正确的目标网址。您还需要验证您的POST表单字段;我看到发布到suche1b.cfm的表单包含类似的表单字段,但它们使用plz_ffbplz_ff2b,而不是plz_ff和{{1} }。

您可能还想发送所有表单字段,即使是空字符串:

plz_ffb