Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 抓取使用ajax的网页_Jquery_Python_Ajax_Web Scraping_Python Requests - Fatal编程技术网

Jquery 抓取使用ajax的网页

Jquery 抓取使用ajax的网页,jquery,python,ajax,web-scraping,python-requests,Jquery,Python,Ajax,Web Scraping,Python Requests,我试图从印度政府那里收集数据。首先,我需要提交一份表格来获取数据 在上面的图片中,您可以看到表单的屏幕截图。该表格允许您选择印度境内的州、州内的地区、区内的街区和街区内的潘查雅特。在上图中,安达曼和尼科巴是一个州,尼科巴是一个区,坎贝尔湾是一个街区,戈文纳加尔是一个潘查亚特 我需要收集所有panchayats的数据。提交表单时发送的表单数据包含已选择的所有panchayat的复选框值。有超过250000个panchayats,几乎不可能手动完成。因此,我使用beautifulsoup解析表单的h

我试图从印度政府那里收集数据。首先,我需要提交一份表格来获取数据

在上面的图片中,您可以看到表单的屏幕截图。该表格允许您选择印度境内的州、州内的地区、区内的街区和街区内的潘查雅特。在上图中,安达曼和尼科巴是一个州,尼科巴是一个区,坎贝尔湾是一个街区,戈文纳加尔是一个潘查亚特

我需要收集所有panchayats的数据。提交表单时发送的表单数据包含已选择的所有panchayat的复选框值。有超过250000个panchayats,几乎不可能手动完成。因此,我使用beautifulsoup解析表单的html元素,以获得所有panchayat的复选框的值。但在加载页面时,不会加载有关panchayat级别的信息。当每个块展开时,页面将在执行ajax post。它获取有关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":""}

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

您需要在现有脚本中稍作更改以获得响应。尝试
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\"}"}

你没有错过饼干吗?尝试在浏览器的开发者工具(如Chrome)的“网络”选项卡中使用“复制为卷曲”选项。使用无头浏览器呈现页面,让ajax填充itHey@spacediver,我的理解是sessions会处理这个问题。不管怎样,我试过了,但还是得到了同样的信息。charlietfl,让我试试。有时候重建每一个请求都很重要。尝试复制为cURL并在控制台中实际执行此请求。你会得到想要的结果吗?你应该。然后将这条卷曲线翻译成python。这将使您能够最准确地重建浏览器的功能(而不必像@charlietfl所建议的那样对实际浏览器进行重载),您是否尝试过这个脚本?你的反馈是什么@krish?嗨@Shahin。刚醒来:D。太好了,它能用。非常感谢。