一、项目介绍

基于文字提取技术paddleOCR实现在金投网上获取各个省份的当日废弃金属价格。区别于爬虫获取网页数据,本项目使用脚本控制鼠标来获取网页截图,用paddleocr技术提取价格数据,在不使用爬虫的技术下也能精准的获取想要的价格数据。

在这里插入图片描述

本项目还借用百度的echart框架,再加上flask技术,搭建了一个简单的网页,用于对各省份价格数据的实时动态可视化,下面是可视化网页的效果展示。

在这里插入图片描述

二、详细说明

最近铁的价格波动较大,去网站上搜了一下各省份的价格,发现铁价呈现南高北低,相邻省份价格相近等情况,于是想把这网页上的数据爬取下来并加上一个中国地图实现各省份铁价可视化,研究了金投网后发现由于废弃金属产品较多,数据量过大,该网页采取一个省份设置一个路径的方式存储一个产品的数据,不利于在单个网页获取全部数据,且不同时间其路径也不一样,用爬虫来获取数据难度有点高,于是借鉴了之前写的项目,基于paddleOCR获取数字产品价格,作者编写了脚本控制鼠标点击并截图,后期通过文字提取的方式来获取网页数据。
接下来会分几步来简述项目实现过程。

2.1、脚本
通过pyautogui库控制鼠标点击,由于数据量过大,这里就简单展示前两个省份的代码。(受限于这是一个在线的notebook,无法进行鼠标键盘的交互。所以下面的代码仅供展示作用,不要运行!)
import time  # 加入time函数,可以控制点击时间,等网页完全打开后再截图
import pyautogui as pg  # 用于控制鼠标
from PIL import ImageGrab  # 截取网页

city = ["北京", "上海", "天津", "重庆", "广东", "浙江", "江苏", "江西",
        "安徽", "河南", "河北", "山东", "福建", "湖南", "湖北",
        "广西", "山西", "陕西", "宁夏", "甘肃", "新疆", "青海", "海南",
        "贵州", "云南", "四川", "西藏", "内蒙古", "辽宁", "吉林", "黑龙江"]

time.sleep(5)  # 进入界面后等待5秒

pg.click(360, 600)  # 选择第一个城市(北京),360,600为鼠标在屏幕上的坐标点。
pg.click(900, 485)  # 把鼠标移开
time.sleep(2)
image = ImageGrab.grab(bbox=(230, 600, 520, 720))  # 截图
image.save(str(0) + ".png")  # 保存图片
print("已保存"+city[0]+"城市铁价")
pg.click(600, 485)  # 回到省份界面
time.sleep(2)

pg.click(480, 600)  # 选择第2个城市(上海)
time.sleep(1)
pg.click(900, 485)  # 把鼠标移开
time.sleep(2)
image = ImageGrab.grab(bbox=(230, 600, 520, 720))  # 截图
image.save(str(1) + ".png")  # 保存图片
print("已保存"+city[1]+"城市铁价")
pg.click(600, 485)  # 回到省份界面
time.sleep(2)
2.2、文字提取
先给大家简单介绍一下paddleOCR,PaddleOCR,一款文本识别效果不输于商用的Python库!支持多语言识别,目前能够支持 80 多种语言;除了能对中文、英语、数字识别之外,还能应对字体倾斜、文本中含有小数点字符等复杂情况;提供有丰富的 OCR ;域相关工具供我们使用,方便我们制作自己的数据集、用于训练

2.2.1、解压数据集(价格截图)
下图为截取的图片

在这里插入图片描述

!unzip -oq /home/aistudio/data/data163670/price_of_scrap_iron.zip -d price
2.2.2、下载paddleocr
!pip install paddleocr
2.2.3、使用paddleocr技术提取价格数据
from paddleocr import PaddleOCR

money1 = []  # 用于存储ocr提取出来的数据
money_all = []  # 存储全部价格
all_address = ["北京", "上海", "天津", "重庆", "广东", "浙江", "江苏", "江西",
               "安徽", "河南", "河北", "山东", "福建", "湖南", "湖北",
               "广西", "山西", "陕西", "宁夏", "甘肃", "新疆", "青海", "海南",
               "贵州", "云南", "四川", "西藏", "内蒙古", "辽宁", "吉林", "黑龙江"]
