当前位置:   article > 正文

Python批量识别图片文字(数字识别模式)大幅度提高数字识别准确率_python读取图片中的文字 数字

python读取图片中的文字 数字

目录

 

一、使用beautiful soup库爬取网页图片

二、使用pytesseract库识别图片中数据,并将数据存入txt文件

三、用pandas库实现txt文件到csv文件的转换


 

一、使用beautiful soup库爬取网页图片

 该网站中有需要的数据,但是是以图片形式存在。

这样就给我们爬取数据造成了一些困扰,没有办法之间从网站上获取数据,只能先把这些图片爬取下来,之后再进行处理。

按F12,进入开发者模式,在html源码上找到图片所在的位置:

e220cb9f31e0422c8ffb9953810b257b.png

 

可以看出图片位于“article”类下的第7个p块下,并且观察对应的每张图片的src,可以看出每张图片仅最后的数字不同,所以我们可以进行网址的拼接,进而调用get方法下载这些图片

通过beautiful soup库中findall()方法进行定位图片,并下载和重命名所有图片

注意:p中存储的是所有html中p块信息,而我们需要的图片位于第7个p块下,所以p[6]中是我们需要的信息

de097b0a3dce4b6eb2264f8239107e47.png

 

将下载的图片保存在当前目录新创建的文件夹下

76e0fe2f22c24650a88705b1ae9f6378.png

b4bf6d1d95d14853b59a5d1f85bfb4e1.png

爬取过程的源代码如下:

  1. import os
  2. import re
  3. import time
  4. import requests
  5. from bs4 import BeautifulSoup
  6. # 手动写入目标套图的首页地址
  7. download_url = "https://www.dxsbb.com/news/85155.html"
  8. # 手动写入网站中图片的个数
  9. num = 23
  10. # 创建一个文件夹用来保存图片
  11. file_name = "2020年四川高考理科一分一段表"
  12. # 目标图片下载地址的前半部分(固定不变那部分,后半段是变化的,需要解析网页得到)
  13. imgae_down_url_1 = "https://www.dxsbb.com"
  14. # 创建文件夹
  15. def CreateFolder(file):
  16. """创建存储数据文件夹"""
  17. flag = 1
  18. while flag == 1: # 若文件已存在,则不继续往下走以免覆盖了原文件
  19. if not os.path.exists(file):
  20. os.mkdir(file)
  21. flag = 0
  22. else:
  23. print('该文件已存在,请重新输入')
  24. flag = 1
  25. time.sleep(1)
  26. # 返回文件夹的路径,这里直接放这工程的根目录下
  27. path = os.path.abspath(file) + "\\"
  28. return path
  29. # 下载图片
  30. def DownloadPicture(download_url, list, path):
  31. # 访问目标网址
  32. r = requests.get(url=download_url, timeout=20)
  33. r.encoding = r.apparent_encoding
  34. soup = BeautifulSoup(r.text, "html.parser")
  35. # 解析网址,提取目标图片相关信息,注:这里的解析方法是不固定的,可以根据实际的情况灵活使用
  36. p = soup.find_all("p") #p中是所有p块的信息
  37. tag = p[6].find_all("img") # 得到该页面目标图片的信息
  38. # 下载图片
  39. j = 0
  40. for i in range(num):
  41. if (j < len(tag) and tag[j].attrs['src'] != None):
  42. img_name = str(i) + ".png" # 以数字命名图片,图片格式为jpg
  43. # 获取目标图片下载地址的后半部分
  44. imgae_down_url_2 = tag[j].attrs['src']
  45. j = j + 1
  46. # 把目标图片地址的前后两部分拼接起来,得到完整的下载地址
  47. imgae_down_url = imgae_down_url_1 + imgae_down_url_2
  48. print("imgae_down_url: ", imgae_down_url)
  49. # 下载图片
  50. try:
  51. img_data = requests.get(imgae_down_url)
  52. except:
  53. continue
  54. # 保存图片
  55. img_path = path + img_name
  56. with open(img_path, 'wb') as fp:
  57. fp.write(img_data.content)
  58. print(img_name, " ******下载完成!")
  59. # 主函数
  60. if __name__ == "__main__":
  61. # 创建保存数据的文件夹
  62. path = CreateFolder(file_name)
  63. print("创建文件夹成功: ", path)
  64. page_url = download_url # 要爬取的网页地址
  65. # 下载图片
  66. DownloadPicture(page_url, num, path) # 注:这个网站每一页最多是22张图片,每张图片我都用数字命名
  67. print("全部下载完成!", "共" + str(len(os.listdir(path))) + "张图片")

二、使用pytesseract库识别图片中数据,并将数据存入txt文件

有了图片之后就要对图片上的数据进行识别,pytesseract库是一个封装性较好的库,安装之后就可以调用该库进行字符识别。

调用pytesseract库进行图片中的数据识别(一开始识别精度并不高,查了一下原因发现默认的识别方法是识别文字的,而本次任务是识别数据,其实并不是很适用。所以我搜索了一下pytesseract库使用方法,发现确实可以使用“只识别数字”模式,这种模式识别的精确度果然提高了很多)

但是识别出的结果中不仅有数字,由于图片上有水印,所以结果中还有很多标点符号和乱码,需要过滤掉这些东西。所以我建立了一个停用词列表,过滤掉这些乱码和标点符号,并将过滤后的数据写入txt文件

6985ff8a31d74610b9329867ff696f9a.png

 

识别后并写入txt文件效果:

d73d814ab55a4e768eb65ae0e31b52fc.png

 图片识别代码如下:

  1. from PIL import Image
  2. import pytesseract
  3. import os
  4. def read_image(name):
  5. text=pytesseract.image_to_string(Image.open(name), lang='chi_sim',config=r'-c tessedit_char_whitelist=0123456789 --psm 6')
  6. exclude_char_list='.:\\|\'?!"[]()@#$%^&*<>/'
  7. text=''.join([x for x in text if x not in exclude_char_list])
  8. fp2 = open('2020li.txt', 'a')
  9. fp2.write(text)
  10. fp2.close()
  11. def main():
  12. path = "./"
  13. for path, dir, file in os.walk(path):
  14. break
  15. pic = []
  16. for i in file:
  17. if (".png" in i):
  18. pic.append(i)
  19. for j in pic:
  20. read_image(j)
  21. if __name__ == '__main__':
  22. main()

 

三、用pandas库实现txt文件到csv文件的转换

最后一步,将txt文件转换成csv文件,前提是数据和数据之间有空格,并且格式正确

69ba8d7204704f2da5c53be4a7ee3d99.png

 

(对于识别出的这些数据,我还是进行人工复查了一遍,发现识别的准确率在90%左右,出现的一些小错误要手动修改一下)

 

3ca6fe06df18406bb1c74899a26a4696.png

 txt数据写入csv文件代码如下:

  1. import numpy as np
  2. import pandas as pd
  3. txt = np.loadtxt('2020li.txt')
  4. txtDF = pd.DataFrame(txt)
  5. txtDF.to_csv('2020li.csv', index=False)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/296078
推荐阅读
相关标签
  

闽ICP备14008679号