【问题标题】:Get location from response header从响应头获取位置
【发布时间】:2016-08-04 22:13:48
【问题描述】:

我正在尝试使用 python 的请求模块从 POST 请求中获取 Location 值。但是,当我查看响应的标题时,我没有看到任何这样的键。使用 Google Chrome 执行相同的请求确实会显示密钥。

这是我尝试从以下位置下载数据的地方:https://data.police.uk/data .在 Google Chrome 中启动它并打开开发者工具。当您选择日期范围时,选择一些力并单击Generate File,您可以看到在响应标头中使用Location 键发出POST 请求。

import requests
from urlparse import urlparse, urljoin

BASE = 'https://data.police.uk'
FORM_PATH = 'data'

form_url = urljoin(BASE, FORM_PATH)

# Get data download URL
client = requests.session()
try:
    client.get(form_url)
except requests.exceptions.ConnectionError as e:
    print (e)
    sys.exit()

csrftoken = client.cookies.values()

l = [('forces', 'cleveland')]
t = ('csrfmiddlewaretoken', csrftoken[0])

d_from = ('date_from', '2014-05')
d_to = ('date_to', '2016-05')
l.extend((t, d_from, d_to))

r = client.post(form_url, headers=dict(Referer=form_url), data=l)

查询响应头给了我:

In [4]: r.headers
Out[4]: {'Content-Length': '4332', 'Content-Language': 'en-gb', 'Content-Encoding': 'gzip', 'Set-Cookie': 'csrftoken=aGQ7kO4tQ2cPD0Fp2svxxYBRe4rAk0kw; expires=Thu, 03-Aug-2017 22:11:44 GMT; Max-Age=31449600; Path=/', 'Vary': 'Cookie, Accept-Language', 'Server': 'nginx', 'Connection': 'keep-alive', 'Date': 'Thu, 04 Aug 2016 22:11:44 GMT', 'Content-Type': 'text/html; charset=utf-8'}

问题:如何从响应标头中获取Location 键?

编辑

答案:必须指定l.append(['include_crime', 'on'])。在此之后工作。

【问题讨论】:

  • 您是否检查了响应的正文?它通常包含请求的数据。
  • @trans1st0r : 如何从请求数据的正文中获取响应标头?
  • 我知道在哪里查找文档;我的评论更多地是关于从请求的数据中获取响应标头的概念对我来说没有多大意义。
  • 我的意思是当你通过 http 请求数据时,你会得到一个包含标题部分和正文部分的响应。您需要的信息更有可能在似乎是r.content 的正文中。你试过输出 r.content 吗?

标签: python python-requests


【解决方案1】:

编辑2

您还需要传递include_crime = on 语句,因为您没有选择任何数据集。在网页上,如果您不选择任何复选框,您将获得相同的页面并且您不会获得任何位置标题。这就是为什么您的 r.content 有“请至少选择一个数据集”。

【讨论】:

  • 不,为您进行 CSRF 验证... CSRF verification failed. Request aborted... 使用正确的 CSRF 令牌,我认为 robots.txt 没有任何问题
  • 它没有用,我给了一个合适的令牌老兄,已将我的程序附加为编辑
  • 你能发布你的 r.content
  • 您还需要传递 include_crime = on 语句,因为您没有选择任何数据集。在网页上,如果您不选择任何复选框,您将获得相同的页面并且您不会获得任何位置标题。这就是为什么您的 r.content 有“请选择至少一个数据集”,您可以执行 Ctrl-F 来搜索它。这就是我修改代码以包含该参数的原因,而 r.content 是我在将所有参数正确发布到表单后得到的。
  • 在我指定l.append(['include_crime', 'on']) 后它可以工作。我不确定为什么你的仍然失败。
猜你喜欢
  • 1970-01-01
  • 2012-06-28
  • 2023-01-12
  • 2020-01-02
  • 2016-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-10
相关资源
最近更新 更多