Python BeautifulSoup爬取商品标题未得到预期输出求助
问题排查与修复
你的代码无法拿到正确结果,核心问题有3个:
- requests默认请求头会被目标站点反爬拦截,返回的页面不是浏览器里看到的商品搜索结果,自然匹配不到
prodBox节点 - 提取标题时没有定位到
prodTitle容器内部的<a>标签,直接取父div的text属性容易混入多余空白、换行甚至其他子节点内容 - 遍历商品节点时,每次循环都覆盖
products变量,也没有将单条数据存入集合列表,parse函数最终无有效返回值
修正后的完整代码
import requests from bs4 import BeautifulSoup import pandas as pd import time # 目标搜索页地址 url = 'https://aiswatches.com/search.php?search_query_adv=16570§ion=product' # 模拟浏览器请求头,绕过基础反爬 headers = { 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' } def get_data(url): r = requests.get(url, headers=headers, timeout=10) # 自动识别编码避免乱码 r.encoding = r.apparent_encoding soup = BeautifulSoup(r.text, 'html.parser') return soup def parse(soup): all_products = [] # 定位所有商品卡片 product_cards = soup.find_all('div', class_='prodBox') for card in product_cards: # 先找标题容器,再找内部的a标签 title_container = card.find('div', class_='prodTitle') if not title_container: continue title_a = title_container.find('a') if not title_a: continue single_product = { 'title': title_a.text.strip(), 'product_link': title_a.get('href', '') # 价格字段可按相同逻辑,定位价格标签后提取即可 } all_products.append(single_product) return all_products if __name__ == '__main__': page_soup = get_data(url) product_list = parse(page_soup) # 打印结果验证 for product in product_list: print(product) # 需要导出表格的话放开下面注释即可 # pd.DataFrame(product_list).to_csv('watch_result.csv', index=False, encoding='utf-8-sig')
补充说明
- 代码里加了节点存在性判断,避免个别商品卡片结构异常导致整个程序崩溃
- 后续爬取多页数据时,建议在每次请求之间加
time.sleep(1~2)的延时,降低被封IP的概率 - 如果运行后还是拿不到数据,先打印
page_soup.prettify()查看实际返回的页面源码,确认和浏览器开发者工具里看到的结构一致后再调整选择器即可
内容的提问来源于stack exchange,提问作者paul lee
相关产品推荐
相关产品推荐

