Python实现信息自动配对爬虫排版程序
作者 | 李秋键
责编 | 晋兆雨
头图 | CSDN付费下载自视觉中国
在很多的公司项目中,常常有很多对office项目的比较机械化的操作,在这里就可以借助python实现对office的合理排版。而这里我们就将借助海尔公司的出货表爬取对应图片信息,并重新排版成为更加合理的Excel布局。
而今天我们这个项目是来自于实际生活中真实存在的处理事件。海尔在国外的员工常常要处理一些进出货的表格统计,但是由于国外人很多不大精通汉字,故常常要通过给出的汉字在网上搜索图片,然后复制到表格中以方便国外人能看懂是什么货物,并加上拼音有助于理解。相对以往而言,由于货物清单任务量很大,常常需要大量时间人力而且容易出错,故我们这里设计了个程序使得这一项任务完全可以由电脑自动完成,不仅速度极快,而且不需要浪费人力和精力,提高了生产效率。
实验前的准备
其中海尔给出的货物清单的Excel在4.xlsx中,数据如下:
代码总体框架
整体的程序框架分为两个重要部分。一个部分是用来爬取数据,另一个用来排版成美观的Excel。如下详解:
1 爬取数据并保存
如download.py程序可见。
首先我们流程是从Excel读取数据、然后借助百度图库搜索图片,并爬取保存。
2 Excel排版和拼音注释
如xls.py可见。根据下载下来的图片和文字及其拼音保存排版。
第三方库介绍
Xlrd库:用来读取和保存Excel表格,更方便读取数据
Pypinyin库:用来把汉字转为拼音,这里我们需要将它准成有音素的拼音
Xlsxwriter库:用来读取和保存Excel表格,其可以更好地保存格式
Requests库:Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 测试需求。
Re库:正则表达式匹配
Pillow库:读取图片
Urllib库:用来网络爬虫处理
Socket库:数据包处理
Openpyx库l:openpyxl是一款比较综合的工具,不仅能够同时读取和修改Excel文档,而且可以对Excel文件内单元格进行详细设置,包括单元格样式等内容,甚至还支持图表插入、打印设置等内容,使用openpyxl可以读写xltm, xltx, xlsm, xlsx等类型的文件,且可以处理数据量较大的Excel文件,跨平台处理大量数据是其它模块没法相比的。因此,openpyxl成为处理Excel复杂问题的首选库函数。在使用openpyxl前先要掌握三个对象,即:Workbook(工作簿)、Worksheet(工作表)和Cell(单元格,存储具体的数据对象)三个对象。
Time库:用来每次爬取数据的适当延迟,以防止网站封掉ip。
Os模块:用来本地文件和文件夹的读取和生成等等。
代码
在download程序中,首先是根据给出的Excel表读取数据,代码如下:
首先是设置编码格式和导入所要使用到的库:
#encoding=utf-8
importxlrd
frompypinyin import lazy_pinyin,pinyin
importxlsxwriter
importrequests
import os
import re
from PILimport Image
importtime
fromurllib import request
fromurllib import error
importrandom
importsocket
接着设立文件名变量方便保存和读取。设立爬虫包的延迟时间为20s。
#改文件名的地方
excel_address="4.xlsx"
socket.setdefaulttimeout(20)
为了防止反爬的问题,设立请求头
header ={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
接着使用xlrd库读取Excel表格,按照列对象读取数据
workbook= xlrd.open_workbook(excel_address)
sheet =workbook.sheet_by_name("Sheet1")
col0 =sheet.col_values(0) # 获取第1列内容,序号那一列
col1 =sheet.col_values(1)# 获取第2列内容,物资名称那一列
col2=sheet.col_values(2)#获取第3列内容,型号规格那一列
col3=sheet.col_values(3)
col4=sheet.col_values(4)
col5=sheet.col_values(5)
使用lazy_pinyin函数将汉字转为拼音,同时保留了音素并保存:
for i in col1:i=lazy_pinyin(i)txt=""for w in i:txt+=w+" "yin.append(txt)
print(yin)
根据百度图片搜索图片并爬取保存。其中为了防止网页延迟等问题,通过多次尝试爬取合适的图片:
numm=[]
for i in range(len(col0)):print("完成了"+str((i/len(col0))*100)+"%
判断读取到的数据是否是数字,因为其中有些数据是空格等等多余的无效数据:
if isinstance(col0[i],float):numm.append(i)t=col1[i]+col2[i]print(t)url = 'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=' + t + '&ct=201326592&v=flip'result = requests.get(url, headers=header)pic_url = re.findall('"objURL":"(.*?)",', result.text, re.S)num=1for each in range(len(pic_url)):print('正在下载第' + str(num) + '张图片,图片地址:' + str(pic_url[each]))try:pic = requests.get(pic_url[each], timeout=2,headers=header)
保存爬取下来的图片至对应的文件夹中,文件夹名为对应行的序号。然后设置爬取下来的图片尺寸为300并保存:
if not os.path.exists("image/"+str(i)):os.makedirs("image/"+str(i))dir = "image/"+str(i)+"/" + str(num) + '.jpg'fp = open(dir, 'wb')fp.write(pic.content)fp.close()try:img = Image.open("image/" +str(i)+"/" + str(num) + '.jpg')img.resize((300, 300)).save("image/" +str(i)+"/" + str(num) + '.jpg')except:passnum += 1if num == 5:print("下一个。")result.close()breakexcept :print('【换资源中。。。】')continue
每个货物名称只需要下载爬取四个图片即可:
if num == 5:print("下一个。")result.close()time.sleep(random.randint(0,3))break
其中download.py运行效果如下:
爬取下来的保存部分图片如下:接着使用xls.py进行排版。因为这里我们使用xlrd排版时发现保存的Excel格式都失效了,故需要借助openpyxl库进行原有格式的保存和处理,即保存为新的Excel为8.xlsx。
import os
import xlrd
from pypinyin import lazy_pinyin,pinyin
from openpyxl import load_workbook
from openpyxl.drawing.image import Image
#改文件名的地方
excel_address="4.xlsx"
wb = load_workbook(excel_address)
wb.save("8.xlsx")
workbook = xlrd.open_workbook(excel_address)
sheet1 = workbook.sheet_by_name("Sheet1")
wb = load_workbook('8.xlsx')
sheet = wb.get_sheet_by_name('Sheet1')
sht = wb.worksheets[0]
col0 = sheet1.col_values(0) #获取第1列内容,序号那一列
col1 = sheet1.col_values(1)#获取第2列内容,物资名称那一列
col2=sheet1.col_values(2)#获取第3列内容,型号规格那一列
col3=sheet1.col_values(3)
col4=sheet1.col_values(4)
col5=sheet1.col_values(5)
根据Excel表格单元填充进拼音:
for i in range(len(col0)):sht.row_dimensions[i].height = 150.0if isinstance(col0[i], float):sheet["G"+str(i+1)].value=yin[i]
接着根据已经保存下来的爬取到的图片依次按照布局顺序进行填充,同时还要设定一定的图片尺寸,以保证布局的美观和合理:
for i in os.listdir("image"):for j in os.listdir("image/"+i):tw="image/"+i+"/"+jlabel=j.split(".")label=label[0]
根据label对象的数据判断对应序号,根据序号判断对应图片存放的文件夹位置,然后读取图片并复制到Excel表格中:
if int(label)==1:try:img_address_2 = "image/" +i+"/"+ str(label) + '.jpg'
使用openpyxl中的image函数读取图片
img = Image(img_address_2)
设置图片的长宽为200,统一尺寸以方便布局
img.width = 200.0img.height = 200.0
通过单元格添加图片即可达到插入图片的效果
sht.add_image(img, 'J'+str(int(i)+1))
如果没有合理的找到对应图片就跳过:
except:passif int(label)==2:try:img_address_2 = "image/" +i+"/"+ str(label) + '.jpg'img = Image(img_address_2)img.width = 200.0img.height = 200.0sht.add_image(img, 'M'+str(int(i)+1))except:passif int(label)==3:try:img_address_2 = "image/" +i+"/"+ str(label) + '.jpg'img = Image(img_address_2)img.width = 200.0img.height = 200.0sht.add_image(img, 'P'+str(int(i)+1))except:passif int(label)==4:try:img_address_2 = "image/" +i+"/"+ str(label) + '.jpg'img = Image(img_address_2)img.width = 200.0img.height = 200.0sht.add_image(img, 'S'+str(int(i)+1))except:pass
wb.save("dels.xlsx")
最终得到的排版程序如下可见:
由此可见通过python的office操作和网络搜索自动爬取排版可以极大地节省人力和时间。
作者介绍:
李秋键,CSDN 博客专家,CSDN达人课作者。硕士在读于中国矿业大学,开发有taptap安卓武侠游戏一部,vip视频解析,文意转换工具,写作机器人等项目,发表论文若干,多次高数竞赛获奖等等。
源码地址:
链接:
https://pan.baidu.com/s/1Rtl3zoQRhKeRstgnl1firw
提取码:wk2z
推荐阅读
认知智能,AI的下一个十年 | AI Procon 202
台积电9月14日断供华为:中国“芯”的坎坷之路
2020 美国大选在即,又到了 AI 花式打击假新闻的季节
业界首发|云原生领域首本架构白皮书重磅发布
观点 | 以太坊客户端多样性问题从何而来?
相关文章:

关于2012年度土建工程专业中级专业技术资格考试有关问题的通知
关于2012年度土建工程专业中级专业技术资格考试有关问题的通知 现将2012年度土建工程专业初、中级专业技术资格考试、报名、培训工作有关事项通知如下: 一、考试组织 湖南省住房和城乡建设厅、省人力资源和社会保障厅联合成立领导小组,负责对考试工作进行…

Android自定义控件NumberCircleProgressBar(圆形进度条)的实现
Android自定义控件NumberCircleProgressBar(圆形进度条)的实现

做出的C++选择以及背后的原因
要让出资人明白你做出的C选择以及背后的原因。也许出资人会有更容易操作、更快实现的好主意。3、为你提供的日期说明信心范围。很可能管理层不明白你的估算意味着什么,而且你也有可能不理解他们所要的东西。 2.变量的C使用范围每个变量的使用范围只在定义…

拖放 DataGrid 列--来自MSDN
发布日期: 09/19/2004| 更新日期: 09/19/2004Chris SanoMicrosoft Corporation 摘要:了解如何利用基本的 GDI 功能,从而通过 DataGrid 控件获得可视化效果。通过跨越托管边界进行调用,可以利用本机 GDI 功能来执行屏幕…
最近很火的最新一代国际视频标准 VVC 到底是什么?阿里专家为你揭秘
作者 | 叶琰,阿里巴巴达摩院XG实验室视频标准团队负责人责编 | 夕颜头图 | CSDN付费下载自视觉中国2020年7月1日晚上(日内瓦时间),第十九次JVET会议在线上落下帷幕,新一代国际视频编码标准VVC第一版(Versat…

nesC编程入门
1.接口 NesC程序主要由各式组件(component)构成,组件和组件之间通过特定的接口(interface)互相沟通。一个接口内声明了提供相关服务的方法(C语言函数)。例如数据读取接口(Read&#…

用asp.net实现的把本文推荐给好友功能
作者: 飞鹰 www.ASPCool.com 时间:2001-11-25 17:39:07 ///<summary> ///<author>飞鹰ASPCool.com</author> ///<description>本文用asp.net实现把此文推荐给好友的功能。</desciption> ///<copyright>ASP酷技术资讯…

Access sql语句创建表及字段类型
创建一张空表: Sql"Create TABLE [表名]" 创建一张有字段的表: Sql"Create TABLE [表名]([字段名1] MEMO NOT NULL, [字段名2] MEMO, [字段名3] COUNTER NOT NULL, [字段名4] DATETIME, [字段名5] TEXT(200), [字段名6] TEXT(200)) 字段类…
“刚毕业1年,做Python能挣多少?”网友:吹的不多..
01现状揭秘:Python的火持续燃烧程序员:心态崩了!2020年转眼已经大半,在近几个月的榜单中,Python已经连续走上卫冕的道路,并且与Java的差距拉得更远了一些。以往与Java常呈现你追我赶之势,而这一…

Java编程的逻辑 (39) - 剖析LinkedList
本系列文章经补充和完善,已修订整理成书《Java编程的逻辑》,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http://it…

运用.NET读写Windows注册编辑表
作者: 冉林仓 www.ASPCool.com 时间:2001-11-9 如果你曾经使用过RegOpenKeyEx、RegCreateKeyEx、RegCloseKey等Win32 API函数读写过注册编辑表,你肯定非常熟悉这些复杂的Registry函数。相反,在.NET框架中,Registry和RegistryK…

使用正则表达式抽取新闻/BBS网页发表时间
package org.apache.nutch.parse.html; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 分析时间戳 * * author xum * */ public class Publish…
为什么Python没有main函数?
作者 | 豌豆花下猫来源 | Python猫(ID:python_cat)众所周知,Python中没有所谓的main函数,但是网上经常有文章提到“ Python的main函数”和“建议编写main函数”。其实,可能他们是想模仿真正的main函数,但是…

HTTP访问服务的相关解释
一、访问网站的基本流程第一步:客户端用户在浏览器输入www.51cto.com网站,回车后,系统首先会查找系统本地的DNS缓存及hosts文件信息,确定是否存在www.51cto.com余名对应的IP解析记录,如果有就直接获取IP地址࿰…

关于ASP.Net中的时间处理
作者: 飞刀 www.ASPCool.com 时间:2001-8-8 这里我想谈谈ASP.Net中对时间的处理 在ASP.Net中,M$为我们提供一种名为DateTime的对象,我们用这个对象来取得当前的时间。比如: DateTime dtDateTime.Now; 在上面…
还缺30万人!程序员2020年要过好日子了……
最近,程序员届有一个重大好消息,可能很多人还不知道,那就是:国内某些城市已经开始程序员人才补贴了!对于人工智能公司的项目开发、人才引进、科技研发,最高按照国拨经费的30%给予配套支持,单个项…

淘宝海量数据库之二:一致性选择
众所周知,一致性是数据最关键的属性之一。2000年,Eric Brewer教授在ACM分布式计算年会上指出了著名的CAP理论: Brewer, E. A. 2000. Towards robust distributed systems. In Proceedings of the 19th Annual ACM Symposium on Principles of…

Linux 小记录!
rmdir与 rm -r 的不同处前者这能删除目录 后者目录和文件都可以删除cp 和echo 都会覆盖原有的内容ctrl + c 强制中断这条命令/前后是没有空格的快捷键:TAB 命令 路径补全符号:; 多个命令的分隔符/ 根或者路径的分隔符。> 标准输出重定向…

Session 详解
作者: heallven www.ASPCool.com 时间:2004-8-28 阅读本文章之前的准备 阅读本文章前,需要读者对以下知识有所了解。否则,阅读过程中会在相应的内容上遇到不同程度的问题。 懂得ASP/ASP.NET编程 了解ASP/ASP.NET的S…

实现一个模拟CMD.exe命令编辑模式执行与显示的Delphi控件
cmd.exe这个东西是Windows系统自带的执行Dos的一个灰常好的人机命令交互的执行方式,现在很多脚本语言也都带有这种即时解释的人机模式。当下由于工程的需要,也要做一个类似命令解释显示的编辑器,基本上完全模拟Cmd.exe的这种交互模式…
谷歌这波大动作,暴露了什么信号?
我们都知道谷歌爸爸收购了Cask Data一家公司。长期以来,谷歌致力于推动围绕 GoogleCloud 的企业业务,但在这方面一直被亚马逊和微软吊打,这次的收购正是为了弥补自身的短板。被收购的 Cask Data 是一家专门提供基于Hadoop的大型数据分析服务解…

OSChina 周一乱弹 ——喝不到放心奶
2019独角兽企业重金招聘Python工程师标准>>> 【今日歌曲推荐】 陈李雨声 : 梦想还是要有的 万一实现了呢。《secret base》 《secret base》- 茅野愛衣 / 戸松遥 / 早見沙織 手机党少年们想听歌,请使劲儿戳(这里). 紫King : 这个大…

Assembly学习心得
http://blog.csdn.net/etmonitor/Assembly学习心得说明:最近开始准备把学到的.NET知识重新整理一遍,眼过千遍不如手过一遍,所以我准备记下我的学习心得,已备参考。J各位都是大虾了,如果有哪些错误或者不完整的地方&…

Oracle profile 用户资源限制 说明
一. 官网说明CREATE PROFILEhttp://download.oracle.com/docs/cd/E11882_01/server.112/e17118/statements_6010.htm#SQLRF01310Oracle recommends that you use the Database Resource Manager rather than this SQL statement to establish resource limits. The Database Re…
刚发布!2020年AI人才发展报告,这三个暗示程序员一定要知道!
最近,程序员届有一个重大好消息,可能很多人还不知道,那就是:国内某些城市已经开始程序员人才补贴了!对于人工智能公司的项目开发、人才引进、科技研发,最高按照国拨经费的30%给予配套支持,单个项…
阿里巴巴开源技术汇总:115个软件(一)
阿里巴巴开源技术汇总:115个软件 摘要: 云栖社区近期策划了多期和开源产品相关的内容,如GitHub最流行的开源机器学习、大数据等项目,揭秘阿里Weex项目,Hilo开源分析等。深入挖掘,发现开源中国已经收集了数年…

Globalization Resources
http://blog.csdn.net/etmonitor/.NET系统学习----Globalization & Resources l 前言l 了解资源文件l 创建资源文件l 在程序中使用资源文件l 资源文件的命名和部署l 参考前言:在学习如何使用.NET资源文件…
用 Python 可以实现侧脸转正脸?我也要试一下!
作者 | 李秋键责编 | Carol封图 | CSDN 下载自视觉中国近几年来GAN图像生成应用越来越广泛,其中主要得益于GAN 在博弈下不断提高建模能力,最终实现以假乱真的图像生成。GAN 由两个神经网络组成,一个生成器和一个判别器组成,其中生…

Hive SQL 监控系统 - Hive Falcon
1.概述 在开发工作当中,提交 Hadoop 任务,任务的运行详情,这是我们所关心的,当业务并不复杂的时候,我们可以使用 Hadoop 提供的命令工具去管理 YARN 中的任务。在编写 Hive SQL 的时候,需要在 Hive 终端&am…

System commands can run from cmd
gpedit.msc-----组策略 sndrec32-------录音机 Nslookup-------IP地址侦测器 explorer-------打开资源管理器 logoff---------注销命令 tsshutdn-------60秒倒计时关机命令 lusrmgr.msc----本机用户和组 services.msc---本地服务设置 oobe/msoobe /a----检查XP是否激活 notepad…