我正在试图从印度政府网上搜索数据Public Data Portal。首先,我需要提交一份表格来获取数据。
在上图中,您可以看到表单的屏幕截图。该表格允许您选择印度境内的州,州内的街区,街区内的街区以及街区内的村庄。在上图中,安达曼和尼科巴是一个州,尼科巴是一个区,坎贝尔湾是一个街区,Govindnagar是一个村庄。
我需要收集所有panchayats的数据。提交表单时发送的表单数据包含已选择的所有panchayat的复选框的值。有超过250,000个panchayats,几乎不可能手动完成。所以,我使用beautifulsoup来解析表单的html元素,以获得所有panchayat复选框的值。但是加载页面时不会加载有关panchayat级别的信息。当每个块展开时,页面在http://nregarep2.nic.in/netnrega/dynamic2/DynamicReport_new4.aspx/getGPs执行ajax发布。它获取有关panchayat的信息,然后将其呈现到页面。
现在,我正在尝试模拟ajax帖子以获取有关panchayats的信息但我收到错误。下图显示了网络活动。
我的代码:
import requests
s = requests.session()
request_headers = {
'Host': 'nregarep2.nic.in',
'Connection': 'keep-alive',
'Content-Length': '46',
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Origin': 'http://nregarep2.nic.in',
'X-Requested-With': 'XMLHttpRequest',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36',
'Content-Type': 'application/json; charset=UTF-8',
'Referer': 'http://nregarep2.nic.in/netnrega/dynamic2/dynamicreport_new4.aspx',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'en-US,en;q=0.9'
}
payload = {'state_code':'01', 'block_code':'0102003', 'year':'2013'}
getGPs = s.post('http://nregarep2.nic.in/netnrega/dynamic2/DynamicReport_new4.aspx/getGPs', data=payload, headers = request_headers)
print(getGPs.text)
我明白了:
{"Message":"There was an error processing the request.","StackTrace":"","ExceptionType":""}
我已经使用请求标头中存在的项目的各种组合更改了request_headers,但没有运气。
答案 0 :(得分:1)
您需要在现有脚本中稍微更改一下才能获得响应。请尝试使用data=json.dumps(payload)
代替data=payload
,如下所示:
import json
payload = {'state_code':'01', 'block_code':'0102003', 'year':'2013'}
getGPs = s.post('http://nregarep2.nic.in/netnrega/dynamic2/DynamicReport_new4.aspx/getGPs', data=json.dumps(payload), headers = request_headers)
#notice the payload parameter in the post request
它产生以下结果:
{"d":"{\"0102003001\":\"GOVINDNAGAR\",\"0102003002\":\"CAMPBELL BAY\",\"0102003003\":\"LAXMI NAGAR\",\"0102003004\":\"Great & Little Nicobar\"}"}