python爬取erp每日业绩

前情提示:

因工作需要,每日需要从公司erp中读取各个分校的每日业绩一起往期业绩,制作业绩排名情况表(包含的指标包括各个分校的每日业绩,本月业绩,往期业绩等)。
这里涉及的几个困难点是:
1,我所在项目组包含考研、考研MPAcc,管理类硕士事业部三大项目,需要各自单独查看分校各部分业绩然后求和。
2,部分分校的实际架构与erp不完全符合,需要进一步处理。具体情况是辽宁分校实际分为辽宁大连及其他地市两部分,每次需要统计辽宁分校的业绩以及其下属架构大连的业绩,再二者相减得到其他地市业绩。
3,每次需要各个分校的往期业绩,工作量翻倍
如下图所示,图1为初始各公职项目的业绩情况,点击各公职项目名称进入图2,显示该项目所有分校的业绩情况;点击图2中的各分校进入图3,显示该分校各地市的业绩情况。
接受该工作时,每日需要到各个界面复制粘贴分校的业绩,因为有不同时间、不同分校、不同项目多个维度,浪费大量时间,因此我利用爬虫对其进行自动化处理,大幅缩小了工作耗时。具体python爬虫代码见下方。
表1在这里插入图片描述
图1 各项目情况表
在这里插入图片描述
图2 各分校业绩情况
图3各地市业绩情况图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
3,对具体网页html的解析
4,数据保存

具体代码

#导入所需库
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&nbsp;</td>--><td style="text-align: right;">.*?&' % endtime,
            re.S)  # .*right;">(.*?)&nbsp
        reyeji = re.compile(
            'end_time/%s">.*?</a></td><!--<td>0.00&nbsp;</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()
发布了23 篇原创文章 · 获赞 6 · 访问量 4674

猜你喜欢

转载自blog.csdn.net/qq_34211618/article/details/103947899