我想从表格中检索大气颗粒物质值(遗憾的是该网站不是英文版,因此可以随意询问所有内容):我使用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
太高级别,低级别的库像Selenium
和Selenium
让我学到很多有用的东西,所以我更愿意继续学习这两个。
以下是代码:
BeautifulSoup
答案 0 :(得分:1)
此代码适用于我:
request.Session()
并保留所有Cookie data=
代替json=
代码:
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())
代理: