2021-04-02

你干活,我喝茶之从Len...

你干活,我喝茶之从Lenovo Solution Centre抓取MTM数据

重复劳动往小了说影响工作效率,往大了说影响生活质量,必须予以重视

话说某天,一个Geo的大哥给我发邮件,说PSREF上列的US MTM和Lenovo Solution Centre上的不一致。那么解决方式很简单,直接把Lenovo Solution Centre的MTM给抓下来,岂不美哉?

当然了,Lenovo Solution Centre已经提供了这个功能,只需要选择每个产品,然后分别导出数据,然后再切掉除了MTM以外的数据就行了。但是显然,如此明显的重复劳动,效率是极其低下的,试想,如果让程序自己把MTM都抓下来存在Excel文件里,岂不美哉? 废话不说,开干!目标已经明确,我们就是想要MTM这一列:

img

“今天的目标是进入Lenovo Solution Centre产品配置列表,把MTM列数据通通抓下来,然后存到一个Excel表里”

动手不着急,咱们先分析看看这个任务的流程和逻辑。

打开www.lenovosc.com, 进入产品页面需要两步:

先选择产品线:

img

然后选择产品:

img

然后GO,就能进入产品MTM列表,剩下的就是抓出MTM那列的数据,然后存到Excel里。所以基本的逻辑就是:

  1. 进入产品页面
  2. 抓取MTM列表数据
  3. 存入Excel表格

项目拆分完毕,下面就是确定实现方式。我的知识储备能用得上的就是两位爬虫界的主力,Beautiful Soup和Selenium。考虑到Selenium模拟浏览器的方式太费资源,我的小电脑跑起来总是很吃力,还老收到FBI Warning,我反正是不喜欢Selenium,咱们还是先Beautiful Soup煲汤好了。。。

一顿如狼似虎的操作,我直接卡在了选择产品那里。不管怎么弄,Beautiful Soup的key.click()就是无法选中产品,刚才还真香的排骨汤,现在彻底凉了,看着表面漂着的猪油,我一阵阵反胃,脑海里仿佛出现特朗普和拜登的嘲笑,星条旗好像慢慢就要盖住五星红旗,眼看就是一场危机。。。

“起来,不愿做奴隶的人们”。就在我满脑子浆糊想去洗手间坐会儿吸取天地之灵气的时候,脑海里突然浮现出这首雄壮有力的歌曲,顿时虎躯一震,FBI 的Warning信息此刻再也无关紧要,关闭了播放器,我重新打开VS Code,Selenium,真香,刚才我说话都是那个啥,您别往心里去…

1
2
3
4
from selenium import  webdriver 
import time
from openpyxl import Workbook
from openpyxl import load_workbook

随着坚定有力的复制粘贴,我决定对Selenium表示深深的歉意。是的,虽然Selenium模拟浏览器的方式效率实在那个啥,但是本着能用就行的不纠结定律,我还是不想为难自己,毕竟那些伟大的程序员脑袋就是纠结秃的,肤发受之父母,虐待自己就是不孝,这是一个合格的社会主义事业接班人不能允许的。

1
2
3
driver = webdriver.Firefox()
driver.get('https://lenovosc.com/usa/portfolio/system/thinkstation')
time.sleep(2)

这次我毫不犹豫让Selenium模拟火狐这个狐狸精。为什么不模拟Chrome?因为每次让Selenium模拟Chrome,都给我报点小问题,什么您冲个VIP吧,什么美女荷官在线发牌吧,什么澳门 and 拉斯维加斯吧,都是我这个小花朵一样的的接班人不懂的,所以,咱们就小狐狸算了,有点味道不算什么。

1
2
3
4
5
6
system_type = driver.find_element_by_id('system_type') #定位到下拉框
driver.find_element_by_css_selector("[value='1061']").click()
button = driver.find_element_by_class_name('btn.btn-lg.btn-info')
button.click()
print('开始倒计时')
time.sleep(10)

以上是进入产品页的代码.

而且从这个页面的源代码里,我们还能看到以下产品的value值,所以“一次获取全部产品的MTM”其实也就没什么难度了呢,大不了搞个循环就是了呢~~~

1
2
3
4
5
6
7
8
9
<option value="1061">P330</option>
<option value="1077">P330 Tiny</option>
<option value="1357">P340</option>
<option value="1370">P340 Tiny</option>
<option value="974">P520</option>
<option value="975">P520c</option>
<option value="1422">P620</option>
<option value="938">P720</option>
<option value="937">P920</option>

下面就进入产品页面了,这个页面的表格就是

,那抓出MTM也就不困难了。

1
2
3
mtm_table = driver.find_element_by_class_name('k-selectable')
mtm_line = mtm_table.find_elements_by_tag_name('tr')
ts = driver.find_elements_by_xpath('/html/body/div/div[2]/div/div/div/div/div[1]/form/div/div[2]/table/tbody/tr/td[4]')

嗯,装B遭雷劈。其实找MTM列这块我头大的厉害,毕竟xpath玩儿起来远比id class难,所以我特地请教了小齐老师,小齐老师是我学习的对象,简称我对象,嗯。

好了,东西有了,只要用个循环就可以得到MTM,然后建立一个列表存这些MTM

1
2
3
mtmlist = []
for i in ts:
mtmlist.append(i.text)

后面就是怎么把存放MTM的列表给存到Excel里了。这里我还费了老鼻子劲。怎么一行存一个MTM呢?搞了半天,openpyxl百度了一个遍,还是没有头绪。后来发现问题在于基础知识不牢固。

这是一个非常需要快速学习能力的时代,而快速学习的关键,是你要知道你需要知道你想干的事情,到底需要具备哪些领域的知识

原来只要用ws.cell(行,列,值)大法就能给单元格赋值,配上循环,逻辑简单,哦耶

1
2
3
4
5
6
wb = Workbook()
ws = wb.active
for i in range(len(mtmlist)):
ws.cell(row=i+1, column=1,value=mtmlist[i])
i = i+1
wb.save('H:\\Temp\\123.xlsx')

嗯嗯,123.xlsx,果然是我的风格,我很多文件都是abc-123这样的命名方式,都是跟加勒比海岸呀,什么东京有点热呀,什么一本二本道啊里面的老师学的呢~~~

写完作业再验证一下,用手动方式下载了MTM列表,一对比,还真是对呢

img

后续还有能优化的,比如把所有产品线的MTM都加上,比如把python转成exe然后设置为计划任务,这都是目前我的能力之内能搞定的,下面就是确定好方案稍加完善即可。

说点题外话,这段时间有功夫就写写Python,其实倒不是想转行干程序员,毕竟我这个岁数和小体格,拿程序员当职业怕是够呛。但是确实我们每天都在面对重复的劳动,面对着效率的低下,面对着日复一日年复一年的埋头干活。我想用一种方式来找到新的思路,能让自己换个角度看待身边的一切,想能有个时间抬起头看看天空。

我们当然有意愿升职加薪走上人生巅峰,但学习却不能以此为最终目标。目标太短视,一旦无法迅速完成会严重打击自己的学习动力。我们应该为了中华崛起而学习,为实现社会主义现代化而奋斗。。。

文章最后我就一个小问题,我什么时候能接班…