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

如何正确爬取Eureka网站的商品标题、价格及链接?

爬虫代码排查与优化方案

原代码存在的问题

  • 缩进错误:Python对缩进严格要求,函数eurika内部代码缩进混乱,直接运行会触发语法错误。
  • 商品链接获取逻辑错误:使用soup.find('a', class_='sobrTxt')全局查找链接,会始终返回页面第一个商品的链接,无法对应每个商品。
  • 未处理空值异常:若商品无红色价格标签,price.text.strip()会触发AttributeError;标题为空时的错误提示逻辑错误(提示的是链接未找到)。
  • 相对链接未转换:获取的商品链接是相对路径,无法直接访问,需拼接网站域名转为完整URL。
  • 缺少函数调用:代码定义了eurika函数但未调用,输入关键词后不会执行爬取操作。
  • 无请求异常处理:未处理网络请求失败(如超时、服务器错误)的情况,程序易崩溃。
  • 中文引号语法错误:代码中部分字符串使用了中文引号,不符合Python语法规范。

优化后的代码

from bs4 import BeautifulSoup
import requests

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/117.0'
}

def eureka(product):
    base_url = 'https://www.eureka.com.kw'
    search_url = f'{base_url}/?instant_records%5Bquery%5D={product}'
    
    try:
        # 发送请求并处理异常
        response = requests.get(search_url, headers=headers, timeout=10)
        response.raise_for_status()  # 触发HTTP错误状态码的异常
        soup = BeautifulSoup(response.content, 'html.parser')
        
        # 查找所有商品容器
        product_containers = soup.find_all('div', class_='caption')
        
        if not product_containers:
            print("页面未找到相关商品")
            return
        
        for container in product_containers:
            # 获取商品标题
            title_elem = container.find('span', class_='display-block fwbold')
            title = title_elem.text.strip() if title_elem else "无标题"
            
            # 获取商品价格
            price_elem = container.find('span', style='color:red')
            price = price_elem.text.strip() if price_elem else "无价格"
            
            # 获取商品链接(在当前容器内查找对应a标签)
            link_elem = container.find_previous('a', class_='sobrTxt')
            if link_elem:
                link = base_url + link_elem['href']
            else:
                link = "无有效链接"
            
            # 输出商品信息
            print(f"商品标题: {title}")
            print(f"商品价格: {price}")
            print(f"商品链接: {link}")
            print("-" * 50)
            
    except requests.exceptions.RequestException as e:
        print(f"请求失败: {str(e)}")
    finally:
        if 'response' in locals():
            response.close()

# 获取用户输入并执行爬取
product_keyword = input("请输入要搜索的商品: ")
eureka(product_keyword)

优化说明

  1. 修复缩进与语法错误:统一函数内代码缩进,替换中文引号为英文引号。
  2. 修正链接获取逻辑:使用find_previous在当前商品容器的上下文内查找对应的链接标签,确保每个商品链接正确对应。
  3. 空值安全处理:对标题、价格、链接元素的存在性做判断,避免空值调用方法触发异常。
  4. 相对链接转完整URL:拼接网站域名与相对路径,生成可直接访问的完整链接。
  5. 添加异常处理:捕获网络请求相关异常,输出错误信息,避免程序崩溃。
  6. 补充函数调用:添加用户输入获取与函数调用逻辑,确保代码能正常执行。
  7. 优化信息输出:增加分隔线提升可读性,统一输出格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 07:00:13