from urllib.parse import urljoin, urlencode, urlparse, parse_qs u = urlparse(r.url) q = parse_qs(u.query); q['page'] = ['2'] print(u._replace(query=urlencode(q, doseq=True)).geturl())
带 category=3 抓列表,第 2 页返回的 20 条和第 1 页完全一样,请求 url 里只剩 page=2,category 没了,去重后总量停在 20 条。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,分页链接是后端拼出来的,只保留了页码,筛选条件没有跟着带过去。脚本按页码自增,每一页请求的其实是同一个未筛选列表。
「筛选分页参数」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。
接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。
处理上按这个顺序:抓第一页时保存完整 query;翻页用 urljoin 保留已有参数;以详情 id 做唯一键校验两页集合;连续抓 10 页对比总量。
改完只确认一件事:第 2 页与第 1 页的 id 交集为 0,连续 10 页共 200 条不重复,与页面显示的总数对上。
