清晨五点,山东寿光的蔬菜批发市场已灯火通明。菜农老张盯着手机里的价格波动图,盘算着今天该采摘多少黄瓜。与此同时,上海某生鲜电商的采购经理小王,正通过实时价格看板调整进货策略。这些场景背后,是农产品价格数据在驱动现代农业的齿轮。

农产品价格具有强时效性和地域性特征,同一品种在不同市场的价差可达30%以上。传统数据采集依赖人工录入,存在三大痛点:时效性差(每日更新)、覆盖面窄(仅限重点市场)、数据维度单一(仅价格无销量)。而通过爬虫技术,可实现全国2000+农产品市场的实时价格抓取,为种植决策、物流调度、期货交易提供数据支撑。
以惠农网为例,这个日均访问量超百万的农业B2B平台,汇聚了全国3000多个县域的农产品交易信息。其价格数据包含产地价、批发价、零售价三级体系,且关联品种、规格、产地、上市时间等12个维度,是农业数据挖掘的富矿。
采用Python作为开发语言,核心组件包括:
[定时任务] → [代理调度] → [请求发送] → [页面解析] → [数据清洗] → [存储分析]
关键设计要点:
以惠农网"苹果"品类为例,其价格数据分布在三个层级:
https://www.cnhnb.com/price/apple/)/price/apple/?province=shandong)通过Chrome开发者工具观察,发现关键数据通过AJAX异步加载,真实数据接口为:
POST https://www.cnhnb.com/api/price/search
Form Data:
{
"categoryId": 1001,
"provinceId": 37,
"pageSize": 20,
"pageNum": 1
}
import requests
from bs4 import BeautifulSoup
import random
import time
from fake_useragent import UserAgent
# 代理池配置(示例使用免费代理,实际项目建议购买企业级代理)
PROXY_POOL = [
{"http": "http://123.123.123.123:8080"},
# 更多代理IP...
]
def get_random_proxy():
return random.choice(PROXY_POOL)
def get_page_data(url):
headers = {"User-Agent": UserAgent().random}
proxy = get_random_proxy()
try:
response = requests.get(url, headers=headers, proxies=proxy, timeout=10)
if response.status_code == 200:
return response.text
else:
print(f"请求失败,状态码:{response.status_code}")
return None
except Exception as e:
print(f"请求异常:{e}")
return None
def parse_price_data(html):
soup = BeautifulSoup(html, 'html.parser')
price_items = []
# 示例解析逻辑(需根据实际页面结构调整)
for item in soup.select('.price-item'):
name = item.select_one('.product-name').text.strip()
price = item.select_one('.current-price').text.strip()
spec = item.select_one('.spec-info').text.strip() if item.select_one('.spec-info') else ""
origin = item.select_one('.origin-place').text.strip() if item.select_one('.origin-place') else ""
price_items.append({
"name": name,
"price": float(price[1:]), # 去除人民币符号
"spec": spec,
"origin": origin,
"update_time": time.strftime("%Y-%m-%d %H:%M:%S")
})
return price_items
def main():
base_url = "https://www.cnhnb.com/price/apple/"
html = get_page_data(base_url)
if html:
data = parse_price_data(html)
# 此处可添加数据存储逻辑(如写入CSV/数据库)
print(f"成功抓取{len(data)}条价格数据")
else:
print("数据抓取失败")
if __name__ == "__main__":
main()
对于需要登录或点击加载的页面,采用Selenium模拟浏览器操作:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
def get_dynamic_data(url):
chrome_options = Options()
chrome_options.add_argument("--headless") # 无头模式
chrome_options.add_argument(f"user-agent={UserAgent().random}")
driver = webdriver.Chrome(options=chrome_options)
driver.get(url)
# 模拟点击"加载更多"按钮
try:
load_more = driver.find_element_by_css_selector(".load-more-btn")
load_more.click()
time.sleep(3) # 等待数据加载
except:
pass
html = driver.page_source
driver.quit()
return html
惠农网主要采用以下反爬措施:
反爬类型 | 应对方案 | 实施难度 | 效果评级 |
|---|---|---|---|
IP限制 | 代理IP池+轮询 | ★☆☆ | ★★★★☆ |
UA检测 | 随机UA轮换 | ★☆☆ | ★★★☆☆ |
行为检测 | 模拟鼠标轨迹 | ★★★ | ★★★★☆ |
验证码 | 打码平台+OCR | ★★★★ | ★★☆☆☆ |
推荐组合方案:
存储方式 | 适用场景 | 查询效率 | 扩展性 |
|---|---|---|---|
CSV文件 | 小规模数据 | ★★☆☆☆ | ★☆☆☆☆ |
SQLite | 中等规模 | ★★★☆☆ | ★★☆☆☆ |
MySQL | 大规模数据 | ★★★★☆ | ★★★★☆ |
MongoDB | 非结构化数据 | ★★★☆☆ | ★★★★★ |
推荐方案:
import pandas as pd
import matplotlib.pyplot as plt
# 加载数据
df = pd.read_csv("apple_prices.csv")
# 价格分布分析
plt.figure(figsize=(10,6))
df['price'].hist(bins=30)
plt.title("苹果价格分布图")
plt.xlabel("价格(元/斤)")
plt.ylabel("频数")
plt.savefig("price_distribution.png")
# 产地对比分析
top_origins = df['origin'].value_counts().head(5)
top_origins.plot(kind='barh')
plt.title("主要产地供应量对比")
plt.savefig("origin_comparison.png")
Q1:被网站封IP怎么办? A:立即启用备用代理池,建议采用住宅代理(如站大爷IP代理)配合每请求更换IP策略。对于已封IP,可通过以下步骤解封:
Q2:如何提高数据抓取效率? A:采用三维度优化:
Q3:如何应对验证码? A:分级处理策略:
Q4:数据抓取合法吗? A:需遵守《网络安全法》和《数据安全法》,重点关注三点:
Q5:如何保证数据准确性? A:实施四重校验:
随着农业数字化转型加速,农产品价格爬虫将向三个方向发展:
在山东寿光的蔬菜大棚里,物联网传感器正在实时采集温湿度数据;在惠农网的服务器集群中,爬虫程序正在抓取全国价格行情。当这些数据通过农业大数据平台汇聚时,我们看到的不仅是数字的跳动,更是中国农业现代化的脉搏。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。