实测条件请求对爬虫增量抓取的作用:200 KB 页面带正确 If-None-Match 得到 304 且响应体 0 字节;100 个页面第二遍,10 个更新,响应体从 19.5 MiB 降到 2.0 MiB;Last-Modified 不变时 304 会错过更新;同一页面重复访问 100 次,max-age 内只需要 1 个请求。
实测 sitemap.xml 解析:不写 XML 命名空间会解析出 0 条;.xml.gz 文件要自己解压而 Content-Encoding: gzip 由 requests 解开;lastmod 有多种写法,没有 lastmod 的条目不能用来增量;5 万条 URL 用 iterparse 内存 4.0 MiB 对 fromstring 38.5 MiB;lxml 恢复模式会悄悄破坏含 & 的 URL。
60 个商品各有 5 种地址加 10 个分页列表页(共 310 个 URL,70 种内容):只规范化 URL 剩 130 组;信任 canonical 61 组但把 10 个不同的分页合成一组;canonical 加内容校验和只看正文哈希都得到正好 70 组;整页字节哈希因为页脚时间戳合并不了(310 组)。
实测 change stream 的 resume token:_data 是 83 字节的十六进制串,首字节 0x82 后 8 字节就是 clusterTime;用第 2 个事件的 token 恢复从第 3 个事件继续,不丢不重;空闲 stream 的 token 也随 oplog 前进;token 的位置不在节点的 oplog 窗口里(新成员 oplog 起点更晚)时恢复报 286 ChangeStreamHistoryLost。
实测 change stream 的事件内容与过滤:update 默认只带 updateDescription;updateLookup 取到的是查询那一刻的文档,快速连续修改会丢掉中间状态;changeStreamPreAndPostImages 加 required 才有精确的前后镜像;pipeline 的 $match 在服务端过滤(10 个事件只收到 4 个);$project 不能去掉 _id;drop 后收到 invalidate。
以真实 Chrome 154 解析出的 DOM 为标准答案,22 个残缺 HTML 片段:selectolax(Lexbor)和 bs4 + html5lib 22 / 22 一致,html5lib 21 / 22,lxml.html 与 bs4 + lxml 12 / 22,bs4 + html.parser 只有 6 / 22;差别包括是否补 tbody、是否拆开嵌套的 <a>、重复属性取第一个还是最后一个、</br> 是否变成 <br>。
在同一个页面上比较 XPath 与 CSS 选择器:16 个选取任务中 CSS 能写 13 个、写不了按文字选/选父元素/选祖先 3 个;XPath 里匹配 class 用 @class="item" 只选到 1 个、contains 多选到 4 个、带空格的写法才与 CSS 的 3 个一致;//a[1] 与 (//a)[1] 差 6 个对 1 个;5000 个 li 的页面上两者耗时都在 2.7–3.1 ms,无稳定差别。
实测读关注 local、majority、snapshot、linearizable:健康时 local / majority / snapshot 都约 0.1 ms,linearizable 约 4.8 ms;构造“写入 primary 但未被多数确认”时 local 读到 NEW、majority 读到 old、linearizable 超时(code 50);恢复后 majority 也读到 NEW。
实测大 HTML 的解析内存:整棵树净增约文件的 11–19 倍(100 MiB 文件 1122–1649 MiB);iterparse 不清理等同整树且更慢(22.63 秒);iterparse 加 clear() 和删前面的兄弟只净增文件的约 1.1 倍(114 MiB),耗时 3.04 秒;给没声明编码的文件要传 encoding,否则「¥」变成「Â¥」。
实测爬虫文本清洗:nbsp 和全角空格能被 strip/split/\s 处理,零宽空格、BOM、软连字符不能;NFKC 能把全角转半角,但也把 x² 变成 x2、① 变成 1;NFC 与 NFD 的 café 显示一样却不相等;不清洗时正则把「¥12,345」读成 12 而不是 12345。
在 9 种页面上试提取内嵌 JSON 的方法:合法 JSON 的 script 标签用正则或 lxml 都行,有注释和末尾逗号的只有 json5;window.__STATE__ = {…}; 用非贪婪正则会被字符串里的 "};" 截断,raw_decode 或花括号配对才稳;JS 对象字面量里的 undefined 连 json5 也解析不了;字符串里没转义的 </script> 谁都救不了。
在本机登录页上完整走一遍并故意做错:要先 GET 表单拿会话 cookie 和 csrf_token,POST 时带上全部隐藏字段;没有 cookie 或 token 不对返回 403,缺 form_id 或填了隐藏输入框返回 400;登录失败后 token 轮换,旧 token 再提交 403;登录成功后会话 id 换了;AJAX 的 token 通过 X-CSRF-Token 头回传。