gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:04:56 25 4
gpt4 key购买 nike

我正在尝试向 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()

最佳答案

您需要将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-AgentContent-Type header ;您添加的任何内容都不是可识别的 header 。

我确实注意到此页面上的 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')

关于python - 尝试使用 urllib.request 发送 POST 请求会返回相同的页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27066810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com