Python网络爬虫:爬取古诗文中的某个制定诗句来实现搜索
python编译练习,为了将自己学习过的知识用上,自己找了很多资料。所以想做一个简单的爬虫,代码不会超过60行。主要用于爬取的古诗文网站没有什么限制而且网页排布很规律,没有什么特别的东西,适合入门级别的爬虫。
抓取目标站点的准备工作
Python的版本是:3.4.3.
爬取的目标是: 古诗文网(www.xzslx.net)
随意打开一个古诗文网的古诗页面,查看它的网页地址就能看到,古诗的地址基本是 “www.xzslx.net/shi/+ id + .html” 构成,如下图:
然后对古诗文网的古诗总览页面可以看到分页符 最下方:
总共包括29830篇古诗文可以抓取,确定了”/shi/”后面数字的范围。
html页面解析库:BeautifulSoup
安装方式是: $pip3 install BeautifulSoup4
主要参考文献:《python网络数据采集》第一、二章
代码解析:
#!usr/bin/python3#-*-coding:utf-8-*-importrefromurllib.requestimporturlopenfromurllib.erroeimportHTTPErrorfrombs4importBeautifulSoupdefgetPage(url):try:html=urlopen(url)exceptHTTPErrorase:returnNonetry:bsObj=BeautifulSoup(html)exceptAttributeErrorase:returnNonereturnbsObjdefgetUrl(pg):return''.join(('http://www.xzslx.net/shi/',str(pg),'.html'))f=open('./result.txt','wt')forpginrange(0,49149):html=getPage(getUrl(pg))cont=(html.findAll('div',{'class':'son2'}))ifcont!=Noneandlen(cont)>1:cont=cont[1].get_text()poem=cont[cont.find('原文:')+4:]sentList=re.findall(r'(.*?[。!?])',poem)forsentcinsentList:if'月'insentc:print(sentc,'\t---<',html.find('h2').get_text(),'>',file=f)print('---page',pg,'dealed---')
getPage(url)
函数的主要参考请看《python网络数据采集》第9页里面的代码。采用try...catch...
防止采集的页面是发生异常而导致爬虫终止。
getUrl(pg)
函数主要是方便url的组成,了解join()函数是python的基础,很简单不用细说。
open()
函数用于打开文档,这里我打开一个result.txt的文档存放爬取的结果。
名为html的变量代表的是一个通过getPage()函数获取的BeautifulSoup对象,观察原页面可发现诗歌内容存放在一个属性“class = ‘son2’”的div内,而且是html文档中第二个这样的标签(第一个这样的标签是搜索框)。
使用get_text()
函数获取<div class = 'son2'>
的文字内容,整首诗存放在“原文:”的后面,故在所获的内容中找到”原文:”的位置并向后偏移3个位置加一个换行符总共4个字符,便得到了原诗的内容。
诗歌的单句以“。”, “!”, “?”结尾,故将诗句拆分成单句的正则表达式为'(.*?[。!?])'
, “.*?” 表示python正则中的非贪婪模式,[]内的内容表示任选其一,()则是为了找到匹配结果并存放。
得到单句以后只需要判断”月”字是否在诗句中即可,有则输出到result.txt中,没有则判断下一句。
print ('---page', pg, 'dealed---')
在命令行里输出爬取的状态,方便目测爬取的进度。
最后的结果是:
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。