概述
前情提示:
因工作需要,每日需要从公司ERP系统中读取各个分校的每日业绩以及往期业绩,制作业绩排名情况表(包含的指标包括各个分校的每日业绩,本月业绩,往期业绩等)。
这里涉及的几个困难点是:
1,我所在项目组包含考研、考研MPAcc、管理类硕士事业部三大项目,需要各自单独查看分校各部分业绩然后求和。
2,部分分校的实际架构与ERP不完全符合,需要进一步处理。具体情况是辽宁分校实际分为辽宁大连及其他地市两部分,每次需要统计辽宁分校的业绩以及其下属架构大连的业绩,再二者相减得到其他地市业绩。
3,每次需要各个分校的往期业绩,工作量翻倍
如下图所示,图1为初始各公职项目的业绩情况,点击各公职项目名称进入图2,显示该项目所有分校的业绩情况;点击图2中的各分校进入图3,显示该分校各地市的业绩情况。
接受该工作时,每日需要到各个界面复制粘贴分校的业绩,因为有不同时间、不同分校、不同项目多个维度,浪费大量时间,因此我利用爬虫对其进行自动化处理,大幅缩小了工作耗时。具体python爬虫代码见下方。
图1 各项目情况表
图2 各分校业绩情况
图3各地市业绩情况
处理步骤
1,通过fiddler软件获取登录的session信息,用requests登录
2,查看网页url信息,其实际情况如下所示,在设置好地区id(area_id),项目id(job_id)以及初始时间(start_time)结束时间(end_time)后,变可获取其url。
实例如下http://nb2.offcn.com:88/index.php/ProjTypeStat/JobArea/area_id/893/job_id/33/start_time/2019-01-01/end_time/2019-11-01 其中的area_id 893,job_id 33,start_time/2019-01-01及end_time/2019-11-01 为填写项。
3,对具体网页html的解析,获取选定时间内、各分校某项目的业绩
4,数据计算保存,自动形成各分校业绩的excel表
具体代码
#导入所需库
import requests
import csv
import re
import json
import xlwt
from lxml import etree
import numpy as np
import datetime
class erppachong:
def __init__(self,starttime,endtime):
self.starttime=starttime
self.endtime=endtime
def setSession(self):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
#隐藏了账户密码
#通过session登录erp
data = {'username': '********', 'password': '******', 'submit': '+',
'__hash__': '800d8b54a4ab42f29ba81beef3f21e23_76c466a7f664e9418e0a86834f35d4cb'}
login_url = 'http://nb2.offcn.com:88/index.php/Public/login'
self.session = requests.Session()
resp = self.session.post(login_url, data=data)
print(self.session.cookies.get_dict())
#时间处理函数,通过datetime包将选择日期转换为去年同期日期
def timechange(self,time1):
t2 = datetime.datetime.strptime(time1, '%Y-%m-%d')
year = t2.year - 1
month = t2.month
day = t2.day
print(type(year))
time2 = datetime.datetime(year, month, day, 0, 0, 0)
time2=time2.strftime('%Y-%m-%d')
print('日期从%s转换到%s'%(time1,time2))
return(time2)
def getHTMLcontent(self,url): # 发送访问请求
resp = self.session.get(url)
html = resp.content.decode('utf-8')
return html
#对辽宁分校进行特殊处理
def get_liaoning(self,url):
html=self.getHTMLcontent(url)
redalianerji=re.compile('辽宁-大连考研二级</a>.*?">(.*?)&',re.S)
redalianshi=re.compile('辽宁-大连市</a>.*?">(.*?)&',re.S)
dalianerji=re.findall(redalianerji,html)
dalianshi=re.findall(redalianshi,html)
dalianerji1=0
dalianshi1=0
print(len(dalianerji),len(dalianshi))
if len(dalianerji):
dalianerji1=dalianerji[0]
if len(dalianshi):
dalianshi1=dalianshi[0]
return(dalianerji1,dalianshi1)
def getdata(self,html, endtime):
#通过正则找出各分校的业绩
refenxiao = re.compile(
'end_time/%s">(.*?)</a></td><!--<td>0.00 </td>--><td style="text-align: right;">.*?&' % endtime,
re.S) # .*right;">(.*?) 
reyeji = re.compile(
'end_time/%s">.*?</a></td><!--<td>0.00 </td>--><td style="text-align: right;">(.*?)&' % endtime, re.S)
#print('%s"<(.*?)</a>' % endtime)
reliaoning = re.compile('<a target="_self" href="(.*?)">辽宁<')
liaoning = []
fenxiao = re.findall(refenxiao, html)
yeji = re.findall(reyeji, html)
liaoningurl = re.findall(reliaoning, html)
print('liaoning', liaoningurl)
if len(liaoningurl):
url = 'http://nb2.offcn.com:88/' + liaoningurl[0]
dalianerji, dalianshi = self.get_liaoning(url)
fenxiao.append("大连二级")
fenxiao.append("大连市")
yeji.append(dalianerji)
yeji.append(dalianshi)
return (fenxiao, yeji)
def download(self):
kaoyan = '33'; # 考研是33 mpacc111 考研管理类23
mpacc = '111'
guanlilei = '23'
daima = [kaoyan, guanlilei, mpacc]
session = self.setSession()
f = xlwt.Workbook(encoding='utf-8')
sheet1 = f.add_sheet(u'每日业绩', cell_overwrite_ok=True)
rowtitle = [u'分校1', u'考研业绩', u'分校2', u'考研管理类业绩', u'分校3', u'考研MPAcc业绩', u'分校3', u'往期考研业绩', u'分校3', u'往期考研管理类业绩']
for i in range(len(rowtitle)):
sheet1.write(0, i, rowtitle[i])
for i in range(0, 3):
url = 'http://nb2.offcn.com:88/index.php/ProjTypeStat/JobArea/job_id/' + daima[i] + '/start_time/' + self.starttime + '/end_time/' + self.endtime
html = self.getHTMLcontent(url)
fenxiao, yeji = self.getdata(html, self.endtime)
print(len(fenxiao), len(yeji))
for j in range(len(fenxiao)):
sheet1.write(j + 1, 0 + i * 2, fenxiao[j])
sheet1.write(j + 1, 1 + i * 2, yeji[j])
starttime2 = ""
endtime2 = ""
starttime2=self.timechange(self.starttime)
endtime2 = self.timechange(self.endtime)
print("starttime", starttime2, "endtime", endtime2)
for i in range(0, 2):
url = 'http://nb2.offcn.com:88/index.php/ProjTypeStat/JobArea/job_id/' + daima[
i] + '/start_time/' + starttime2 + '/end_time/' + endtime2
print(url)
html = self.getHTMLcontent( url)
# print(html)
fenxiao, yeji = self.getdata(html, endtime2)
print(len(fenxiao), len(yeji))
for j in range(len(fenxiao)):
sheet1.write(j + 1, 0 + i * 2 + 6, fenxiao[j])
sheet1.write(j + 1, 1 + i * 2 + 6, yeji[j])
f.save(self.starttime + self.endtime + '.xls')
def main():
starttime="2019-01-01"
endtime="2019-12-22"
erp=erppachong(starttime,endtime)
erp.download()
if __name__=='__main__':
main()
最后
以上就是俭朴向日葵为你收集整理的python爬取erp每日业绩具体代码的全部内容,希望文章能够帮你解决python爬取erp每日业绩具体代码所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复