Moglix网站商品URL爬取:HREF标签Class动态变化问题求助
解决Moglix商品URL爬取中动态Class的问题
方案1:通过URL模式筛选a标签
动态生成的class不可靠,但商品URL通常有固定格式(比如包含/product/),直接筛选符合特征的a标签即可:
import requests import re from bs4 import BeautifulSoup prod_url = [] # 匹配商品URL的特征正则 url_pattern = re.compile(r'/product/') for i in range(1, 400): r = requests.get(f'https://www.moglix.com/automotive/car-accessories/216110000?page={i}') soup = BeautifulSoup(r.content, 'lxml') # 遍历所有带href的a标签,筛选符合URL模式的 for link in soup.find_all('a', href=True): if url_pattern.search(link['href']): prod_url.append(link['href']) print(f"共获取到{len(prod_url)}条商品URL")
方案2:通过稳定的父容器定位
商品卡片的外层容器一般有固定class(不会随页面动态变化),先定位容器再提取内部的a标签:
import requests from bs4 import BeautifulSoup prod_url = [] for i in range(1, 400): r = requests.get(f'https://www.moglix.com/automotive/car-accessories/216110000?page={i}') soup = BeautifulSoup(r.content, 'lxml') # 替换成实际页面中商品卡片的固定class(比如'product-tile',需自行查看页面确认) product_cards = soup.find_all('div', class_='product-tile') for card in product_cards: link = card.find('a', href=True) if link: prod_url.append(link['href']) print(f"共获取到{len(prod_url)}条商品URL")
提示:打开浏览器开发者工具,查看商品卡片的外层div,找到不会动态变化的class名称替换代码中的
product-tile。
方案3:直接解析页面内嵌的JSON数据(最可靠)
很多电商网站会把商品列表以JSON形式嵌入页面的script标签中,这种方式无需处理HTML结构,效率更高:
import requests import json import re prod_url = [] # 匹配页面中存储商品数据的script标签内容 data_pattern = re.compile(r'window\.__INITIAL_STATE__\s*=\s*(.*?);') for i in range(1, 400): r = requests.get(f'https://www.moglix.com/automotive/car-accessories/216110000?page={i}') match = data_pattern.search(r.text) if match: try: # 解析JSON数据 raw_data = json.loads(match.group(1)) # 根据实际JSON层级提取商品URL(需自行查看数据结构调整路径) for product in raw_data.get('products', {}).get('list', []): prod_url.append(product.get('url')) except json.JSONDecodeError: print(f"第{i}页JSON解析失败") print(f"共获取到{len(prod_url)}条商品URL")
提示:打开页面源代码(Ctrl+U),搜索
window.__INITIAL_STATE__或类似关键词,找到商品数据的具体层级,调整代码中的取值路径。
内容的提问来源于stack exchange,提问作者Lalit Joshi
相关产品推荐
相关产品推荐

