问题描述:每日登陆系统下载数据表

公司上了新项目,我需要每日对项目的业绩情况进行数据统计,服务商提供了一个网址,我需要每日通过用户名和密码登陆这个网址去下载数据报表。

由于某些奇葩的原因,每增加一个区域,就要新开设一个账户!!!

最终,现在每天我需要使用7个不同的账户,去同一网址下载相同类型的报表,非常耗时!!!

问题解决:通过requests,模拟登陆,抓取数据报表

1、分析登录过程

打开火狐浏览器,清除cookies,打开登陆的页面,按下F12




火狐浏览器查看网站cookies 火狐浏览器查看session_用户名


选择“网络”,勾选“持续日志”

输入,用户名,密码点击“登陆”,此时便看到,开发者工具下面,显示了很多请求过程,首先映入眼帘的便是这个“login”


火狐浏览器查看网站cookies 火狐浏览器查看session_时间戳_02

处于保密问题,隐去了具体的链接


进入其详情页面:


火狐浏览器查看网站cookies 火狐浏览器查看session_时间戳_03


我们可以看到一个post请求,其中响应头中包含一个“set-cookie”,说明cookie就是在这里设置的。


火狐浏览器查看网站cookies 火狐浏览器查看session_用户名_04


在参数里面,显示一个mobile,password,就是我的登录的用户名和密码

关于appid,每次登录的时候,使用不同账户登录的时候,appid 居然是一样的!!!

以上,就是整个的登录过程,向这个“请求网址”,以json格式post三个数据,即可获取这个cookie

2、分析数据下载过程

当我输入查询的日期区间,点击查询的时候,开发者工具下面,显示了一个请求:


火狐浏览器查看网站cookies 火狐浏览器查看session_时间戳_05


进入其详情页面:


火狐浏览器查看网站cookies 火狐浏览器查看session_数据_06


这是一个get请求,startdate,end_date 就是我输入日期的开始日期和结束日期的时间戳,这里的cookie,就是登陆时set-cookie的值,点击“响应”


火狐浏览器查看网站cookies 火狐浏览器查看session_数据_07


这个json格式的数据,就是我每天下载的数据

至此,数据下载过程就是,向这个“请求网址”发起get请求,所返回的json数据就是我需要下载的数据

3、过程梳理

这样,整个的登录和数据下载过程可以总结为:

构造post进行登录获取数据cookie,利用cookie,发起get,获取返回的json数据,即可!

4、代码编写

import requests  
import json
import time
import pandas as pd

#构建时间戳转换函数
def datetime_to_timestamp(datetime):
    '''时间转时间戳'''
    timeArray = time.strptime(datetime, "%Y-%m-%d %H:%M:%S")
    timeStamp = int(time.mktime(timeArray))
    return timeStamp

#开始模拟登陆,获取cookie
appid='XXXXXXX'  #固定的appid
url_post=r'https://XXXXXX.com/api/v1/user/login' #构造post的请求网址

#需要post的内容
data_post={
            'appid':'前面固定的appid',
            'mobile':'用户名',
            'password':'密码'
            }
#按照上述截图构建get,post 的header
headers_post={
             'Accept':'XXX',
             '':''
             }
#构造session ,它可以帮助我们维持一个会话,并且自动处理cookie,
session =requests.Session()
#发起post模拟登陆
response_post=session.post(url=url_post,data=json.dumps(data_post),headers=headers_post)
#通过session 获取cookie
Cookie=r'sid=%s'%response_post.cookies.values()[0]

#获取cookie 之后就开始get请求数据了
#确定开始日期
start_date='2020-02-22 00:00:00'
end_date='2020-02-22 23:59:59'
    
start_date_stamp = datetime_to_timestamp(start_date) #转化为时间戳
end_date_stamp = datetime_to_timestamp(end_date) #转化为时间戳

#开始构造get请求
url_get=r'https://XXXXXXquery?start_date=%s&end_date=%s&page_size=1000&page=1'%(start_date_stamp,end_date_stamp)
#构造header
headers_get={
             'Accept':'XXX',
             '':''
             }
#发起请求
response_data=session.get(url=url_get,headers=header_get)
#json 解析获取的数据
js=json.loads(response_data.text)
data_need=js['data']['results']
#截止这里,data_need 中就是我们需求的数据了
#数据用pandas 就可以愉快的处理了
data_pd=pd.DataFrame(data_need)

#以上就是整个数据获取的流程了