2021-04-02

一个小程序带来的新收获

一个小程序带来的新收获

最近自己想了个小需求,比如我有一堆的MTM,想获得他们的BOM信息。

20SU001LAU
20SU001MAU
20SU001CAU
20SU001DAU
20SU001NAU
20SU001GAU
20SU000XAU

以前的方式是一个一个的搜索,然后把网页上的信息进行截图或者抓到Excel里,如果是后者,还得考虑网页拷到表格里的格式问题。

按照“去除重复劳动,提高工作效率”的原则,用python尝试做做看。

先把工作流想明白,大体是:

  1. 把MTM按行存放在文本文件里
  2. 按行读取文本文件,获取MTM
  3. 建立一个工作簿, 包含的工作表数量就是MTM数量,目的是每个MTM一张表,分别存放自己的BOM信息
  4. 登录服务器抓取每个MTM 信息
  5. 将MTM信息写入相应工作表
  6. 保存工作簿

工作流想明白了,下面还得琢磨琢磨需要的功能模块

  1. 抓取数据,这次我决定用十全大补汤BeautifulSoup模块。Selenium模拟浏览器大法虽然逻辑简单,但太费资源,打工人没有一MB内存是多余的…
  2. 由于MTM列表和存放结果的Excel表格我都准备放在桌面上,所以还得想办法获取用户桌面的路径,毕竟每个人的用户名都不一样。经过百度,用winreg模块读取注册表的桌面路径是个好办法。
  3. Excel这块肯定还是用无敌的openpyxl模块,就是我这基础知识,唉,百度着来吧…

想明白了需要的模块,那就把哥儿几个都招呼进来:

1
2
3
4
5
import requests 
from bs4 import BeautifulSoup
from openpyxl import Workbook
from openpyxl import load_workbook
import winreg

下面我把包含MTM number的文本取名mtmlist.txt,然后放到桌面。下面就可以先读取桌面路径了.

1
2
3
4
#读取当前用户桌面路径
key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r'Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders')
mydesktop = winreg.QueryValueEx(key,"Desktop")[0]
mydesktop = mydesktop.replace('\\', '\\\\')

用\\\\替换\\是因为Python的”\“字符另有用处,要想得到 C:\ABC\DEF这样的结果,就得这么干。这是我这次的第一个大收获,就这地方我研究了一晚上…

下面就是读取mtmlist.txt然后根据MTM数量建立工作簿.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#读取MTM Text
with open(mydesktop+'\\\\mtmlist.txt') as f:

MTMlist = f.readlines()

#预先创建结果保存的表格

wb = Workbook()

for i in MTMlist:

ws = wb.create_sheet(i)

ws.title = i

如何根据MTM长度建立工作簿也让我闹腾半天。究其原因还是快速学习带来的基础知识不牢靠,以及在此基础上大量时间用来分析和测试

下面就是第4步,抓取信息。 按说最核心的部分,结果以看居然成了最简单的,唯一的问题是源数据表格的定位,这是第三个大收获.

需要引用页面中第n个表格,则方法是:

tables = soup.find_all(‘table’)

table = tables[n]

嗯嗯,这下妈妈再也不用担心我们找不到自己想要的表格了。顺便想问一句,为什么程序员大哥开发页面时,这么爱用表格…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#抓取MTM信息
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)'
'Chrome/51.0.2704.63 Safari/537.36'}
for i in MTMlist:
res = requests.get(这段信息被我老人家加密了,因为是公司内部信息...想看这里请购买VIP会员,免费送老师的学习资料哟~~~)
html = res.text
soup = BeautifulSoup( html,'html.parser')
tables = soup.find_all(这段信息被我老人家加密了,因为是公司内部信息...想看这里请购买VIP会员,免费送老师的学习资料哟~~~)
table = 这段信息被我老人家加密了,因为是公司内部信息...想看这里请购买VIP会员,免费送老师的学习资料哟~~~
ws = wb.worksheets[MTMlist.index(i)+1] #我勒个去,不这么干的话存MTM BOM信息会从一个叫sheet的表格开始...
lists = []
for tr in table.find_all(这段信息被我老人家加密了,因为是公司内部信息...想看这里请购买VIP会员,免费送老师的学习资料哟~~~):
for td in tr.find_all(这段信息被我老人家加密了,因为是公司内部信息...想看这里请购买VIP会员,免费送老师的学习资料哟~~~):
lists.append(td.text)
ws.append(lists)
lists.clear()
list1 = ['MTM number',i] #这三行的目的是把MTM No写在工作表尾部
ws.append(list1)
ws.delete_rows(1,1)

最后,把看着讨厌厌而且还不知道怎么搞出来的多余Sheet表格删掉,只要我不尴尬,尴尬的就是别人,哈哈。

1
2
3
4
#处理表格并保存到桌面,嗯,桌面乱哄哄显得专业   
ws = wb['Sheet']
wb.remove(ws)
wb.save(mydesktop+'\\\\MTM_boms_list.xlsx')

经测试,获取30个MTM的BOM信息才用了不到20秒,这要是自己一个一个拿手做,嘿嘿。

能力和时间所限,程序还不完整,比如没考虑如果MTM查不到应该怎么处理,比如如果能做个图形界面是不是更好看。好在我始终没忘了自己的初心,那就是:

大哥,就咱这水平,能用就行了,真的,别那么多要求了

啰啰嗦嗦把这个小项目说完,其实我还是挺感慨的。大学时学过C和Java,可是除了会打个Hello world或者算个1+1,然后应付应付考试,编程这块真的一点都不会。Python作为我现在解决重复劳动的主要工具,边学边实践,到现在能写个简单的小程序小脚本,真的挺好玩儿的。Python作为目前最火的语言,甚至出现在孩子们的编程课里,其实是有道理的。不需要理解复杂的面向对象的概念,编程过程基本和实际生活中的问题解决思路贴合,如果愿意,挤出写蹲马桶看手机的时间,边学边练,还是能有点收获的。

您可能也看到了,除非是涉及公司内部信息,我是非常乐于公开我的源代码的,原因只有一个,我被开源思想洗脑了。。。 水平差的,通过开源获得让大牛指导的机会;自己就是大牛的,则能通过开源让更多人分享自己的思想。你有我有全都有,岂不快哉。

我其实很乐意在github上搞个仓库,把自己写的东西开源在上面,何等拉风。慢慢来吧。

对了,说好要写的超级无敌写作王者 Markdown语言的分享还得等等,现在某人给俩米留的作业那叫一个多,一个文艺青年每天晚上净盯着孩子写作业了,这就是生活…

以上,晚安。