爬取唐诗

Posted Freeman耀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了爬取唐诗相关的知识,希望对你有一定的参考价值。

首先我们打开唐诗三百首网页

1 http://www.gushiwen.org/gushi/tangshi.aspx

目标分析:

1、爬取网页七大板块:五言绝句,七言绝句,五言律诗,七言律诗,五言古诗,七言古诗,乐府。
2、爬取每个板块的所有古诗。
3、爬取每个古诗词内容。

网页详情如下:

我们很容易就能发现,每一个分类都是包裹在:

1 <div  id="guwencont2">

这种调理清晰的网站,大大方便了我们爬虫的编写。

 下面是每个板块标题的特征

1 <div>  
2     <span style="margin-left:10px;">五言绝句</span>
3 </div>

 下面是每个板块的特征,很明显每首古诗的标题、链接的后半部分都存放在<a>标签里面。

<div id="guwencont2" style="height:248px;" class="guwencont2">
<a href="/GuShiWen_e57030b42c.aspx" target="_blank">行宫(元稹)</a>
<a href="/GuShiWen_62214a2b00.aspx" target="_blank">登鹳雀楼(王之涣)</a>
<a href="/GuShiWen_7fe57a613a.aspx" target="_blank">新嫁娘词(王建)</a>
<a href="/GuShiWen_f4bcd5f606.aspx" target="_blank">相思(王维)</a>
<a href="/GuShiWen_e731c3242e.aspx" target="_blank">杂诗(王维)</a>
<a href="/GuShiWen_465b5b1b4a.aspx" target="_blank">鹿柴(王维)</a>
<a href="/GuShiWen_2bb615bbd9.aspx" target="_blank">竹里馆(王维)</a>
<a href="/GuShiWen_e788e9c73d.aspx" target="_blank">山中送别(王维)</a>
<a href="/GuShiWen_8d927fac6d.aspx" target="_blank">问刘十九(白居易)</a>
<a href="/GuShiWen_24e79da4f4.aspx" target="_blank">哥舒歌(西鄙人)</a>
<a href="/GuShiWen_6fa12406af.aspx" target="_blank">夜思(李白)</a>
<a href="/GuShiWen_1cd03cf3df.aspx" target="_blank">怨情(李白)</a>
<a href="/GuShiWen_9dcf316328.aspx" target="_blank">登乐游原(李商隐)</a>
<a href="/GuShiWen_bd602eaad0.aspx" target="_blank">听筝(李端)</a>
<a href="/GuShiWen_bca3a963d7.aspx" target="_blank">渡汉江(李频)</a>
<a href="/GuShiWen_3fafd55cca.aspx" target="_blank">八阵图(杜甫)</a>
<a href="/GuShiWen_8d5a9ecdb7.aspx" target="_blank">宿建德江(孟浩然)</a>
<a href="/GuShiWen_b3639b3722.aspx" target="_blank">春晓(孟浩然)</a>
<a href="/GuShiWen_8aed48548f.aspx" target="_blank">春怨(金昌绪)</a>
<a href="/GuShiWen_3ad899caed.aspx" target="_blank">江雪(柳宗元)</a>
<a href="/GuShiWen_77049a01e9.aspx" target="_blank">秋夜寄邱员外(韦应物)</a>
<a href="/GuShiWen_fe5950e8d7.aspx" target="_blank">终南望余雪(祖咏)</a>
<a href="/GuShiWen_768631014b.aspx" target="_blank">宫词(张祜)</a>
<a href="/GuShiWen_a2b94427a1.aspx" target="_blank">寻隐者不遇(贾岛)</a>
<a href="/GuShiWen_5634353338.aspx" target="_blank">送崔九(裴迪)</a>
<a href="/GuShiWen_6693ec4ec3.aspx" target="_blank">送灵澈(刘长卿)</a>
<a href="/GuShiWen_6c39d14909.aspx" target="_blank">听弹琴(刘长卿)</a>
<a href="/GuShiWen_536b8d6320.aspx" target="_blank">送上人(刘长卿)</a>
<a href="/GuShiWen_3a544871c1.aspx" target="_blank">玉台体(权德舆)</a>
</div>

