gpt4 book ai didi

python - POST 请求始终返回 "Disallowed Key Characters"

转载 作者:太空宇宙 更新时间:2023-11-03 15:50:24 27 4
gpt4 key购买 nike

我想从表格中检索大气颗粒物值(遗憾的是该网站不是英文的,所以请随意询问所有内容):我失败了​​ BeautifulSoup 的组合并使用 requests 发送 GET 请求,因为表动态地填充了 Bootstrap 和类似 BeautifulSoup 的解析器。找不到仍必须插入的值。

使用 Firebug,我检查了页面的每个角度,发现通过选择表格的不同日期,会发送一个 POST 请求(如您在 Referer 中看到的,该站点是 http://www.arpat.toscana.it/temi-ambientali/aria/qualita-aria/bollettini/index/regionale/ ,表在哪里):

POST /temi-ambientali/aria/qualita-aria/bollettini/aj_dati_bollettini HTTP/1.1
Host: www.arpat.toscana.it
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
Referer: http://www.arpat.toscana.it/temi-ambientali/aria/qualita-aria/bollettini/index/regionale/26-12-2016
Content-Length: 114
Cookie: [...]
DNT: 1
Connection: keep-alive

具有以下参数:

v_data_osservazione=26-12-2016&v_tipo_bollettino=regionale&v_zona=&csrf_test_name=b88d2517c59809a529
b6f8141256e6ca

答案中的数据为 JSON 格式。

所以我开始制作我的个人 POST 请求,以便直接获取将填充表格的 JSON 数据。

在参数中,除了日期之外,还有 csrf_test_name是必需的:在这里我发现这个网站受到了 CSRF vulnerability 的保护;为了在参数中执行正确的查询,我需要一个 CSRF token :这就是为什么我对站点执行 GET 请求(请参阅 URL 的 POST 请求中的 Referer )并从 cookie 中获取 CSRF token ,如下所示:

r = get(url)
csrf_token = r.cookies["csrf_cookie_name"]

一天结束时,我的 CSRF token 和 POST 请求准备就绪,我将其发送...并且状态代码为 200,我总是得到 Disallowed Key Characters. !

在寻找此错误时,我总是看到有关 CodeIgniter 的帖子,(我认为)这不是我需要的:我尝试了 header 和参数的每种组合,但没有任何改变。在放弃之前BeautifulSouprequests并开始学习Selenium ,我想弄清楚问题是什么:Selenium级别太高,低级库如 BeautifulSouprequests让我学到很多有用的东西,所以我更愿意继续学习这两个。

代码如下:

from requests import get, post
from bs4 import BeautifulSoup
import datetime
import json

url = "http://www.arpat.toscana.it/temi-ambientali/aria/qualita-aria/bollettini/index/regionale/" # + %d-%m-%Y
yesterday = datetime.date.today() - datetime.timedelta(1)
date_object = datetime.datetime.strptime(str(yesterday), '%Y-%m-%d')
yesterday_string = str(date_object.strftime('%d-%m-%Y'))

full_url = url + yesterday_string
print("REFERER " + full_url)

r = get(url)
csrf_token = r.cookies["csrf_cookie_name"]
print(csrf_token)

# preparing headers for POST request
headers = {
"Host": "www.arpat.toscana.it",
"Accept" : "*/*",
"Accept-Language" : "en-US,en;q=0.5",
"Accept-Encoding" : "gzip, deflate",
"Content-Type" : "application/x-www-form-urlencoded; charset=UTF-8",
"X-Requested-With" : "XMLHttpRequest", # XHR
"Referer" : full_url,
"DNT" : "1",
"Connection" : "keep-alive"
}

# preparing POST parameters (to be inserted in request's body)
payload_string = "v_data_osservazione="+yesterday_string+"&v_tipo_bollettino=regionale&v_zona=&csrf_test_name="+csrf_token
print(payload_string)

# data -- (optional) Dictionary, bytes, or file-like object to send in the body of the Request.

# json -- (optional) json data to send in the body of the Request.
req = post("http://www.arpat.toscana.it/temi-ambientali/aria/qualita-aria/bollettini/aj_dati_bollettini",
headers = headers, json = payload_string
)

print("URL " + req.url)

print("RESPONSE:")
print('\t'+str(req.status_code))
print("\tContent-Encoding: " + req.headers["Content-Encoding"])
print("\tContent-type: " + req.headers["Content-type"])
print("\tContent-Length: " + req.headers["Content-Length"])
print('\t'+req.text)

最佳答案

这段代码对我有用:

  • 我使用request.Session()并且它保留所有cookie
  • 我使用 data= 而不是 json=
  • 最后我不需要所有带注释的元素
  • 比较我使用的浏览器请求和代码请求 Charles Web 调试代理应用程序

代码:

import requests
import datetime

#proxies = {
# 'http': 'http://localhost:8888',
# 'https': 'http://localhost:8888',
#}

s = requests.Session()
#s.proxies = proxies # for test only

date = datetime.datetime.today() - datetime.timedelta(days=1)
date = date.strftime('%d-%m-%Y')

# --- main page ---

url = "http://www.arpat.toscana.it/temi-ambientali/aria/qualita-aria/bollettini/index/regionale/"

print("REFERER:", url+date)

r = s.get(url)

# --- data ---

csrf_token = s.cookies["csrf_cookie_name"]

#headers = {
#'User-Agent': 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:50.0) Gecko/20100101 Firefox/50.0',
#"Host": "www.arpat.toscana.it",
#"Accept" : "*/*",
#"Accept-Language" : "en-US,en;q=0.5",
#"Accept-Encoding" : "gzip, deflate",
#"Content-Type" : "application/x-www-form-urlencoded; charset=UTF-8",
#"X-Requested-With" : "XMLHttpRequest", # XHR
#"Referer" : url,
#"DNT" : "1",
#"Connection" : "keep-alive"
#}

payload = {
'csrf_test_name': csrf_token,
'v_data_osservazione': date,
'v_tipo_bollettino': 'regionale',
'v_zona': None,
}

url = "http://www.arpat.toscana.it/temi-ambientali/aria/qualita-aria/bollettini/aj_dati_bollettini"
r = s.post(url, data=payload) #, headers=headers)

print('Status:', r.status_code)
print(r.json())

代理:

enter image description here

enter image description here

关于python - POST 请求始终返回 "Disallowed Key Characters",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41365999/

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