You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python爬虫爬取吉他电商站如何优化分页循环提升爬取效率

网页爬虫效率优化方案

核心解决固定页码导致无效请求的问题,用动态终止分页的逻辑就能从根源避免多余请求,再搭配几个细节优化就能大幅提升爬取效率和稳定性:

  • 取消全局固定最大页码的硬编码,每个分类独立判断分页终止点:从第1页开始逐页爬取,只要当前页面解析不到商品条目、或者请求返回非200状态码,直接终止当前分类的翻页循环,自动跳到下一个分类爬取。比如音箱类爬到第16页时无有效商品,就不会再往后发请求,完全避免无效请求浪费时间。
  • 补充基础请求配置:给requests加上浏览器UA请求头,避免被站点反爬策略直接拦截;加上超时参数,防止异常请求卡住整个爬取流程;可以加1秒左右的请求间隔,避免请求频率太高被封IP。
  • 补全数据校验逻辑:原代码直接按索引匹配商品名、价格、库存,一旦某页有商品缺对应标签,三个列表长度不一致就会触发索引报错,导致之前爬的数据白跑。解析完每页数据后先校验三个列表长度一致,异常条目直接跳过即可。
  • 可选提速方案:如果觉得单线程爬太慢,可以用线程池做低并发爬取,并发数控制在2-3即可,不要开太高给站点造成不必要的压力。

优化后参考代码

import pandas as pd
import requests
from bs4 import BeautifulSoup
import time

guitar_products = []
# 加浏览器请求头伪装,避免被反爬拦截
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
}

for category in ['guitars/electric/','guitars/bass/','amps/','guitars/acoustic/','pedals/']:
    page_num = 1
    while True:
        url = f"https://www.guitarguitar.co.uk/{category}page-{page_num}"
        print(f"正在爬取: {url}")
        # 加超时设置,避免请求卡死
        resp = requests.get(url, headers=headers, timeout=10)
        # 状态码异常直接终止当前分类爬取
        if resp.status_code != 200:
            print(f"分类{category}爬取到第{page_num}页终止,状态码异常")
            break
        
        soup = BeautifulSoup(resp.content, 'html.parser')
        products = [product.text.strip() for product in soup.find_all('h3', {'class': 'qa-product-list-item-title'})]
        # 当前页无商品,直接终止当前分类翻页
        if len(products) == 0:
            print(f"分类{category}共爬取{page_num-1}页,无更多商品")
            break
        
        prices = [price.text.strip()[:-1] for price in soup.find_all('span', {'class': 'js-pounds'})]
        avails = [avail.text.strip() for avail in soup.find_all('div', {'class': 'availability'})]
        
        # 校验三个列表长度一致,避免索引越界报错
        min_len = min(len(products), len(prices), len(avails))
        for i in range(min_len):
            guitar_products.append({
                'product': products[i],
                'price': prices[i],
                'avail': avails[i]
            })
        
        page_num += 1
        # 加1秒请求间隔,降低触发反爬的概率
        time.sleep(1)

guitar_data = pd.DataFrame(guitar_products)
guitar_data['price'] = pd.to_numeric(guitar_data['price'].str.replace('[^\d.]', '', regex=True))

这个改法不需要提前统计每个分类的总页数,不管分类是15页还是87页,都能自动爬完所有有效页就停,不会多发一个无效请求,稳定性也比原来的硬编码逻辑高很多。

内容的提问来源于stack exchange,提问作者Mensa 23

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 04:12:22