今天想在北航教务网找找ACM的校内赛如何报名,结果发现校务处网站的搜索就是一个摆设。这就很尴尬了,难不成要我一页一页翻通知?刚好学了学re库,所以写一个简单的小爬虫来爬取北航的通知列表!
1.分析
北航教务网站上新闻的url是这个格式。显然通过修改xwid的值就可以访问所有的新闻了。
http://jiaowu.buaa.edu.cn/bhjwc2.0/index/newsView.do?xwid=126
分析一下页面的源码,可以看到发布信息存储在这里
1 <div class="search_con mt20 text_cen font18 blue LH36 font_hei">关于2016-2017学年第一学期全校本科生课表确认的通知 </div> 2 3 <span class="search_con mt10 text_cen LH20" > 4 发布时间:2016-10-08 发布者:王晓飞 所属科室:教学运行服务中心 5 </span> 6
那思路就很清晰了。遍历xwid,然后用正则表达式过滤内容,存入文件即可.
2.编码与调试
主要的困难还是对于正则表达式掌握的不熟练
import urllib import urllib2 import re class BUAA_jiaowu: baseurl= 'http://jiaowu.buaa.edu.cn/bhjwc2.0/index/newsView.do?xwid=' def get_HTML(self,xwid): try: url=self.baseurl+str(xwid) request = urllib2.Request(url) response = urllib2.urlopen(request) return response.read() except urllib2.URLError,e: print e.reason return None def get_title(self,xwid): page=self.get_HTML(xwid) P=re.compile('<div class="search_con mt20 text_cen font18 blue LH36 font_hei">(.*?)</div>',re.S) filter=re.search(P,page) return filter.group(1).strip() def get_data(self,xwid): page=self.get_HTML(xwid) P=re.compile(' <span class="search_con mt10 text_cen LH20" >(.*?) ',re.S) filter=re.search(P,page) return filter.group(1).strip() ################################################## catch=BUAA_jiaowu() file=open("result.txt","w") for xwid in range(0,1269): title=catch.get_title(xwid) data=catch.get_data(xwid) print 'Catching The Title Of No.'+str(xwid) if len(title)>1: print title file.write('xwid='+str(xwid)+' '+data+' '+title+' ') else: print 'Nothing Here' print 'down'
3.后记
没什么技术含量但是挺实用的小程序。主要目的是练习正则表达式,顺便娱乐一下。
(ps:还抓到了若干条官网上没有列出的通知...Interesting)