刮刮使用ajax的网页

时间:2018-01-09 20:44:08

标签: jquery python ajax web-scraping python-requests

我正在试图从印度政府网上搜索数据Public Data Portal。首先,我需要提交一份表格来获取数据。 enter image description here

在上图中,您可以看到表单的屏幕截图。该表格允许您选择印度境内的州,州内的街区,街区内的街区以及街区内的村庄。在上图中,安达曼和尼科巴是一个州,尼科巴是一个区,坎贝尔湾是一个街区,Govindnagar是一个村庄。

我需要收集所有panchayats的数据。提交表单时发送的表单数据包含已选择的所有panchayat的复选框的值。有超过250,000个panchayats,几乎不可能手动完成。所以,我使用beautifulsoup来解析表单的html元素,以获得所有panchayat复选框的值。但是加载页面时不会加载有关panchayat级别的信息。当每个块展开时,页面在http://nregarep2.nic.in/netnrega/dynamic2/DynamicReport_new4.aspx/getGPs执行ajax发布。它获取有关panchayat的信息,然后将其呈现到页面。

现在,我正在尝试模拟ajax帖子以获取有关panchayats的信息但我收到错误。下图显示了网络活动。 enter image description here

我的代码:

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,但没有运气。

1 个答案:

答案 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\"}"}