请求 - 在发出请求前确定参数化的URL,以便在引用头中包含

2024-04-26 17:20:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我用Python编写一个特殊的访问请求的Python脚本。出于“安全原因”,该网站要求提供与请求URL匹配的Referer header。URL是根据paramsdict中的许多项构建的,传递给请求.post(). 在

在发出请求之前,有没有一种方法可以确定请求将使用的URL是什么,以便Referer头可以设置为这个正确的值?假设我有很多参数:

params = { 'param1' : value1, 'param2' : value2, # ... etc
  }

base_url = "http://example.com"
headers = { 'Referer' : url }   # but what is 'url' to be?
requests.post(base_url, params=params, headers=headers)  # fails as Referer does not match final url

我想一个解决方法是发出请求,然后查看URL是什么。然而,这有两个问题-1。这会给脚本的执行时间增加很大的开销,因为这样的请求会很多,2。实际上,这并不是一个有用的解决方法,因为服务器实际上会将请求重定向到另一个URL,因此之后读取它并不能给出正确的Referer值。在

我想指出的是,这个脚本是用urllib/urllib2编写的,我试图用请求来编写它,看看它是否可行,也许更简单。这不是脚本必须遵循的复杂过程,但它可能稍微超出了请求的范围。没关系,我只是想确认一下这是真的。在


Tags: 方法脚本urlbase参数网站原因params
2条回答

看起来您在请求中正确地找到了prepare\u request功能。在

但是,如果你还想用你最初的方法,我相信你可以用你的基本网址作为你的推荐人:

base_url = "http://example.com"
headers = { 'Referer' : base_url }
requests.post(base_url, params=params, headers=headers)

我怀疑这是因为你的帖子里有直接附加到基本网址的参数。例如,如果您在:

^{pr2}$

在这篇文章中添加一些参数,您可以使用:

referer = "http://www.example.com/trying-to-send-something/"
headers = { 'Referer' : referer, 'Host' : 'example.com' }
requests.post(referer, params=params, headers=headers)

添加

在您创建了URL字符串之后,我将使用一个简单的语句来直观地检查我的URL:

print(post_url)

如果这是好的,您应该打印出来自您要发布到的服务器的答复的详细信息,因为它还可能会给您一些提示,说明您的查询被拒绝的原因:

s = requests.post(referer, params=params, headers=headers)
print(s.status_code)
print(s.text)

很高兴听到这是否对你有用。在

我想我找到了一个基于Prepared Requests的解决方案。其概念是,Session.prepare_request()将执行所有准备请求的操作,但发送请求除外,这允许我的脚本读取准备好的请求的url,该url现在包含了顺序由dict顺序决定的参数。然后它可以适当地设置Referer头,然后发出原始请求。在

params = {'param1' : value1, 'param2' : value2, # ... etc
         }
url = "http://example.com"

# Referer must be correct
# To determine correct Referer url, prepare a request without actually sending it
req = requests.Request('POST', url, params=params)
prepped = session.prepare_request(req)
#r = session.send(prepped)   # don't actually send it

# add the Referer header by examining the prepared url
headers = { 'Referer': prepped.url }

# now send normally
r = session.post(url, params=params, data=data, headers=headers)

相关问题 更多 >