加州大学伯克利分校暑课爬虫⊂(ο・㉨・ο)⊃
嗯mmmm,暑假要去伯克利上课,于是在伯克利的官网上找找想要上的课,但是选课的过程中发现伯克利官网不愧是外网,虽然没被墙但是略感有点慢。。。
于是就想着用爬虫把所有的暑课信息都扒拉到Excel里自己看看!!! (`・ω・´)
如图:伯克利的选课网站
本来的想法很简单,就是通过循环控制遍历所有网页并且将网页上有的选课信息全部给放到excel里就ok,但是,正当我想要一个一个在网页上找的时候,竟然发现伯克利似乎就是准备好给我们爬取一样,将所有的课程信息全部储存到了一个json文件里!!!
如图:选课网页的elements
这就很方便了(除了这个json太长了看的人眼花。。。。),只要取得这个data-json就能很方便地调出课程的所有信息!(某大教务处好好学学。。。)
代码如下:
import requests
import json
from bs4 import BeautifulSoup
#自己定义的一个处理字符串的函数
#作用是将形如:whoAreYou的字符串拆成who Are You(好像也没啥必要。。。)
def sparse(string):
re = ''
for letter in string:
if letter.isupper():
re+=' '
re+=letter
return re
Course=[]
#每一个网页的循环,暑课共有20页
for page in range(20):
#基础操作
url = 'https://classes.berkeley.edu/search/site?page={}&f%5B0%5D=im_field_term_name%3A1179'.format(page)
headers={
'User-Agent':'Chrome/77.0.3865.120',
}
res = requests.get(url,headers = headers).text
soup_Berkeley = BeautifulSoup(res,'html5lib')
#对于一个网页中的所有课程循环操作
for course in soup_Berkeley.find_all('li',class_='search-result'):
json_dict = course.div.get('data-json')
dt = json.loads(json_dict)
#获取标题和学分
#标题、学分
title = dt['class']['course']['title']
credit = dt['class']['allowedUnits']['forAcademicProgress']
#星期、地点、时间、教学楼
###特别注意!由于课程千变万化,很多课程甚至没有教学楼、没有老师。。。
###所以都要用try语句防止报错
try:
week = sparse(dt['meetings'][0]['meetsDays'])
except:
week = 'None'
try:
time = dt['meetings'][0]['startTime']+' To '+dt['meetings'][0]['endTime']
except:
time = 'None'
try:
location = dt['meetings'][0]['location']['description']
except:
location = 'None'
try:
building = dt['meetings'][0]['building']['description']
except:
building = 'None'
#课程要求、课程简介
#要求、课程介绍、开设方
try:
preparation = dt['course']['preparation']['requiredText']
except:
preparation = 'None'
try:
description = dt['course']['description']
except:
description = 'None'
try:
school = dt['course']['subjectArea']['description']
except:
school = 'None'
course = [title,credit,week,time,location,building,preparation,description,school]
Course.append(course)
#外网连接是真的慢,每爬完一面告诉自己一声,不然还以为死循环了呢o((⊙﹏⊙))o
print('Page:{} finished'.format(page))
以上只从json中提取了网页里有的一些信息,包括 课程要求、课程简介、开课时间、开课地点等,但是实际上dt中还有很多没有显示在网页上的信息,比如关于关于期末考试的。。。。 咳咳,感觉应该是往年的信息,伯克利教务处改了网页但是忘了改data-json属性了。。。感兴趣的同学可以自己到json里康康
ヽ( ̄ω ̄( ̄ω ̄〃)ゝ义气
数据展示
#同样也是基本操作
import pandas as pd
schedule = pd.DataFrame(Course,columns = ['title','credit','week','time','location','building','preparation','description','school'])
schedule.head()
结果如下:
顺手写入excel
schedule.to_excel('CourseSelection.xlsx')
Over!
Thank you for your precious time and patience.