zoukankan      html  css  js  c++  java
  • 爬取唐诗

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

    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)+'			')
    36             f.write('
    ')
    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('
    ')
    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框架
    学到那里的时候,我再把这里代码重构一遍,
    你会惊奇的发现,速度几十倍甚至几百倍的提高了!
    这其实也是多线程的威力!

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

  • 相关阅读:
    Junit单元测试
    win7的6个网络命令
    WOJ1024 (POJ1985+POJ2631) Exploration 树/BFS
    WOJ1022 Competition of Programming 贪心 WOJ1023 Division dp
    woj1019 Curriculum Schedule 输入输出 woj1020 Adjacent Difference 排序
    woj1018(HDU4384)KING KONG 循环群
    woj1016 cherry blossom woj1017 Billiard ball 几何
    woj1013 Barcelet 字符串 woj1014 Doraemon's Flashlight 几何
    woj1012 Thingk and Count DP好题
    woj1010 alternate sum 数学 woj1011 Finding Teamates 数学
  • 原文地址:https://www.cnblogs.com/freeman818/p/7143438.html
Copyright © 2011-2022 走看看