在 jsdom 中触发触发 POST 请求的 onclick 事件
Firing onclick event which triggers a POST request in jsdom
我正在尝试抓取 poorly designed governmental website,它使用从 JavaScript 触发的 POST 请求进行导航(我正在尝试导航日历)。
我正在尝试以优雅的方式做到这一点,在节点中使用 jsdom 和 jQuery(可能还有 jsdom-simulant),但我不确定我是否理解我应该如何做在模拟器中触发事件,假设事件本身应该返回到 jsdom 并触发新的 HTTP POST 请求。
我不希望你们为我编写代码,我只需要一些关于结构、原理或执行类似操作的现有代码库的指示。
关于抓取部分,这是一个POST请求发送表单url编码数据。有效负载中有 2 个字段似乎是必需的:
- __EVENTTARGET=ctl00$B_Center$VoturiPlen1$calVOT
- __EVENTARGUMENT=XXXX(XXXX 有一些值)
__EVENTARGUMENT
值每天都在递增。例如,在 04/04/2018 上是 6668,在 05/04/2018 上是 6669。查看最早的日期 01/01/1998,索引为 -730,因此可以使用差值计算该索引在目标日期和 01/01/1998 之间的天数减去 730
target_date="2018-04-04"
index=$(($(dateutils.ddiff 1998-01-01 "$target_date") - 730))
curl 'https://www.senat.ro/Voturiplen.aspx' \
-H 'User-Agent: Mozilla' \
-H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \
--data "__EVENTTARGET=ctl00%24B_Center%24VoturiPlen1%24calVOT&__EVENTARGUMENT=$index"
并使用 pup html 解析器:
curl 'https://www.senat.ro/Voturiplen.aspx' \
-H 'User-Agent: Mozilla' \
-H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \
--data "__EVENTTARGET=ctl00%24B_Center%24VoturiPlen1%24calVOT&__EVENTARGUMENT=$index" | \
pup 'table#ctl00_B_Center_VoturiPlen1_GridVoturi'
使用nodejs you can use node-request, moment:
const request = require('request');
const moment = require('moment');
const jsdom = require("jsdom");
const {JSDOM} = jsdom;
var a = moment('21/12/2017', 'DD/MM/YYYY');
var b = moment('01/01/1998', 'DD/MM/YYYY');
var index = a.diff(b, 'days') - 730;
request.post({
url: 'https://www.senat.ro/Voturiplen.aspx',
form: {
"__EVENTTARGET": "ctl00$B_Center$VoturiPlen1$calVOT",
"__EVENTARGUMENT": index
},
headers: {
'User-Agent': 'Mozilla'
}
},
function(err, httpResponse, body) {
const dom = new JSDOM(body);
var table = dom.window.document.querySelector("#ctl00_B_Center_VoturiPlen1_GridVoturi");
console.log(table.textContent);
});
检查this post for date diff with moment
我正在尝试抓取 poorly designed governmental website,它使用从 JavaScript 触发的 POST 请求进行导航(我正在尝试导航日历)。
我正在尝试以优雅的方式做到这一点,在节点中使用 jsdom 和 jQuery(可能还有 jsdom-simulant),但我不确定我是否理解我应该如何做在模拟器中触发事件,假设事件本身应该返回到 jsdom 并触发新的 HTTP POST 请求。
我不希望你们为我编写代码,我只需要一些关于结构、原理或执行类似操作的现有代码库的指示。
关于抓取部分,这是一个POST请求发送表单url编码数据。有效负载中有 2 个字段似乎是必需的:
- __EVENTTARGET=ctl00$B_Center$VoturiPlen1$calVOT
- __EVENTARGUMENT=XXXX(XXXX 有一些值)
__EVENTARGUMENT
值每天都在递增。例如,在 04/04/2018 上是 6668,在 05/04/2018 上是 6669。查看最早的日期 01/01/1998,索引为 -730,因此可以使用差值计算该索引在目标日期和 01/01/1998 之间的天数减去 730
target_date="2018-04-04"
index=$(($(dateutils.ddiff 1998-01-01 "$target_date") - 730))
curl 'https://www.senat.ro/Voturiplen.aspx' \
-H 'User-Agent: Mozilla' \
-H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \
--data "__EVENTTARGET=ctl00%24B_Center%24VoturiPlen1%24calVOT&__EVENTARGUMENT=$index"
并使用 pup html 解析器:
curl 'https://www.senat.ro/Voturiplen.aspx' \
-H 'User-Agent: Mozilla' \
-H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \
--data "__EVENTTARGET=ctl00%24B_Center%24VoturiPlen1%24calVOT&__EVENTARGUMENT=$index" | \
pup 'table#ctl00_B_Center_VoturiPlen1_GridVoturi'
使用nodejs you can use node-request, moment:
const request = require('request');
const moment = require('moment');
const jsdom = require("jsdom");
const {JSDOM} = jsdom;
var a = moment('21/12/2017', 'DD/MM/YYYY');
var b = moment('01/01/1998', 'DD/MM/YYYY');
var index = a.diff(b, 'days') - 730;
request.post({
url: 'https://www.senat.ro/Voturiplen.aspx',
form: {
"__EVENTTARGET": "ctl00$B_Center$VoturiPlen1$calVOT",
"__EVENTARGUMENT": index
},
headers: {
'User-Agent': 'Mozilla'
}
},
function(err, httpResponse, body) {
const dom = new JSDOM(body);
var table = dom.window.document.querySelector("#ctl00_B_Center_VoturiPlen1_GridVoturi");
console.log(table.textContent);
});
检查this post for date diff with moment