如何从Weedmaps抓取药房菜单的菌株、数量及价格数据
解决Weedmaps药房菜单数据抓取的思路
首先,你遇到的问题特别典型——这类现代网站的数据基本都是动态加载的:页面HTML只会渲染基础框架,真正的菜单数据是浏览器加载完页面后,通过AJAX请求从后端API拉取,再动态渲染到页面上的,所以直接看页面源码肯定找不到这些内容。
下面是亲测有效的解决步骤:
第一步:定位数据接口
打开浏览器开发者工具(按F12切换到「Network」标签),刷新目标药房页面。在「Filter」栏选择「XHR」或「Fetch」,过滤出动态请求的接口。你可以重点找带「menu」「product」「strain」这类关键词的请求,点进去看「Response」标签,如果返回的是结构化JSON数据,且包含菌株、价格等信息,那就是你要找的目标接口了。第二步:分析API结构
找到接口后,重点看这几个部分:- 请求URL里一般会包含药房的唯一ID(比如
/api/v1/dispensaries/{dispensary_id}/menu),这个ID可以从页面URL或者页面源码的meta标签里提取; - 返回的JSON中,菌株名称可能在
data[].name或data[].strain.name字段下;产品数量可以直接统计对应分类下的数组长度;价格通常在data[].prices或data[].variants[].price里,注意不同规格(比如1g、3g)的价格会分开存储。
- 请求URL里一般会包含药房的唯一ID(比如
第三步:模拟API请求
用你熟悉的爬虫工具(比如Python的requests库)模拟发送请求,记得带上必要的请求头(比如User-Agent、Accept,部分网站可能需要Cookie或Authorization令牌,这些都能从开发者工具的「Request Headers」里复制)。举个简单的Python示例:import requests headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', 'Accept': 'application/json' } api_url = "https://api.weedmaps.com/api/v1/dispensaries/xxx/menu" # 替换为你找到的真实API地址 response = requests.get(api_url, headers=headers) menu_data = response.json() # 提取目标数据示例 for product in menu_data['data']['products']: strain_name = product.get('strain', {}).get('name', '未知菌株') product_spec_count = len(product.get('variants', [])) spec_prices = [variant['price'] for variant in product.get('variants', [])] print(f"菌株名称: {strain_name}, 规格数量: {product_spec_count}, 对应价格: {spec_prices}")第四步:应对反爬限制
Weedmaps有反爬机制,频繁请求容易被封IP或返回403。建议:- 给请求加上1-3秒的随机延迟;
- 用代理IP轮换请求;
- 尽量模拟真实用户的浏览节奏,不要一次性批量请求大量数据。
内容的提问来源于stack exchange,提问作者Sam Skinner
相关产品推荐
相关产品推荐

