某航上网明细爬取

毕设答辩结束,马上就要毕业了,之后要去别的学校读研,临走之际突然想爬一爬这几年在我航留下的痕迹,然后就决定爬爬校园网认证计费系统里边的上网明细。此为背景。

本文章仅用于学习、交流,请不要滥用。多谢!

1、项目的需求分析与技术方案拟定

要想获取上网明细,首先要进入自服务系统。自服务的登录界面不仅要输入账号密码还要输入验证码。所以普通的方法是不行的。通过多方调研,最终决定采用手动登入获取cookie,利用该cookie向自服务系统发送get请求,以获得包含上网明细的html

自服务登入界面:

上网明细:

2、cookie获取

这个很简单,登入自服务,然后进入上网明细页面。我用的是Chrome,点击网址左边的 “不安全”,可以看到cookie,点进去

然后就可以获得两个cookie名称以及其内容:

3、数据爬取

代码如下,cookie的名称和内容打码处理了。

整体的功能就是把所有包含上网明细的页面爬下来,然后每个页面存到一个txt文件里,所有的txt放在一个scrape data的文件夹里

程序里边有个休息1s的指令,可以缩短一点,但是一定要有。学校的服务器一般经不起折腾,短时间内访问量不宜太大。

import requests
import time
import os
#create path
directory = './scrape data'
if not os.path.exists(directory):
    os.makedirs(directory)
urlBase = 'http://10.254.20.121:8800/log/detail/index?page='
cookie = {'PH*************': 'g1************************7', '_c*******': \
          '''31***********************************************************************D'''}
totalNum = 17910 
numPerPage = 10
for index in range(0, (totalNum // numPerPage) + 1):
    url = urlBase + str(index) + '&per-page=10'
    html = requests.get(url, cookies=cookie)
    html.encoding = 'utf-8'
    #write data to txt tile
    fileName = directory + '/page' + str(index) + '.txt'
    with open(fileName, 'w') as fp:
        fp.write(html.text)
    #请务必温柔对待学校的服务器
    time.sleep(1)
    print('page ', index, 'download!')
print('finished!')
#成功获取了2016年以来的的流量数据

不知为何,最久远的数据也只到2016年,但是总算是把上网明细里边所有的数据都爬下来了

4、数据清洗

获取了所有的数据之后,需要整理里边的数据,把有用的部分提取出来。

代码:

import re 
import csv
dic = {}
totalNum = 17910
numPerPage = 10
directory = './scrape data'
csvFile = 'cleanData_final.csv'
#创建csv文件并写入, newline=''消除多余的空行
with open(csvFile, 'w', newline='') as fout:
    writer = csv.writer(fout)
    writer.writerow(('loginTime', 'logoutTime', 'IP', 'payment', 'usage', 'duration', 'fee'))
for index in range(0, (totalNum // numPerPage) + 1):
    #read data to txt tile
    fileName = directory + '/page' + str(index) + '.txt'
    with open(fileName, 'rt') as fp:
        for line in fp.readlines():
            r = re.match('^<tr data-key', line)
            if r:
                splitData = line.split('</td><td>')
                print(splitData[1], splitData[2], splitData[3], splitData[4], 
                                  splitData[5], splitData[6], splitData[7].split('</td>')[0])
                #追加模式写入
                with open(csvFile, 'a', newline='') as fout:
                    writer = csv.writer(fout)
                    writer.writerow((splitData[1], splitData[2], splitData[3], splitData[4], 
                                  splitData[5], splitData[6], splitData[7].split('</td>')[0]))
            else:
                pass

最后获得的csv文件:

有了这些数据,就可以做进一步的工作了,比如可视化分析等等,不再赘述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值