jquery - 抓取使用ajax的网页

标签 jquery python ajax web-scraping python-requests

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

在上图中你可以看到表格的截图。该表格允许您选择印度内的邦、邦内的地区、地区内的街区和街区内的村委会。上图中,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 的信息,但出现错误。下图显示了网络事件。 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":""}

我已经用请求 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\"}"}

关于jquery - 抓取使用ajax的网页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48176377/

相关文章:

javascript - Ext JS 4.2 分页组合 - 如何跳到页面

javascript - 隐藏或显示数据属性的特定值的所有 div

jquery - 多个 Image 对象放入 jQuery 选择器中?

javascript - 在不更改 DOM 的情况下在 Javascript 中呈现 HTML

javascript - 动态构建列表(取决于复选框)

python - 如何将破折号托管网页变成单个静态 html 页面?

python - 在两个数据框中按日期标记

python - 是否可以在 sqlalchemy 中自动设置一些列

javascript - 将 50,000 多个字符的 JSON 字符串解析为 javascript 对象

javascript - 使用远程 : true from . js 文件