IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python自动化脚本的应用实例分享系列一:进度统计脚本 -> 正文阅读

[Python知识库]python自动化脚本的应用实例分享系列一:进度统计脚本

场景

小T负责运维一个业务系统,并辅助做一些运营工作。每个月要从两个不同的系统中找到填报单位的填报状态(已提交,未提交),按照特定的表样和顺序录入到excel表,然后发送到微信群里。

分析

  • 小T每月都手动统计两个系统中各个填报单位的状态,耗时耗力,重复性工作,可以通过自动化脚本实现自动化抓取数据,因此从两个系统的web页面上自动抓取所需数据是程序的主体。
  • 系统中各个公司填报状态页面集中在一个web页面中,小T希望在发送进度统计表在微信群前,先人工核对下程序结果是否正确。可以考虑程序设计中有截图功能,这样程序运行后,不仅仅有进度统计表还有页面截图,小T不必再上系统进行核对。
  • 因为是从两个不同的系统中查询填报单位的填报状态,之前手工做的时候需要建立两个sheet页面,通过自动化脚本实现进度统计的需求,考虑尽可能延续手工方式的逻辑和表样,只是将手工操作的步骤进行自动化,所以使用之前的表格形成一份程序的模板表。程序读入模板表的基础上进行数据整理。
  • 可将爬取的数据结果表作为中间表,然后程序读入模板表,将中间表的数据匹配到模板表的位置上作为输出表,同时考虑到之前每次小T在群里发送统计结果后,总有填报单位不明白统计的标准或者在统计时间之后填报,再问为什么统计结果不是最新的,因为为了避免重复回答类似的问题,可以将统计时间和统计标准附在进度统计表的最后。
  • 程序涉及到的文件种类比较多,为了避免混乱,因此分别建立“中间表”、“截图”、“输出表”、“配置表”这几个文件夹来保存对应类型的文件,在正式的爬虫程序前,先执行一个清空上述文件夹目录的函数,这样保证每次输出结果都是当次结果。

流程图

?实现

网站A抓取

通过chrome浏览器,F12分析network可以得到网站A中各单位填报进度,数据格式是json格式,因此,采用requests,分析参数,获取数据。

需要登录

网站A需要登陆,才能找到各个填报单位的进度汇总界面,因此,需要基于selenium自动登录网站,登录后获取cookies,在后续的爬虫函数中再加载cookies,可解决需要登录问题。

登录后获取cookies

login函数

# 先登录,然后获取cookies
c = driver.get_cookies()
cookies = {}
# 获取cookie中的name和value,转化成requests可以使用的形式
for cookie in c:
    cookies[cookie['name']] = cookie['value']
return cookies

getData函数

Cookies=login ()
response = requests.post(,,cookies=cookies,,)

?爬取主体

response = requests.post(myurl, headers=headers, params=params, cookies=cookies, data=data, verify=False)
data = tablib.Dataset()
data.json = response.text
open('./中间表/网站A数据.xls', 'wb').write(data.xls)

补充:分析参数,构建headers中用到的好用工具

一键构造请求头

https://curl.trillworks.com/

或可用postman替代,前者新手友好,后者使用更广泛。

网站B数据爬取

网站B比较特殊,通过chrome浏览器,F12分析network,无法获得数据,网站B是一个静态网页,可以考虑换个思路获取网站B的网页html代码,我们所需的进度统计数据,在一个table中,可以通过BeautifulSoup解析网页源代码中的tr,td来得到想要的数据。通过selenium来登录,点击到对应界面,然后获取数据。

?getDataB函数

# 先点击到web页面中
# page_source得到当前网页的源代码
soup = bs(driver.page_source, "html.parser")  
# 定位到到源代码中对应的table
table = soup.find_all('table')[1].tbody;

file = xlwt.Workbook()  # 新建一个excel
outtable = file.add_sheet('网站B数据')
table_row = 0  # 这是行数,从0行开始写

# 将数据写入excel表中
row = 0;
for tr in table.find_all('tr'):
    col = 0;
    for td in tr.find_all('td'):
        tet = td.getText()
        # print(tet)
        outtable.write(row, col, tet)
        col = col + 1;
    row = row + 1;
file.save('./中间表/网站B数据.xls')

难点:只能抓半屏数据

按照上面的方案,发现得到的数据缺失,每次只能抓上半屏的数据,将进度条拉下来后,再解析源代码,是下半屏的数据,将两屏的数据追加在一起,然后去重,即可得到完整的数据。

首先考虑拉进度条的方案,但是不起效果。
后改变思路通过热键方式替代,只要点击到table的第一行的某列上,然后连续按下若干个下箭头,即可实现下拉的效果

for i in range(30):
    ActionChains(driver).key_down(Keys.DOWN).perform()
    time.sleep(0.1)

下拉完成后,重新上面获取源代码,解析源代码的过程,即可获得新的数据。

#将两屏的数据追加在一起,然后去重
df = pd.concat([df1, df2], axis=0, ignore_index=False)  # 将df2数据与df1合并
df = df.drop_duplicates()  # 去重

截图

通过selenium在web相应页面中截图即可。

try:

    nowTime = time.strftime("%Y%m%d_%H_%M_%S")
    pic = driver.get_screenshot_as_file('./截图/系统截图_%s.png' % nowTime)
    print('截图成功')
except:
    print('截图失败')

数据整理

将多个分散的中间表按照模板格式汇总成一张表。
读入模板表,将模板表数据和结果表做匹配,然后再写回到模板表中,此部分是操作excel,方法不唯一,这个需求场景下,选用了openyxl包。

dataA=pd.read_excel('./中间表/网站A数据xls')
data_template=pd.read_excel('./配置表/模板.xlsx')
#将模板表和数据结果表左联
dataout=pd.merge(data_template, dataA,left_on='XX ',right_on='XX',how='left')

更多细节处理,不再赘述。

EXCEL格式处理

在excel表中页面下方位置追加文字,说明统计时间和统计标准。

wb = load_workbook('./中间表/dataout.xlsx')
# 源数据
mysheet = wb.get_sheet_by_name('sheet表名 ')
# 指定行列给单元格赋值
mysheet.cell(row=ROW + 3, column=COL, value='统计标准说明:XXXXXXXXXXXXXXX,')
mysheet.cell(row=ROW + 4, column=COL, value='统计时间{}'.format(datetime.now().strftime("%Y-%m-%d %H:%M")))

如果未提交,则标黄

fill1=PatternFill("solid",fgColor=colors.YELLOW)
for row in mysheet.iter_rows(min_row=1,max_row=ROW+2,max_col=2):
    for cell in row:
        if cell.value=='未提交':
            cell.fill=fill1

设置列宽

mysheet.column_dimensions["A"].width = 40

总结

之前需要手工登录网页,找到数据,然后将数据复制粘贴下来,然后在登录另外一个网站,找到数据,将数据复制粘贴下来,然后再整理表格,时间需要40分钟左右,通过自动化脚本,时间只需要5分钟即可完成。
在触发方式上,目前脚本是手动触发执行的,实际上,在业务涵义上,统计时间是固定的,因为可以做成定时脚本触发。这时,可以在程序中增加自动发送邮件的模块。
但是目前程序还不稳定,偶尔会报错,所以并未做成定时触发,发送邮件的形式。
?

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-09-05 10:46:11  更:2021-09-05 10:50:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 13:32:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码