ocr = PaddleOCR(use_angle_cls=True, lang="ch")

for i in range(30):  # 把脚本截图图片通过OCR识别提取价格
    img_path = str("price/各省废弃金属-铁-价格/"+str(i) + ".png")  # 设定价格图片路径
    result = ocr.ocr(img_path, cls=False, det=True, rec=True)  # ocr读取
    for line in result:
        #print(line[1][0])  # 输出读取内容
        money1.append(line[1][0])  # 存储
    money = money1[1+(3*i)]  # 有3个数据,把第二个价格数据提取出来
    money_all.append(money)  # 把价格录到总价格中
    print("省份:"+all_address[i]+"    价格"+money_all[i])
[2022/08/10 16:10:57] ppocr DEBUG: Namespace(alpha=1.0, benchmark=False, beta=1.0, cls_batch_num=6, cls_image_shape='3, 48, 192', cls_model_dir='/home/aistudio/.paddleocr/whl/cls/ch_ppocr_mobile_v2.0_cls_infer', cls_thresh=0.9, cpu_threads=10, crop_res_save_dir='./output', det=True, det_algorithm='DB', det_db_box_thresh=0.6, det_db_score_mode='fast', det_db_thresh=0.3, det_db_unclip_ratio=1.5, det_east_cover_thresh=0.1, det_east_nms_thresh=0.2, det_east_score_thresh=0.8, det_fce_box_type='poly', det_limit_side_len=960, det_limit_type='max', det_model_dir='/home/aistudio/.paddleocr/whl/det/ch/ch_PP-OCRv3_det_infer', det_pse_box_thresh=0.85, det_pse_box_type='quad', det_pse_min_area=16, det_pse_scale=1, det_pse_thresh=0, det_sast_nms_thresh=0.2, det_sast_polygon=False, det_sast_score_thresh=0.5, draw_img_save_dir='./inference_results', drop_score=0.5, e2e_algorithm='PGNet', e2e_char_dict_path='./ppocr/utils/ic15_dict.txt', e2e_limit_side_len=768, e2e_limit_type='max', e2e_model_dir=None, e2e_pgnet_mode='fast', e2e_pgnet_score_thresh=0.5, e2e_pgnet_valid_set='totaltext', enable_mkldnn=False, fourier_degree=5, gpu_mem=500, help='==SUPPRESS==', image_dir=None, ir_optim=True, label_list=['0', '180'], lang='ch', layout=True, layout_label_map=None, layout_path_model='lp://PubLayNet/ppyolov2_r50vd_dcn_365e_publaynet/config', max_batch_size=10, max_text_length=25, min_subgraph_size=15, mode='structure', ocr=True, ocr_version='PP-OCRv3', output='./output', precision='fp32', process_id=0, rec=True, rec_algorithm='SVTR_LCNet', rec_batch_num=6, rec_char_dict_path='/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddleocr/ppocr/utils/ppocr_keys_v1.txt', rec_image_shape='3, 48, 320', rec_model_dir='/home/aistudio/.paddleocr/whl/rec/ch/ch_PP-OCRv3_rec_infer', save_crop_res=False, save_log_path='./log_output/', scales=[8, 16, 32], show_log=True, structure_version='PP-STRUCTURE', table=True, table_char_dict_path=None, table_max_len=488, table_model_dir=None, total_process_num=1, type='ocr', use_angle_cls=True, use_dilation=False, use_gpu=False, use_mp=False, use_onnx=False, use_pdserving=False, use_space_char=True, use_tensorrt=False, vis_font_path='./doc/fonts/simfang.ttf', warmup=False)
[2022/08/10 16:10:58] ppocr DEBUG: dt_boxes num : 3, elapse : 0.18548965454101562
[2022/08/10 16:11:00] ppocr DEBUG: rec_res num  : 3, elapse : 1.4084184169769287
省份:北京    价格1900.00
[2022/08/10 16:11:00] ppocr DEBUG: dt_boxes num : 3, elapse : 0.28911447525024414
[2022/08/10 16:11:01] ppocr DEBUG: rec_res num  : 3, elapse : 1.4035155773162842
省份:上海    价格2380.00
[2022/08/10 16:11:02] ppocr DEBUG: dt_boxes num : 3, elapse : 0.291318416595459
[2022/08/10 16:11:03] ppocr DEBUG: rec_res num  : 3, elapse : 1.3992137908935547
省份:天津    价格2000.00
[2022/08/10 16:11:03] ppocr DEBUG: dt_boxes num : 3, elapse : 0.20323419570922852
[2022/08/10 16:11:05] ppocr DEBUG: rec_res num  : 3, elapse : 1.3923869132995605
省份:重庆    价格1750.00
[2022/08/10 16:11:05] ppocr DEBUG: dt_boxes num : 3, elapse : 0.20437145233154297
[2022/08/10 16:11:06] ppocr DEBUG: rec_res num  : 3, elapse : 1.499875545501709
省份:广东    价格2240.00
[2022/08/10 16:11:07] ppocr DEBUG: dt_boxes num : 3, elapse : 0.28789258003234863
[2022/08/10 16:11:08] ppocr DEBUG: rec_res num  : 3, elapse : 1.6108949184417725
省份:浙江    价格2470.00
[2022/08/10 16:11:08] ppocr DEBUG: dt_boxes num : 3, elapse : 0.28465819358825684
[2022/08/10 16:11:10] ppocr DEBUG: rec_res num  : 3, elapse : 1.4023168087005615
省份:江苏    价格1770.00
[2022/08/10 16:11:10] ppocr DEBUG: dt_boxes num : 3, elapse : 0.2079639434814453
[2022/08/10 16:11:12] ppocr DEBUG: rec_res num  : 3, elapse : 1.418123483657837
省份:江西    价格2250.00
[2022/08/10 16:11:12] ppocr DEBUG: dt_boxes num : 3, elapse : 0.2044999599456787
[2022/08/10 16:11:13] ppocr DEBUG: rec_res num  : 3, elapse : 1.408416986465454
省份:安徽    价格2360.00
[2022/08/10 16:11:13] ppocr DEBUG: dt_boxes num : 3, elapse : 0.2003467082977295
[2022/08/10 16:11:15] ppocr DEBUG: rec_res num  : 3, elapse : 1.4108216762542725
省份:河南    价格1905.00
[2022/08/10 16:11:15] ppocr DEBUG: dt_boxes num : 3, elapse : 0.30034303665161133
[2022/08/10 16:11:17] ppocr DEBUG: rec_res num  : 3, elapse : 1.5090062618255615
省份:河北    价格1830.00
[2022/08/10 16:11:17] ppocr DEBUG: dt_boxes num : 3, elapse : 0.2920353412628174
[2022/08/10 16:11:19] ppocr DEBUG: rec_res num  : 3, elapse : 1.4099595546722412
省份:山东    价格2230.00
[2022/08/10 16:11:19] ppocr DEBUG: dt_boxes num : 3, elapse : 0.20354890823364258
[2022/08/10 16:11:20] ppocr DEBUG: rec_res num  : 3, elapse : 1.4975931644439697
省份:福建    价格2070.00
[2022/08/10 16:11:21] ppocr DEBUG: dt_boxes num : 3, elapse : 0.20367145538330078
[2022/08/10 16:11:22] ppocr DEBUG: rec_res num  : 3, elapse : 1.399881362915039
省份:湖南    价格1800.00
[2022/08/10 16:11:22] ppocr DEBUG: dt_boxes num : 3, elapse : 0.28646397590637207
[2022/08/10 16:11:24] ppocr DEBUG: rec_res num  : 3, elapse : 1.4092700481414795
省份:湖北    价格2280.00
[2022/08/10 16:11:24] ppocr DEBUG: dt_boxes num : 3, elapse : 0.2845890522003174
[2022/08/10 16:11:25] ppocr DEBUG: rec_res num  : 3, elapse : 1.402533769607544
省份:广西    价格2280.00
[2022/08/10 16:11:26] ppocr DEBUG: dt_boxes num : 3, elapse : 0.20486736297607422
[2022/08/10 16:11:27] ppocr DEBUG: rec_res num  : 3, elapse : 1.3977165222167969
省份:山西    价格1915.00
[2022/08/10 16:11:27] ppocr DEBUG: dt_boxes num : 3, elapse : 0.2967183589935303
[2022/08/10 16:11:29] ppocr DEBUG: rec_res num  : 3, elapse : 1.7988090515136719
省份:陕西    价格1990.00
[2022/08/10 16:11:29] ppocr DEBUG: dt_boxes num : 3, elapse : 0.2913792133331299
[2022/08/10 16:11:31] ppocr DEBUG: rec_res num  : 3, elapse : 1.5969874858856201
省份:宁夏    价格1700.00
[2022/08/10 16:11:31] ppocr DEBUG: dt_boxes num : 3, elapse : 0.2055673599243164
[2022/08/10 16:11:33] ppocr DEBUG: rec_res num  : 3, elapse : 1.5008113384246826
省份:甘肃    价格1815.00
[2022/08/10 16:11:33] ppocr DEBUG: dt_boxes num : 3, elapse : 0.28537464141845703
[2022/08/10 16:11:34] ppocr DEBUG: rec_res num  : 3, elapse : 1.4073350429534912
省份:新疆    价格1845.00
[2022/08/10 16:11:35] ppocr DEBUG: dt_boxes num : 3, elapse : 0.2010488510131836
[2022/08/10 16:11:36] ppocr DEBUG: rec_res num  : 3, elapse : 1.484731674194336
省份:青海    价格1835.00
[2022/08/10 16:11:36] ppocr DEBUG: dt_boxes num : 3, elapse : 0.20502114295959473
[2022/08/10 16:11:38] ppocr DEBUG: rec_res num  : 3, elapse : 1.3996272087097168
省份:海南    价格1785.00
[2022/08/10 16:11:38] ppocr DEBUG: dt_boxes num : 3, elapse : 0.2883188724517822
[2022/08/10 16:11:39] ppocr DEBUG: rec_res num  : 3, elapse : 1.4016520977020264
省份:贵州    价格1915.00
[2022/08/10 16:11:40] ppocr DEBUG: dt_boxes num : 3, elapse : 0.2922041416168213
[2022/08/10 16:11:41] ppocr DEBUG: rec_res num  : 3, elapse : 1.502861738204956
省份:云南    价格1965.00
[2022/08/10 16:11:41] ppocr DEBUG: dt_boxes num : 3, elapse : 0.2015540599822998
[2022/08/10 16:11:43] ppocr DEBUG: rec_res num  : 3, elapse : 1.3932435512542725
省份:四川    价格2350.00
[2022/08/10 16:11:43] ppocr DEBUG: dt_boxes num : 3, elapse : 0.20165038108825684
[2022/08/10 16:11:44] ppocr DEBUG: rec_res num  : 3, elapse : 1.310579538345337
省份:西藏    价格1785.00
[2022/08/10 16:11:45] ppocr DEBUG: dt_boxes num : 3, elapse : 0.204742431640625
[2022/08/10 16:11:46] ppocr DEBUG: rec_res num  : 3, elapse : 1.399357557296753
省份:内蒙古    价格1765.00
[2022/08/10 16:11:46] ppocr DEBUG: dt_boxes num : 3, elapse : 0.19914031028747559
[2022/08/10 16:11:48] ppocr DEBUG: rec_res num  : 3, elapse : 1.3909227848052979
省份:辽宁    价格1915.00
[2022/08/10 16:11:48] ppocr DEBUG: dt_boxes num : 3, elapse : 0.20081448554992676
[2022/08/10 16:11:49] ppocr DEBUG: rec_res num  : 3, elapse : 1.394876480102539
省份:吉林    价格1735.00


