首页 > 解决方案 > 使用 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

问题:

  1. 为什么有区别?据我检查,两种方法都返回相同的响应。

  2. 我能得到同样的结果吗?

  3. 有没有更好的方法来检测页面内容的变化?

标签: node.jsweb-scrapinghashpython-requestspuppeteer

解决方案


您需要在 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

推荐阅读