Python爬虫抓取bewellstore.ro商品为何在第12张图片处停止
爬虫停止运行的原因及解决方案
核心原因
- 反爬拦截:你所有
requests.get()请求都没有携带浏览器请求头,且没有请求间隔,连续请求12次后触发站点频率限制,服务器直接拒绝响应或返回拦截页面,导致程序报错终止。 - 无异常捕获逻辑:任意商品详情页存在缺失你定义的目标元素(比如部分商品没有
woocommerce-product-details__short-description、sku等字段)时,find()方法会返回None,调用.text.strip()会直接抛出AttributeError导致程序终止。 - 初始链接抓取不完整:首次请求商店首页时如果被反爬拦截,返回的页面内容不完整,会导致你一开始拿到的
product_links就只有12条,遍历完自然停止。 - 图片请求无超时/异常处理:请求第12张图片时如果出现网络波动、资源不存在等情况,无超时设置会导致程序永久卡住,无异常捕获会直接报错终止。
修复方案
1. 全局添加请求头
在代码开头定义统一的请求头,所有网络请求都携带该头信息,伪装成正常浏览器访问:
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' } # 所有requests.get都替换为这种形式,加header和超时设置 r = requests.get(url, headers=headers, timeout=10)
2. 增加元素查找异常捕获
所有字段提取都加判空或异常捕获,避免单个商品字段缺失导致整个程序崩溃:
# 示例字段提取写法 try: title = soup.find('h1', class_='product_title').text.strip() except: title = '' try: price = soup.find('p', class_ = 'price').text.strip() except: price = '' # 其余字段都按照该逻辑修改
3. 添加请求间隔
每次请求后增加1-2秒的延迟,避免触发站点频率限制:
import time # 每次requests.get之后加 time.sleep(1.5)
4. 验证初始链接数量
先打印print(len(product_links))确认首次抓取的商品链接数量是否和站点实际商品数量一致,如果数量不对,说明首页请求就被拦截,优先调整请求头和间隔。
内容的提问来源于stack exchange,提问作者Dan Croitoriu
相关产品推荐
相关产品推荐

