const jsdom = require("jsdom"); const { JSDOM } = jsdom;
為了使用 jsdom,主要用到jsdom主模塊的一個命名導出的jsdom構造函數。往構造器傳遞一個字符串,將會得到一個 jsdom 構造實例對象,這個對象有很多實用的屬性,特別是window對象:
const dom = new JSDOM(`<!DOCTYPE html><p>Hello world</p>`);
console.log(dom.window.document.querySelector("p").textContent); // "Hello world"
const dom = new JSDOM(``, {
url: "https://example.org/",
referrer: "https://example.com/",
contentType: "text/html",
userAgent: "Mellblomenator/9000",
includeNodeLocations: true
});
完整用法,此處以
http://match.yuanrenxue.com/match/2"為例
// 導入jsdom
jsdom = require('jsdom')
// 生成jsdom對象
const {JSDOM} = jsdom;
// 倒入讀寫js的包
const fs = require('fs')
// 對1.html進行對去操作
fs.readFile('./1.html', 'utf8', function (err, data) {
//定制jsdom,data一般是js代碼,由於安全策略的原因導致無法自動加載script標簽
//需要開啟安全策略的開關,runScripts: "dangerously"
//js代碼直接寫入會報錯。所以一般在本地新建個html文件,像剛剛的1。html,然后用fs.readFile進行讀取操作
const dom = new JSDOM(data
,
{
url: "http://match.yuanrenxue.com/match/2",
referrer: "http://match.yuanrenxue.com/match/2",
contentType: "text/html",
userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36",
includeNodeLocations: true,
runScripts: "dangerously",
}
)
console.log(dom.window.document.cookie);
dom.window.close()
})
其中的 ./1.html是該網站第一次加載生成cookie的js代碼,由於直接放在js文件里會報錯,所以把他放在html里進行導入
這種圖片的報錯一般都是reload函數的報錯,可以不用管,也可以 在js代碼里面找到location.reload進行刪除就好了,沒有影響 
// 導入jsdom
const jsdom = require('jsdom')
// 生成jsdom對象
const { JSDOM } = jsdom;
// 倒入讀寫js的包
const fs = require('fs')
options={
url: "http://match.yuanrenxue.com/match/2",
referrer: "http://match.yuanrenxue.com/match/2",
contentType: "text/html",
userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36",
includeNodeLocations: true,
runScripts: 'dangerously',
cookieJar:new jsdom.CookieJar(),
beforeParse(window) {
window.alert();
window.setInterval = function (s, b) {
eval(s)
}
//重寫之后進行偽裝
window.setInterval.toString = function () {
"function setInterval() { [native code] }"
}
window.setTimeout = function (s, b) {
eval(s)
}
window.setTimeout.toString = function () {
"function setTimeout() { [native code] }"
}
},
}
// 提前植入setcookie的操作
options.cookieJar.setCookie(cookie,url,function(val){})
// 對1.html進行對去操作
fs.readFile('./1.html', 'utf8', function (err, data) {
//定制jsdom,data一般是js代碼,由於安全策略的原因導致無法自動加載script標簽
//需要開啟安全策略的開關,runScripts: "dangerously"
//js代碼直接寫入會報錯。所以一般在本地新建個html文件,像剛剛的1。html,然后用fs.readFile進行讀取操作
const dom = new JSDOM(data
,
options
)
console.log(dom.window.document.cookie);
//將dom窗口關閉
dom.window.close()
})
