Jquery 抓取使用ajax的网页
我试图从印度政府那里收集数据。首先,我需要提交一份表格来获取数据 在上面的图片中,您可以看到表单的屏幕截图。该表格允许您选择印度境内的州、州内的地区、区内的街区和街区内的潘查雅特。在上图中,安达曼和尼科巴是一个州,尼科巴是一个区,坎贝尔湾是一个街区,戈文纳加尔是一个潘查亚特 我需要收集所有panchayats的数据。提交表单时发送的表单数据包含已选择的所有panchayat的复选框值。有超过250000个panchayats,几乎不可能手动完成。因此,我使用beautifulsoup解析表单的html元素,以获得所有panchayat的复选框的值。但在加载页面时,不会加载有关panchayat级别的信息。当每个块展开时,页面将在执行ajax post。它获取有关panchayat的信息,然后将其呈现到页面 现在,我试图模拟ajax post来获取关于panchayats的信息,但是我得到了一个错误。下图显示了网络活动 我的代码:Jquery 抓取使用ajax的网页,jquery,python,ajax,web-scraping,python-requests,Jquery,Python,Ajax,Web Scraping,Python Requests,我试图从印度政府那里收集数据。首先,我需要提交一份表格来获取数据 在上面的图片中,您可以看到表单的屏幕截图。该表格允许您选择印度境内的州、州内的地区、区内的街区和街区内的潘查雅特。在上图中,安达曼和尼科巴是一个州,尼科巴是一个区,坎贝尔湾是一个街区,戈文纳加尔是一个潘查亚特 我需要收集所有panchayats的数据。提交表单时发送的表单数据包含已选择的所有panchayat的复选框值。有超过250000个panchayats,几乎不可能手动完成。因此,我使用beautifulsoup解析表单的h
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。太好了,它能用。非常感谢。