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

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

  • 相关阅读:
    9 jmeter之检查点
    8 jmeter之集合点
    7 jmeter之参数化
    6 jmeter元件的作用域与执行顺序
    5 jmeter性能测试小小的实战
    4 jmeter badboy脚本开发技术详解
    3 jmeter的两种录制方法
    2 jmeter常用功能介绍-测试计划、线程组
    Errors occurred during the build. Errors running builder 'DeploymentBuilder' on project
    常见异常总结
  • 原文地址:https://www.cnblogs.com/freeman818/p/7143438.html
Copyright © 2011-2022 走看看