2.3、使用pymysql把数据导入到mysql(受限于这是一个在线的notebook,无法调用本地摄像头或者无法进行鼠标键盘的交互。下面的代码仅供展示作用,不要运行!)
    # 打开数据库连接
    conn1 = pymysql.connect(host='localhost',
                            user='root',
                            password='123456',
                            database='test_to_feitie')  # 表名
    # 使用cursor()方法获取操作游标
    cursor = conn1.cursor()
    # SQL 更新语句
    sql = "insert into test1 values(%s,%s,%s)"
    cursor.execute(sql, [all_address[i], "2022-8-08", money_all[i]])  # 录入格式为:省份varchar,时间varchar,价格:int
    conn1.commit()
    cursor.close()
    conn1.close()
    print("成功把"+all_address[i]+"今日铁价写入test1中")
2.4.1、使用flask搭建后端。Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活、轻便、安全且容易上手。它可以很好地结合MVC模式进行开发,开发人员分工合作,小型团队在短时间内就可以完成功能丰富的中小型网站或Web服务的实现。另外,Flask还有很强的定制性,用户可以根据自己的需求来添加相应的功能,在保持核心功能简单的同时实现功能的丰富与扩展,其强大的插件库可以让用户实现个性化的网站定制,开发出功能强大的网站。下面是搭建后端的代码。(受限于这是一个在线的notebook,无法调用本地摄像头或者无法进行鼠标键盘的交互。下面的代码仅供展示作用,不要运行!)
from flask import Flask
from flask import render_template
from flask import jsonify
import utils

