今天继续爬虫练习,今天来抓一下古诗文网上的唐诗三百首,并保存在文本文件中。

网页的地址是:http://so.gushiwen.org/gushi/tangshi.aspx

其实抓取的思路跟之前的都差不多,没有什么太新颖的东西,就当做一次联系了吧。唯一的不懂应该就是编程思路,今天用面向对象的方式来实现以下爬虫(有时间把之前的程序也改成面向对象的方式)

Python版本:3.5.3

用到的库有
1.requests:用来获取网页源代码
2.BeautifulSoup:用来解析网页,获得相关信息

首先获取网页的源代码,并解析网页。

1
2
3
def geturl(self):
html = requests.get(url=self.page_url)
return html.text

打开网页找到相应信息所在的位置


发现所有古诗都在’leftlei’的标签中,从中就可以获得所有古诗的题目,作者以及对应链接的信息。通过BeautifulSoup获取相应信息,并构造相应的url
1
2
3
4
5
6
7
8
9
soup = BeautifulSoup(html, "html.parser")
items = soup.find('div',class_='leftlei').find_all('span')
cont = 1
for item in items:
gushi_url = item.find('a')
if gushi_url != None:
title = item.find('a').get_text()
author = item.get_text()[len(title) + 1:-1]
cont += 1

从中可以发现,在当前页面中可以找到古诗的题目和作者的信息,找到其中一首古诗的元素,可以找到相应的链接,如图:


构造对应古诗的url

然后打开对应的链接,从地址上可以发现,每一首古诗对应的网页是http://so.gushiwen.org再加上相应古诗的链接

构造对应的url

1
gushi_url = 'http://so.gushiwen.org'+gushi_url['href']

然后依然在对应的古诗网页中找到古诗内容所在的位置,发现古诗的内容都位于id为’cont’的标签中

获取相应网页,并从中找到古诗内容

1
2
3
4
5
def getgushi(self,gushiurl):
html = requests.get(url=gushiurl)
soup = BeautifulSoup(html.text, "html.parser")
gushi = soup.find('div', id='cont').get_text().replace('\n','')
return gushi

这样就得到了所有的信息,然后在将每一次得到的古诗信息存在一个txt文本中

1
2
3
4
5
6
7
def savetotxt(self,cont,title,author,gushi):
f = open('tangshi.txt','a')
f.write(str(cont)+'\n')
f.write(title+'\n')
f.write(author+'\n')
f.write(gushi+'\n\n')
f.close()

最后运行程序

1
2
gushi = gushiwen()
gushi.getitem()

打开文件,发现唐诗三百首中的内容已经存在文本中了