毕设答辩结束,马上就要毕业了,之后要去别的学校读研,临走之际突然想爬一爬这几年在我航留下的痕迹,然后就决定爬爬校园网认证计费系统里边的上网明细。此为背景。
本文章仅用于学习、交流,请不要滥用。多谢!
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文件:
有了这些数据,就可以做进一步的工作了,比如可视化分析等等,不再赘述