前言
随着互联网技术的发展,数据抓取成为了获取大量公开数据的重要手段。本文将介绍如何利用 Python 编程语言结合 DrissionPage 和自定义的 DataRecorder 模块,实现对新发地市场蔬菜价格数据的自动化抓取,并将抓取到的数据保存至 CSV 文件中。
 目标网站
 
1. 准备工作
在开始之前,请确保您的环境中已安装了 DrissionPage 库。如果没有安装,可以通过 pip 安装:
pip install DrissionPage
同时,您需要创建一个名为 DataRecorder.py 的模块,该模块负责数据的记录功能。这里我们假设您已经有了这个模块,并且它支持向 CSV 文件追加数据的功能。
2. 导入必要的库
首先,我们需要导入本项目所需的库:
from DrissionPage import ChromiumPage
from DataRecorder import Recorder
3. 创建数据记录器
接下来,我们将创建一个 Recorder 实例,用于后续将数据记录到 CSV 文件中:
# 创建 Recorder 实例,用于记录数据到 CSV 文件
recorder = Recorder(path="./data.csv", cache_size=500)
# 设置 CSV 文件的表头
recorder.add_data(['品名', '最低价', '平均价', '最高价', '规格', '产地', '单位', '发布日期'])
4. 初始化浏览器对象
使用 ChromiumPage 类初始化一个浏览器实例,以便于后续操作网页:
# 初始化 ChromiumPage 对象
page = ChromiumPage()
5. 监听网络请求
为了捕获页面加载时发送的网络请求,特别是那些包含了我们所需数据的请求,我们需要开启监听:
# 开始监听指定 URL 的网络请求
page.listen.start('http://www.xinfadi.com.cn/getPriceData.html')
6. 访问目标页面
通过 get 方法访问目标网站,并等待页面开始加载:
# 请求目标页面
url = "http://www.xinfadi.com.cn/priceDetail.html"
page.get(url)
page.wait.load_start()  # 等待页面加载开始
7. 抓取并处理数据
接下来是关键步骤,我们需要找到页面上的所有蔬菜类别,点击每个类别以触发数据加载,然后从网络请求中提取数据:
# 获取页面上所有蔬菜类目的元素
vegetable_style = page.eles("x://li[contains(@class,'lis')]")
对于每个蔬菜类别,执行以下操作:
# 遍历每个蔬菜类目
for style in vegetable_style:
    style.click()  # 点击类目以触发数据加载
    page.wait.load_start()  # 等待页面加载完成
    # 等待数据包加载完成
    resp = page.listen.wait()
    data = resp.response.json()  # 解析响应体为 JSON 格式
遍历返回的数据列表,提取每条记录的信息:
# 遍历数据列表中的每个项目
for item in data['list']:
    # 构建一个包含所需信息的字典
    dict_item = {
        '品名': item['prodName'],
        '最低价': item['lowPrice'],
        '平均价': item['avgPrice'],
        '最高价': item['highPrice'],
        '规格': item['specInfo'],
        '产地': item['place'],
        '单位': item['unitInfo'],
        '发布日期': item['pubDate']
    }
    # 将数据添加到 Recorder 中
    recorder.add_data(dict_item)
    # 打印处理后的数据
    print(dict_item)
8. 保存数据
最后,确保所有数据都被正确地写入到 CSV 文件中:
# 最后,将所有缓存的数据写入文件
recorder.record()
运行结果

总结
通过上述步骤,我们成功地实现了对新发地市场蔬菜价格数据的自动化抓取,并将结果保存到了本地的 CSV 文件中。此过程不仅提高了工作效率,还保证了数据的准确性和时效性。
 如果有爬虫的需求的话可以到,【python爬虫 文档、图片等数据抓取】
 请注意,希望合理设置请求间隔时间,避免对服务器造成过大负担。
 本代码仅用于学习和研究目的,不得用于商业用途或其他非法活动。
 使用者自行承担因不当使用代码而产生的任何法律责任



















