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

