用Python3 + bs4 + request + mysql 抓取并存储新发地菜价数据

2023-11-14

为了让大家去菜市场砍价的时候,心里更有底,我写了一个小程序,抓取新发地官网公布的农副产品价格,并存入数据库,仅供研究。

简单说一下思路吧:

  1. 从新发地官网找到数据展示的规律,发现不同的类别和页数,是通过两个接口参数控制的,因此将URL模板设计成动态的,带有两个动态参数。
  2. 例行获取页面的bs4实体,通过div标签和class属性,找到要获取的数据列表。
  3. 把数据过滤好,存入列表。第一行固定是标题,后面是数据。
  4. 把数据存入数据库。建表过程这里就省略了。
  5. 因为考虑到网站的数据量很庞大,我们也没有必要抓取全部,因此考虑增加一个起始时间,只抓取这个时间以后的数据。
  6. Round one, fight!
from bs4 import BeautifulSoup
import requests
import pymysql

HEADER = {
    "User-Agent": "Mozilla/5.0 (Linux; Android 9; DUK-AL20) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.119 Mobile Safari/537.36",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
    "Accept-Encoding": "gzip, deflate",
    "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7",
}

# URL模板,需要动态调整的主要是类别和页数两个字段
BASE_URL = 'http://www.xinfadi.com.cn/marketanalysis/{}/list/{}.shtml'

START_DATE = '2020-03-10'  # 起始时间,包括当前时间

CATAGORY = [{'name': '', 'id': '1'},  # 蔬菜
            {'name': '', 'id': '2'},  # 水果
            {'name': '', 'id': '3'},  # 肉禽蛋
            {'name': '', 'id': '4'},  # 水产
            {'name': '', 'id': '5'},  # 粮油
            ]


def get_page_bs4(url):
    response = requests.get(url, HEADER)
    return BeautifulSoup(response.text, 'html.parser')


def get_mysql_conn():
    conn = pymysql.connect(
        host='localhost', port=3306,
        user='root', password='pwd',
        database='tbname',
        charset='utf8')
    return conn


# 判断日期是否小于想要抓取的最小日期
def isExpired(date):
    return date < START_DATE


# 获取具体数据
def getData(catagory, page_num):
    url = BASE_URL.format(catagory, page_num)
    bs = get_page_bs4(url)
    hq_lst = bs.find('div', class_='hangq_left').find_all('tr')
    total_lst = []
    for hq in hq_lst:
        item_lst = hq.find_all('td')
        total_lst.append([x.text for x in item_lst[:-1]])
    return total_lst


# 保存到数据库
def saveBatchToDB(conditions):
    db = get_mysql_conn()
    cursor = db.cursor()
    sql = 'INSERT INTO xinfadi(name, lowp, avep, topp, spec, unit, pubdate) VALUES (%s, %s, %s, %s, %s, %s, %s)'
    try:
        cursor.executemany(sql, conditions)
        db.commit()
    except:
        print('write db error')
    db.close()


if __name__ == '__main__':
    for cata in CATAGORY:
        page_num = 1
        isStop = False
        while not isStop:
            print('\rgetting id:{} page:{}'.format(cata.get('id'), page_num), end='')
            item_lst = getData(cata.get('id'), page_num)
            page_lst = []
            for inx, item in enumerate(item_lst):
                if inx == 0:
                    continue
                pub_date = item[-1]
                if isExpired(pub_date):
                    # 碰到第一条早于起始时间的数据,设置终止标记
                    isStop = True
                    break
                page_lst.append(item)
            # 每抓完一页,就存一次数据库
            saveBatchToDB(page_lst)
            if not isStop:
                page_num += 1
    print('\rdone', end='')


