0.前言
许久没有更新了,这一阵子忙着配置环境,老是出错,搞得人心情烦躁。接下来估计更新要摸鱼一段时间,好多事情要忙,还有英语六级,烦。
说回正事,每次去图书馆都要预约,有的时候到了图书馆才发现人满了,让人非常难受。所以就写了这个爬虫,它的功能就是告诉你现在图书馆还有多少空位——嗯……虽然没有什么实用性,不过还是花了我半个多小时,正好水一篇。

1.思路
一开始想上scrapy框架的,后来发现不要大动干锅。因为实在是太简单了——要是狠一点连beautifulsoup都不需要用,直接正则表达式就能出来——事实上正则表达式速度还快一点,要是提前算好字符数,还能优化的更快——我是没这个功夫。我将两种提取信息的方法都附上,有兴趣的话可以自己试试优化。
其余都是常规操作
2.全部代码
import requests
from bs4 import BeautifulSoup
import re
libray_name=['明故宫图书馆二楼','明故宫图书馆三楼','明故宫图书馆四楼','将军路图书馆二楼','将军路图书馆三楼','将军路图书馆四楼',
'将军路图书馆五楼','天目湖社科馆','天目湖科技馆','天目湖文艺馆']
o_url='http://libgate.nuaa.edu.cn/home/book/more/lib/{num}/type/4'
link_url=[11,16,17,18,19,20,21,23,24,25]
all=[186,205,160,250,430,400,320,70,110,80]
ans=[]
def get_url(url):
headers={'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
}
res=requests.get(url,headers=headers)
return res
def get_num_left(n):
html = get_url(o_url.format(num=str(n)))
soup = BeautifulSoup(html.text, features="lxml")
big_list = list(soup.body.children)[23]
big_list = list(big_list.div.children)[1]
# print(big_list)
str1 = str(list(big_list.descendants)[16])
r = re.search(r'\d+人', str1).span()
return str1[r[0] + 26:r[1] - 8]
def get_num_left2(n):#不使用beautifulsoup
html = get_url(o_url.format(num=str(n)))
str1 = html.text
r = re.search(r'\d+人', str1).span()
return str1[r[0] + 26:r[1] - 8]
for i in link_url:
ans.append(get_num_left2(i))
for i in range(len(ans)):
print(libray_name[i],end=":")
print("还剩"+ans[i]+"人,共"+str(all[i])+"个座位")
print("天目湖校区共260个图书馆座位,不及将军路一层楼,湖区输!")
3.额外的话
湖区总共有260个座位,将军路平均一层楼有350个座位,我不理解,我大为震撼。