POST请求始终返回“不允许的键字符”

时间:2016-12-28 16:25:39

标签: python beautifulsoup httprequest python-requests

我想从表格中检索大气颗粒物质值(遗憾的是该网站不是英文版,因此可以随意询问所有内容):我使用BeautifulSoup和GET请求的组合失败了{{ 1}},因为表以dinamically方式填充Bootstrap,而像requests这样的解析器找不到仍然必须插入的值。

使用Firebug我检查了页面的每个角度,我发现通过选择表格的不同日期,会发送一个POST请求(正如您在BeautifulSoup中看到的那样,该网站是{{ 1}},其中表是:)

Referer

使用以下参数:

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

答案中的数据采用JSON格式。

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

在参数中,除日期外,还需要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 :此处我发现此网站受CSRF vulnerability保护;为了在params中执行正确的查询,我需要一个CSRF令牌:这就是为什么我对站点执行GET请求(请参阅POST请求中的v_data_osservazione=26-12-2016&v_tipo_bollettino=regionale&v_zona=&csrf_test_name=b88d2517c59809a529 b6f8141256e6ca )并从cookie中获取CSRF令牌,如下所示:

csrf_test_name

在一天结束时,我的CSRF令牌和POST请求准备就绪,我发送它......状态代码为200,我总是得到Referer

寻找这个错误,我总是看到有关CodeIgniter的帖子,我认为这不是我需要的:我尝试了每个标头和参数的组合,但没有任何改变。在放弃r = get(url) csrf_token = r.cookies["csrf_cookie_name"] Disallowed Key Characters.并开始学习BeautifulSoup之前,我想弄清问题是什么:requests太高级别,低级别的库像SeleniumSelenium让我学到很多有用的东西,所以我更愿意继续学习这两个。

以下是代码:

BeautifulSoup

1 个答案:

答案 0 :(得分:1)

此代码适用于我:

  • 我使用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