app = Flask(__name__)

@app.route('/')
def h_1():
    return render_template("main.html")

@app.route("/c2")  # 搭建c2路由用于获取mysql中的省份名字/价格信息
def get_c2_data():
    res = []
    for tup in utils.get_c2_data():
        res.append({"name":tup[0],"value":int(tup[1])})
    return jsonify({"data":res})  # 转化为json格式的数据

@app.route("/l1")  # 搭建l1路由用于获取MySQL中的佛山市所有价格数据
def get_l1_data():
    data = utils.get_l1_data()
    time,feitie,shengtie = [],[],[]
    for a,b,c in data[:]:
        time.append(a)
        feitie.append(b)
        shengtie.append(c)
    return jsonify({"time":time,"feitie":feitie,"shengtie":shengtie})

if __name__ == '__main__':
    app.run()
2.4.2、使用pymysql获取保存的数据(受限于这是一个在线的notebook,无法调用本地摄像头或者无法进行鼠标键盘的交互。下面的代码仅供展示作用,不要运行!)
import pymysql

def get_conn():
    # 打开数据库连接
    conn = pymysql.connect(host='localhost',
                           user='root',
                           password='123456',
                           database='test_to_feitie')
    # 使用cursor()方法获取操作游标
    cursor = conn.cursor()
    return conn, cursor

