前言
前言 工作中每天需要报日报,但公司的报表系统又无法直接SQL取数,只能从网页下载后自己做,每天要下载10多张表(还有许多限定条件),比较麻烦。所以想了一个笨办法来实现
实现过程
selenium(模拟网页进行取数)+pandas(构造数据)
步骤记录
- 开始的时候,试图通过bs4库进行网页取数,但卡在了用户登录的构造上(验证码及短信验证码,过于复杂),所以方向定在了selenium上;
- selenium的运行效率较低,使用chrome无窗口模式,提高运行效率
- 取数的页面通过get方式传参,使用fiddler抓到实际地址
- 通过source.text获取到返回的json数据,利用pandas操作获得想要的数据
- 为了方便复用,将实际截取的地址与表头(order)记录在excel中,方便以后进行添加
反思&待解决问题
1.实际上过程仅仅模拟了经分系统自动取数,并非进行数据分析及报表构造,报表构造依然通过excel公式进行;
2.pandas操作excel,后缀名不支持xlsm格式,目前没有找一个能使用VBA的方式,Excel的操作更习惯于使用VBA,特别是方便录制宏,或者直接通过PQ进行更新,使用pandas依然觉得不熟练和不方便。
代码
# -*- coding:utf-8 -*- # 建议所有都加编码
from selenium import webdriver #导入webdriver包
from time import sleep #等待休眠相关
import datetime #获取当前时间相关
import pandas as pd
from openpyxl import load_workbook
from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options
OAusername = "*****"
OApassword = "*****"
#chrome设置(最小化运行 提高运行速度)
opt = Options()
opt.add_argument('--no-sandbox') # 解决DevToolsActivePort文件不存在的报错
opt.add_argument('window-size=1920x3000') # 设置浏览器分辨率
opt.add_argument('--disable-gpu') # 谷歌文档提到需要加上这个属性来规避bug
opt.add_argument('--hide-scrollbars') # 隐藏滚动条,应对一些特殊页面
opt.add_argument('blink-settings=imagesEnabled=false') # 不加载图片,提升运行速度
opt.add_argument('--headless') # 浏览器不提供可视化界面。Linux下如果系统不支持可视化不加这条会启动失败
driver = Chrome(options=opt)
#driver = webdriver.chrome() # 使用chrom浏览器
driver.get("http://************.com/loginCenter/sms/login.jsp")
driver.find_element_by_id("jusername").send_keys(OAusername)
driver.find_element_by_id("jpassword").send_keys(OApassword)
driver.find_element_by_id