Python网页爬虫无法检测站点新增商品问题及优化求助
爬虫问题修复与优化方案
1. 新增商品无法自动检测问题修复
问题原因
timed_pid 字典仅在脚本启动时一次性从初始商品列表生成,后续循环过程中虽然每次都会调用liens()拉取最新商品列表,但从未将新出现的商品链接加入到timed_pid遍历队列中,导致新增商品永远不会被检测。
修复方法
每次拉取最新商品列表后,同步新增链接到检测队列,修改循环内的代码如下:
prix = 400 wait_time = 259200 timed_pid = {p: 0 for p in liens()} # 新增x变量初始化,修复原代码未定义变量报错问题 x = 0 while True: try: # 仅请求1次列表页,保存结果复用,避免重复请求 latest_urls = liens() a += 1 print(f"请求次数:{x}") x += 1 nombre_total_liens = len(latest_urls) print(f'找到的商品链接总数:{nombre_total_liens}') # 同步新增商品到检测队列 for url in latest_urls: if url not in timed_pid: timed_pid[url] = 0 except Exception as e: print("服务器拒绝连接..") print("等待5秒后重试") print("休眠中...") time.sleep(5) print("休眠结束,继续运行") continue time.sleep(15) # 后续遍历商品详情页的逻辑保持不变即可
2. 运行效率优化建议
- 减少重复请求:原代码单次循环内调用3次
liens()发起3次重复的列表页请求,修改为1次请求后复用结果,可减少2/3的列表页请求量,降低被站点反爬封禁的概率,同时提升运行速度。 - 合理设置超时:将
timeout=None修改为timeout=15,避免请求无响应导致脚本僵死。 - 解析逻辑优化:价格提取改用正则匹配数字部分,替换原有的多次
replace操作,逻辑更简洁、容错性更高。 - 并发请求优化:商品详情页当前为串行请求,商品数量较多时检测速度慢,可以引入
concurrent.futures.ThreadPoolExecutor实现多线程并发请求,可提升数倍检测速度。 - 冗余代码清理:删除重复导入的
datetime模块,移除无意义的response = url初始化赋值操作。 - 异常捕获优化:尽量捕获具体异常类型而非全量捕获
except:,避免屏蔽代码本身的语法、逻辑错误,方便排查问题。
内容的提问来源于stack exchange,提问作者Dilolcyy
相关产品推荐
相关产品推荐