这样一来,我们只需要在当前页面找到所有古诗的标题,链接,并保存在列表就行了。

下面就是获取每首古诗的内容,例如五言绝句的《行宫》的链接为

http://www.gushiwen.org/GuShiWen_e57030b42c.aspx

我们只需要将http://www.gushiwen.org与GuShiWen_e57030b42c.aspx连接起来即可。

下面我们观察古诗内容的特征

<p align="center">
   “寥落古行宫,宫花寂寞红。”
<br>
   “白头宫女在,闲坐说玄宗。”
</p>

全部抓取代码如下:

 1 # -*- coding: utf-8 -*-
 2 import requests
 3 from bs4 import BeautifulSoup
 4 
 5 #网页抓取
 6 def get_html(url):
 7     try:
 8         html = requests.get(url).text
 9         soup = BeautifulSoup(html, \'lxml\')
10         return soup
11     except:
12         return "Someting Wrong!"
13 
14 #将每个模块的每首古诗存到字典里面
15 def get_links(soup):
16     u = \'http://www.gushiwen.org/\'
17     all_html = soup.find_all(\'div\',class_=\'son2s\')
18     models = all_html[1].find_all(\'span\',style=\'margin-left:10px;\') #获取每个模块的标题,如五言绝句,七言律诗
19     #print(models)
20     links = all_html[1].find_all(\'div\', class_=\'guwencont2\')
21     all_models = {}
22     for index,item in enumerate(links):
23         every_model = []
24         for i in item.find_all(\'a\'):
25             title = i.string   #获取古诗标题
26             title_link = u + i[\'href\']    #获取古诗连接
27             every_model.append([title,title_link])
28         all_models.setdefault(models[index].string,every_model)
29     return all_models
30 
31 #获取每首古诗的链接,并且最终存文件里面
32 def get_shi(all_models):
33     with open(\'all_tangshi.txt\', \'w\', encoding=\'utf-8\') as f:
34         for k,v in all_models.items():
35             f.write(str(k)+\'\\t\\t\\t\')
36             f.write(\'\\n\')
37             for i in v:
38                 soup = get_html(i[1])
39                 txt = \'\'
40                 if len(soup.find_all(\'p\',align=\'center\')) == 0:
41                     txt = \'找不到啊。。。。。。。。。。\'
42                 else:
43                     for x in range(len(soup.find_all(\'p\', align=\'center\'))):
44 
45                         txtx = soup.find_all(\'p\',align=\'center\')[x].text
46                         txt = str(txt) + str(txtx)
47                 f.write(str(i[0]))
48                 f.write(str(txt))
49                 f.write(\'\\n\')
50 
51 if __name__ == \'__main__\':
52     url = \'http://www.gushiwen.org/gushi/tangshi.aspx\'
53     h = get_html(url)
54     m = get_links(h)
55     get_shi(m)

缺点:

本次爬虫写的比较顺利,主要是因为爬的网站是没有反爬虫技术,以及古诗分类清晰,结构优美。
但是,按照我们的这篇文的思路去爬取, 时间太长了!这种单线程的爬取方式效率必然很低。

其实还有更好的方式:下面我们将一起学习Scrapy框架
学到那里的时候,我再把这里代码重构一遍,
你会惊奇的发现,速度几十倍甚至几百倍的提高了!
这其实也是多线程的威力!

下面我们看一下爬取的结果

以上是关于爬取唐诗的主要内容,如果未能解决你的问题,请参考以下文章

scrapy按顺序启动多个爬虫代码片段(python3)

scrapy主动退出爬虫的代码片段(python3)

python小白学习记录 多线程爬取ts片段

python爬虫——爬取古诗词

以大数据眼光欣赏唐人文墨代码实现

Tensorflow生成唐诗和歌词(下)