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
相关产品推荐
相关产品推荐

