node.js - 使用 Node 和 Python 对页面源进行哈希处理时的区别
问题描述
目标: 对页面源进行哈希处理,以检测计划抓取之间的变化。
Python代码:
import requests
import hashlib
url = 'http://example.org/'
r = requests.get(url, verify=False,)
r.encoding = 'utf-8'
print(hashlib.sha256(r.text.encode('utf-8')).hexdigest())
结果:ea8fac7c65fb589b0d53560f5251f74f9e9b243478dcb6b3ea79b5e36449c8d9
节点和 Puppeteer 代码:
const puppeteer = require('puppeteer');
var crypto = require('crypto');
(async()=> {
const browser= await puppeteer.launch();
const page= await browser.newPage();
try {
const response = await page.goto('http://example.org/', { waitUntil: 'domcontentloaded', timeout: 30000 });
console.log(crypto.createHash('sha256').update(response.text().toString()).digest('hex'));
} catch (e) {
console.log(e.message);
}
await browser.close();
})();
结果:b4e6060006b920bc021110ea8ab8d67744983e2b7ff75e1c8be5613af93f687d
问题:
为什么有区别?据我检查,两种方法都返回相同的响应。
我能得到同样的结果吗?
有没有更好的方法来检测页面内容的变化?
解决方案
您需要在 puppeteer 中等待响应文本,否则您正在对字符串化版本进行哈希处理Promise { <pending> }
const puppeteer = require('puppeteer');
var crypto = require('crypto');
(async()=> {
const browser= await puppeteer.launch();
const page= await browser.newPage();
try {
const response = await page.goto('http://example.org/', { waitUntil: 'domcontentloaded', timeout: 30000 });
const source = await response.text();
console.log(crypto.createHash('sha256').update(source).digest('hex'));
} catch (e) {
console.log(e.message);
}
await browser.close();
})();
输出:
python c.py
ea8fac7c65fb589b0d53560f5251f74f9e9b243478dcb6b3ea79b5e36449c8d9
node c.js
ea8fac7c65fb589b0d53560f5251f74f9e9b243478dcb6b3ea79b5e36449c8d9
推荐阅读
- laravel - 在 laravel 中注册用户时,它也会在后台自动注册 chamilo
- c# - C# CS1737 来自接口方法
- split - 在拆分重叠时拆分 [RAKU]
- java - Java 使用正则表达式从字符串中删除文本
- node.js - 在nestJs中模拟Date.Now toHaveBeenCalledWith
- java - 在 CentO 上运行 Selenium 框架
- zurb-foundation - 重新加载时会发生什么,但在角度导航中不会发生什么?
- java - 使用正则表达式检查输入
- python - 如何更改 MAC cmd 中的默认 python3 路径?
- php - 注意:未定义的属性:第 89 行 [...]opensondage\fonctions.php 中的 ADOFetchObj::$date_fin