0x2a

Don't Panic.

Steve's avatar Steve

Python实现广州大学图书馆进馆人数爬取

前言

一次无意中发现广州大学图书馆官网页面底下有一个数值:

12-7-library-num.png

点开之后可以发现里面可以查询2016.12.27 – 至今 每个院的进馆人数数据。

分析

12-7-library.png

其中在指定时间统计 页面里面可以输入日期来统计.

简单抓包后发现提交的数据如下:

12-7-library-post.png

所以就可以利用 Python 的 requests 进行简单的数据爬取了.

代码

import json
import requests
import re
from datetime import datetime,timedelta

date_begin = '2016-12-27'
date_end = '2017-12-7'
date_now = date_begin
'''三个全局变量用作data数据内日期的变化
以实现可以自动获取历史所有进馆人数数据'''

def get_page(url):
    '''传入一个str类型网址参数作为url形参.以获得url的源码'''
    data = { 'begin' : date_now, 'end' : date_now}
    headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'}
    response = requests.get(url,params = data,headers = headers)
    if response.status_code == 200:
        return response.text
    return None

def parse_page(html):
    '''传入网页源码文本作为html形参,使用简单正则表达式去获取学院的进馆数据'''
    pattern =  re.compile('<td .*?>(.*?)</td>')
    items = re.findall(pattern,html)
    n = 0
    sum_n = 0
    for i in items:
        sum_n = sum_n + 1     
    while n < sum_n:
        yield{
            '学院' : items[n],
            '总人数' : items[n+1],
            '进馆人数' : items[n+2],
            '日期' : date_now
        }
        n = n + 4

def sum_day(html):
    '''主要用作获取每日总进馆人数 使用方法和parase_page函数一致'''
    pattern =  re.compile('<div.*?>.*?:(.*?)</div>')
    items = re.findall(pattern,html)
    yield{
        '日期' : date_now,
        '人数' : items[0]
    }

def write_to_file(content):
    '''传入文本写入json文件'''
    filename = 'text.txt'
    with open(filename, 'a', encoding='utf-8') as f:
        f.write(json.dumps(content, ensure_ascii=False) + '\n')


def main():
    '''主要函数,用作直接调用参数 改变url地址'''
    url = 'http://lib.gzhu.edu.cn:8080/bookle/goLibTotal/custom'
    html = get_page(url)
    for item in parse_page(html):#这里可选sum函数或者parse函数来获取说需要的数据
        print(item)
        write_to_file(item)

if __name__ == '__main__':
    while date_now != date_end:
        date = datetime.strptime(date_now, '%Y-%m-%d')
        date_now = (date + timedelta(days = 1)).strftime('%Y-%m-%d')#实现日期递增
        main()

结果

获取的json结果如下

12-7-library-json.png

用excel进行简单的数据可视化:

12-7-library-gzhu.png

12-7-library-wd.png

TODO List:

  1. 引入当天的天气情况,分析天气对进馆人数的影响。
  1. 分析每日进馆人数最相似的学院(利用皮尔逊系数)。
  2. 分析高考录取分数线不同对每个学院进馆人数的差别。
  3. 进行简单的人数预测。