我爱技术,更爱生活,只要你不“闷”,欢迎来撩
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用Python3 + bs4 + request + mysql 抓取并存储新发地菜价数据 的相关文章

  • 使用 InlineKeyboardButton python telegram bot 发送命令

    在Python电报机器人中 是否有可能InlineKeyboardButton发送类似命令 cancel当它被按下时 例如 当用户按下取消按钮时 他们将自动发送 cancel 命令 然后由机器人处理 从这里的例子来看 https githu
  • 使用单个文件的 Python 日志记录(函数名、文件名、行号)

    我正在尝试了解应用程序的工作原理 为此 我将调试命令插入作为每个函数主体的第一行 目的是记录函数的名称以及向日志输出发送消息的行号 代码内 最后 由于这个应用程序由许多文件组成 我想创建一个日志文件 以便我可以更好地理解应用程序的控制流 这
  • Python Numpy Reshape错误[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我在尝试重塑 3D numpy 数组时遇到一个奇怪的错误 数组 x 的形状为 6 10 300 我想将其重塑为 6 3000 我正
  • 高效地将大型 Pandas 数据帧写入磁盘

    我正在尝试找到使用 Python Pandas 高效地将大型数据帧 250MB 写入磁盘或从磁盘写入的最佳方法 我已经尝试了所有方法Python 数据分析 但表现却非常令人失望 这是一个更大项目的一部分 该项目探索将我们当前的分析 数据管理
  • 在 Jupyter Notebook 中设置环境变量的不同方法

    在某些情况下 我在 Windows 10 计算机上使用 Jupyter 笔记本 我想通过设置环境变量 GOOGLE APPLICATION CREDENTIALS 来向 GCP 进行身份验证 我想知道 这两种设置环境变量的方式有什么区别 当
  • 计算熊猫数据帧几个月的总和

    我有一个 pandas 数据框 如下所示 ID Year R1 R1 f KAR1 20201001 1 5 KAR1 20201101 2 6 KAR1 20201201 3 7 KAR1 20210101 4 8 KAR1 202102
  • Python 中 time.sleep 和多线程的问题

    我对 python 中的 time sleep 函数有疑问 我正在运行一个脚本 需要等待另一个程序生成 txt 文件 虽然 这是一台非常旧的机器 所以当我休眠 python 脚本时 我遇到了其他程序不生成文件的问题 除了使用 time sl
  • 烧瓶 - 404 未找到

    我是烧瓶开发的新手 这是我在烧瓶中的第一个程序 但它向我显示了这个错误 在服务器上找不到请求的 URL 如果您输入了网址 请手动检查拼写并重试 这是我的代码 from flask import Flask app Flask name ap
  • 如何仅注释堆积条形图的一个类别

    我有一个数据框示例 如下所示 data Date 2021 07 18 2021 07 19 2021 07 20 2021 07 21 2021 07 22 2021 07 23 Invalid NaN 1 1 NaN NaN NaN N
  • 一个类似 dict 的 Python 类

    我想编写一个自定义类 其行为类似于dict 所以 我继承自dict 不过 我的问题是 我是否需要创建一个私有的dict我的成员 init 方法 我不明白这个有什么意义 因为我已经有了dict如果我只是继承自的行为dict 谁能指出为什么大多
  • Django 1.7 应用程序配置导入错误:没有名为 appname.apps 的模块

    我正在尝试按照以下文档为我的一个名为 文章 的 Django 应用程序设置自定义应用程序配置https docs djangoproject com en dev ref applications https docs djangoproj
  • 将 Python Selenium 输出写入 Excel

    我编写了一个脚本来从在线网站上抓取产品信息 目标是将这些信息写入 Excel 文件 由于我的Python知识有限 我只知道如何在Powershell中使用Out file导出 但结果是每个产品的信息都打印在不同的行上 我希望每种产品都有一条
  • 更新 matplotlib 中颜色条的范围

    我想更新一个contourf在函数内绘制 效果很好 然而 数据的范围发生了变化 因此我还必须更新颜色条 这就是我未能做到的地方 请参阅以下最小工作示例 import matplotlib pyplot as plt import numpy
  • 在 for 循环中访问 itertools 产品的元素

    我有一个列表列表 是附加 itertools 产品的一些其他结果的结果 我想要的是能够使用 for 循环访问列表列表中列表的每个元素 但我无法访问所有元素 我只能访问最后一个列表的元素 结果是一个非常巨大的列表列表 例如 1 2 4 3 6
  • 重定向 python 交互式帮助()

    我正在为使用 Qt 的应用程序开发交互式 python shell 但是我似乎无法获得重定向的交互式帮助 我的 python 代码中有这个 class OutputCatcher def init self self data def wr
  • Python RE(总之检查第一个字母是否区分大小写,其余部分不区分大小写)

    在下面的情况下 我想匹配字符串 Singapore 其中 S 应始终为大写 其余单词可能为小写或大写 但在下面的字符串 s 是小写的 它在搜索条件中匹配 任何人都可以让我知道如何实施吗 import re st Information in
  • 在 anaconda 环境下运行 qsub

    我有一个程序 通常在 Linux 的 conda 环境中运行 因为我用它来管理我的库 指令如下 source activate my environment python hello world py 我怎样才能跑你好世界 py在与 PBS
  • 为什么我的 PyGame 应用程序根本不运行?

    我有一个简单的 Pygame 程序 usr bin env python import pygame from pygame locals import pygame init win pygame display set mode 400
  • python 日志记录替代方案 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 蟒蛇记录模块 http docs python org library logging html使用起来
  • 防止 Ada DLL 中的名称损坏

    有没有一种简单的方法可以防止在创建 Ada DLL 时 Ada 名称被破坏 这是我的 adb 代码 with Ada Text IO package body testDLL is procedure Print Call is begin

随机推荐

  • python 利用表格批量修改文件夹(包括子文件夹)下所有文件名

    首先是获得需要修改文件的路径放入xlsx中 我一般直接在系统的搜索框中搜索 然后全选复制路径 偷个小懒 也可以再写个自动遍历所有文件获取地址 点击这个复制路径即可复制全部选中文件的路径 直接复制在表格第一列即可 便于读取 然后按照自己实际的
  • SQL调优的几个方法

    1 为什么调优 好处是什么 SQL语句在编写之后 对于数据量较少的表基本没有什么性能上的需求 但是如果考虑到性能方面的话 SQL语句优化就是必须的 2 如何调优 调有点方法有哪些 1 对查询进行优化 应尽量避免全表扫描 首先考虑在where
  • node 版本管理器 --- Volta

    鲸腾FE 来自恒生鲸腾网络 是一支专注于 web 前端的开发团队 并在 web 前端领域积累了多年疑难问题解决经验 崇尚高效 优质 成长 自由 快乐 前言 在我们的日常开发中经常会遇到这种情况 手上有好几个项目 每个项目的需求不同 然而不同
  • uniapp 原生安卓开发插件(module),以及android环境本地调试(一)

    uniapp 原生安卓开发插件 module 以及android环境本地调试 1 开发前景 由于uniapp 框架的局限先 有很多功能不能如原生android开发使用顺畅 因此 需要使用插件进行辅助 再由uniapp引入插件 使得功能完善
  • Linux设备驱动开发详解总结(二)之并发与竞争

    转载地址 http blog csdn net lwj103862095 article details 8548500 Linux设备驱动中必须解决一个问题是多个进程对共享资源的并发访问 并发的访问会导致竞态 在当今的Linux内核中 支
  • Netty:ByteBuf写入数据、读出数据

    介绍 Netty的ByteBuf数据位置索引是从0开始的 类似于数组 getByte int index 从指定位置读出一字节 这个操作不会改变ByteBuf的readerIndex或者 writerIndex 的位置 这个操作也不受rea
  • Ubuntu16.04系统安装tensorflow(GPU)

    作者 冯拓 电脑配置如下 配置 HP Z820 CPU核心线程数和主频 intel xeon 至强 E 5 2620 2 0GHz 24 内存 64GB 硬盘 2TB 显卡 NIVDIA TITAN X 12GB 安装过程中使用的安装包 安
  • 用Java实现杨辉三角

    给定一个非负整数 numRows 生成 杨辉三角 的前 numRows 行 在 杨辉三角 中 每个数是它左上方和右上方的数的和 示例 1 输入 numRows 5 输出 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 示例 2
  • Go语言的大小写

    初学者经常犯Go大小写默认的错误 即在包外引用小写的常量 函数提示错误 对于刚接触Go语言的人会觉得莫明其妙 原因是 Go语言中 常量 函数的首字母大写表示对外公开的相当于Java的public 小写表示私有的相当于Java的private
  • Vue element 二级菜单绑定示例

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 一 element ui 中动态绑定二级菜单示例 1 视图绑定
  • 软考高项之风险管理-攻坚记忆

    软考高项之风险管理 攻坚记忆 一 项目风险管理概述 1 风险相关概念及性质 2 风险分类 二 风险管理的ITO 1 风险管理过程组 规划风险管理ITO 2 风险管理过程组 识别风险ITO 3 风险管理过程组 实施定性风险分析ITO 4 风险
  • Three.js 模型添加标签

    在很多的实际的项目中 你可能需要给一个Three js的模型添加标签 那么我们可以使用three js的精灵模型来表示 使用精灵模型表示一个模型对象的标签 那么精灵模型就要位于模型对象的附近 可以获得要标注模型的世界坐标 然后来设置精灵标签
  • java cron表达式 每天凌晨两点_定时任务的cron表达式

    前言 对于开发人员来说 在做项目的过程中或多或少都会用到定时任务 Java开发一般会用Spring Quartz xxl job Elastic job来做定时任务调度框架 不论使用哪种框架 定时任务表达式都是必不可少的 平时配置cron表
  • linux的TCP连接数量最大不能超过65535个吗,那服务器是如何应对百万千万的并发的?

    首先 问题中描述的65535个连接指的是客户端连接数的限制 在tcp应用中 server事先在某个固定端口监听 client主动发起连接 经过三路握手后建立tcp连接 那么对单机 其最大并发tcp连接数是多少呢 如何标识一个TCP连接 在确
  • 动态规划(上)

    题目一 109 数字三角形 LintCode 分治 利用递归可以很快的写出程序 class Solution public int traverse vector
  • JavaScript读取json文件

  • push和pushl的区别

    AT T汇编中 命令中可以指定操作范围 如pushb是将一个byte压栈 而pushw就是将一个word压栈 同样pushl就是压栈long 也就是双字 esp指的是esp寄存器 已知是双字 而0xfffffff8 p 指的是一个内存空间
  • JVM垃圾回收机制GC理解

    目录 JVM垃圾回收 分代收集 如何识别垃圾 引用计数法 可达性分析法 引用关系四种类型 强 软 弱 虚 强引用 软引用 SoftReference 弱引用 WeakReference WeakHashMap 软引用与虚引用的使用场景 虚引
  • [Codeforces 1286B] Numbers on Tree

    Evlampiy was gifted a rooted tree The vertices of the tree are numbered from 1 to n Each of its vertices also has an int
  • 用Python3 + bs4 + request + mysql 抓取并存储新发地菜价数据

    为了让大家去菜市场砍价的时候 心里更有底 我写了一个小程序 抓取新发地官网公布的农副产品价格 并存入数据库 仅供研究 简单说一下思路吧 从新发地官网找到数据展示的规律 发现不同的类别和页数 是通过两个接口参数控制的 因此将URL模板设计成动