def close_conn(conn,cursor):
    cursor.close()
    conn.close()

def query(sql,*args):
    conn, cursor = get_conn()
    cursor.execute(sql,args)
    res = cursor.fetchall()
    close_conn(conn, cursor)
    return res

def get_c2_data():
    # sql = "select address,money from test1"
    sql = "select address,money from test1 where(times=\"2022-8-08\")"
    res = query(sql)
    return res

def get_l1_data():
    sql = "select time,feitie,shengtie from foshan_test1"
    res = query(sql)
    return res

if __name__ == "__main__":
 sql = "select time,feitie,shengtie from foshan_test1"
    res = query(sql)
    return res

if __name__ == "__main__":
    print(get_l1_data())

三、 项目部署

受限于这是一个在线的notebook,无法调用本地摄像头或者无法进行鼠标键盘的交互,这里给大家讲解一下如何部署本项目。需要下载的库有:paddleOCR、pymysql、flask、pyautogui、ecahrt中的包(已放在文件flask_project中)所有的库都使用最新版。项目全部代码都已上传,分别为文件夹:脚本+文字提取和文件夹:flask_project。本项目仅介绍项目实现思路及可在notebook上运行的paddleocr,其他内容如如何设置脚本里面的参数,如何在pycharm中布置网页,会在接下来的项目里详细讲解,大家尽情期待吧!

此文章为搬运
原项目链接

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