最近因为手里头需要不断查看某校的新闻发布,不想频繁的刷新网页,于是就有了下面的这个轻量级的爬虫出现了,闲言少叙,步入正题~
环境介绍:
python 2.7
BS4(这是一个强大的三方moudle,现在关于这个moudle的掌握还在学习中~)
待爬取的网页:
yjsc.shnu.eds(上海师范大学全日制研究生招生信息)
首先,分析下网页的源码,关于这一步,网上很多教程,有用软件的,有用浏览器自带的源码翻译功能的,我直接用python的urllib2进行操作,首先获取这个网页的源码,我的代码如下:
import urllib2
html_doc = urllib2.urlopen("http://yjsc.shnu.ed").read()
print html_doc
上述代码在执行后会在idle里显示一大段的字符串,这个就是网页的源码,保存idle中的内容到记事本(最好是那种可以对html文件高亮的记事本,我用的是sublime text3)中去即可查看网页源码,这里就不在贴出对应的网页源码了。
其次,在得到网页的源码之后分析我们要找的内容所在位置,这里就不科普html的文件格式了,不懂的同学可以自行百度google。通过查看源码,定位到我需要的资源(其中一个)位置在下图位置:
其中,tag“a”中的title字段包含了新闻标题,tag“span”字段包含了新闻时间。快速定位之后就可以针对网页源码进行分析了,这里就要用到上面提到的BS4。
BS4,beautifulsoup,官方解释自己百度吧-_-
BS4在使用是需要导入库文件,它可以接受一段字符串以及一个本地的HTML文件来创建一个soup对象,这里用的就是上面代码中产生的html_doc作为soup的源文件。在导入这个库文件之后,我们的html文件就会被soup对象格式化输出,可以针对某个tag进行字符串的获取,这个相比于re,简直不能再幸福~
在这次的爬虫中,因为只需获取新闻标题以及时间,所以我只是用了soup对象的两个字段:title以及span,这里可能有的会问,title比较好获得,可以通过指定tag名字来得到,但是时间呢,时间可是span的字符串啊,在re中,要想获得时间的确需要组织一下正则表达式,但是有了BS4,可以直接调用span.string来获得字符串的文字信息~~~对,就是这么简单!
最后,因为设计时采用了两个列表来分别表示新闻标题以及新闻时间,所以最后在输出的时候还需要将讲过列表中的字符串进行整合才能达到理想中的效果,整个爬虫的代码如下:
from bs4 import BeautifulSoup
import urllib2
html_doc = urllib2.urlopen("http://yjsc./Default.aspx?tabid=11776").read()
soup = BeautifulSoup(html_doc)
l_title = []
l_date = []
news = []
for link in soup.find_all('a'):
if link.get("title"):
l_title.append(link.get("title"))
for link in soup.find_all('span'):
if link.string:
l_date.append(link.string)
for i in range(0,3):
l_date.pop()
for i in range(0,len(l_title)):
str1 = l_title[i] +" "+ l_date[i]
news.append(str1)
for i in news:
print i
最终结果如下图:
达到预期目标~