Skip to main content
 首页 » 编程设计

jquery之抓取使用ajax的网页

2025年01月19日30jirigala

我正在尝试从印度政府网络抓取数据 Public Data Portal .首先我需要提交一个表单来获取数据。

在上图中你可以看到表格的截图。该表格允许您选择印度内的邦、邦内的地区、地区内的街区和街区内的村委会。上图中,Andaman and Nicobar 是一个州,Nicobar 是一个区,Campbell Bay 是一个街区,Govindnagar 是一个 panchayat。

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

现在,我正在尝试模拟 ajax post 以获取有关 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":""} 

我已经用请求 header 中存在的项目的各种组合更改了 request_headers,但没有成功。

请您参考如下方法:

您需要对现有脚本稍作更改才能获得响应。尝试使用 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\"}"}