如何仅抓取有库存商品的Href信息?求修改现有爬虫代码
解决方案
要筛选出有库存的商品链接,核心是识别页面中有库存/无库存商品的标识特征,再针对性过滤。以下是具体修改方案:
步骤说明
- 先定位每个商品的父容器(而非直接抓取链接),因为库存状态信息通常和商品链接同属一个容器内。
- 识别无库存商品的特征:查看目标页面源码,无库存商品的容器会带有
out-of-stock类,或内部按钮文本为Out of Stock。 - 只提取那些没有无库存标识的商品链接。
修改后的代码
import requests import random from bs4 import BeautifulSoup from urllib3.exceptions import InsecureRequestWarning # 禁用不安全请求警告 requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning) user_agent_list = [ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Safari/605.1.15', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:77.0) Gecko/20100101 Firefox/77.0', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36', ] # 随机选择User-Agent user_agent = random.choice(user_agent_list) headers = {'User-Agent': user_agent} url = 'https://www.beermerchants.com/browse/brewery/cantillon' response = requests.get(url, headers=headers) soup = BeautifulSoup(response.text, features="html.parser") in_stock_links = [] # 遍历每个商品容器 for product_container in soup.find_all('li', class_="product-item"): # 检查是否为无库存商品:容器带有out-of-stock类 is_out_of_stock = product_container.has_attr('class') and 'out-of-stock' in product_container['class'] # 备用判断方案:通过按钮文本识别 # stock_button = product_container.find('button') # is_out_of_stock = stock_button and stock_button.text.strip() == 'Out of Stock' if not is_out_of_stock: # 提取商品链接 product_link = product_container.find('a', href=True, class_="product-item-link") if product_link: in_stock_links.append(product_link['href']) print("有库存的商品链接:") for link in in_stock_links: print(link)
关键修改点
- 移除了冗余的未使用库导入(如selenium、smtplib等),简化代码结构。
- 改为遍历商品容器
li.product-item,先判断库存状态再提取链接,确保过滤逻辑准确。 - 通过
out-of-stock类识别无库存商品,同时提供按钮文本判断的备用方案,适配页面可能的结构变化。
内容的提问来源于stack exchange,提问作者Ianucci
相关产品推荐
相关产品推荐

