zoukankan      html  css  js  c++  java
  • 爬取唐诗宋词生成词云

    Python 高并发线程爬取诗词之诗词分析

    本节所讲内容:

    1、5分钟快速了解爬虫概念

    2、beautifulsoup 匹配原则

    3、wordcloud 使用详情

    实战:爬取中国唐诗宋词,体验文人雅士最常用的词语!

    1、5分钟快速了解爬虫

    爬虫(spider:网络蜘蛛):是一个用脚本代替浏览器请求服务器获取服务器资源的程序。

    数据收集(数据分析、人工智能)

    模拟操作(测试、数据采集)

    接口操作(自动化)

    爬虫的原理:

                  说到底,我们的爬虫是模拟web请求,不论学习什么框架我们都需要对http协议的请求和响应有所了解:

            

             简单的了解一下这幅图。

    2、beautifulsoup 匹配原则

    如果一个正则匹配稍有差池,那可能程序就处在永久的循环之中,而且有的小伙伴们也对写正则表达式的写法用得不熟练,没关系,我们还有一个更强大的工具,叫Beautiful Soup,有了它我们可以很方便地提取出HTML或XML标签中的内容,实在是方便,这一节就让我们一起来感受一下Beautiful Soup的强大吧。

    什么是Beautiful Soup

    简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据。

    官方解释如下:

    Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。

    2.1 bs的安装

    环境介绍: pycharm 2017.2.3 + python 3.5.0

           Pip install bs4

    首先必须要导入 bs4 库, 创建BeautifulSoup对象

    from bs4 import BeautifulSoup as BS
    text = '''
    <html>
    <head>
        <meta = charset='UTF-8' >
        <title id =1 href = 'http://example.com/elsie' class = 'title'>Test</title>
    </head>
    <body>
       <div class = 'ok'>
           <div class = 'nice'>
               <p class = 'p'>
                   Hello World
               </p>
                <p class = 'e'>
                  
    风一般的男人
               </p>
           </div>
       </div>
    </body>
    </html>
    '''
    soup = BS(text,"lxml")#前面是要解析的内容,后面是指定的解析器
    print(soup.prettify())#转换字符串
    print(type(soup.prettify()))
    print(type(soup))

    2.2.2  搜索文档树

    find()和find_all()

    find_all()方法搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件。

    find()和find_all()的区别就是,find直接返回元素的一个结果,find_all返回元素列表

    find_all( name , attrs , recursive , text , **kwargs )简介一下参数

    name 参数可以查找所有名字为name的tag,字符串对象会被自动忽略掉;name参数可以传入字符串、正则表达式、列表、True、自定义的方法等但是各自代表的含义不一样。

    字符串,在搜索方法中传入一个字符串参数,Beautiful Soup会查找与字符串完整匹配的内容。

    print(soup.find('body'))
    print(soup.find_all('body')

    如果匹配成功将会匹配所有的tag

    如果一个指定名字的参数不是搜索内置的一些参数名,搜索时会把该参数当作指定名字tag的属性来

    搜索;例如id=1

    如果包含一个名字为 id 的参数,Beautiful Soup会搜索每个tag的”id”属性;

    如果传入 href 参数,Beautiful Soup会搜索每个tag的”href”属性;

    使用多个指定名字的参数可以同时过滤tag的多个属性;

    对于class ,可以使用class_来搜索

    #返回这个class=‘p’的标签内容。

    print(soup.find_all('p',class_='p'))

    对于某些tag属性不能通过搜索得到值,可以使用attrs参数得到

    #返回class为e的标签

    print(soup.find_all(attrs={'class':'e'}))

    3、wordcloud 使用详情

    wordcloud 简单利用英语来看就是词云,它是以词语为基本单位,更加直观的展示出我们的内容。

    wordcloud 的安装

    pip install wordcloud

    大家顺便安装下:pip install jieba

    1、基本格式
    #导入词云
    from wordcloud import WordCloud
    #打开文件并且读取完全
    f = open('1.txt','r').read()
    #创建wc设个实例对象,里面可传递相应的参数
    #generate根据文本生成词云
    wc = WordCloud(
       
    background_color='white',
       
    width=500,
       
    height=366,
       
    margin=2
    ).generate(f)
    #to_file 输出到文件
    wc.to_file('./image/0.jpg')

    3、wordcloud 使用详情

    wordcloud 简单利用英语来看就是词云,它是以词语为基本单位,更加直观的展示出我们的内容。

    wordcloud 的安装

    pip install wordcloud

    大家顺便安装下:pip install jieba

    1、基本格式
    #导入词云
    from wordcloud import WordCloud
    #打开文件并且读取完全
    f = open('1.txt','r').read()
    #创建wc设个实例对象,里面可传递相应的参数
    #generate根据文本生成词云
    wc = WordCloud(
       
    background_color='white',
       
    width=500,
       
    height=366,
       
    margin=2
    ).generate(f)
    #to_file 输出到文件
    wc.to_file('./image/0.jpg')
    
    

    实战:爬取中国唐诗宋词,体验文人雅士最常用的词语!

    第一步:下载中国的唐诗宋词

    第二步:把数据保存到本地

    第三步:结巴分词

    第四步:生成词云简单分析

    代码如下:

    下载唐诗宋词保存本地

    # -*- coding: utf-8 -*-
    # @Time    : 2019/2/25 10:23
    # @Author  : for
    # @File    : test01.py
    # @Software: PyCharm
    import re
    import requests
    from bs4 import BeautifulSoup
    from fake_useragent import UserAgent
    from concurrent.futures import ThreadPoolExecutor, wait, ALL_COMPLETED
    #这是url地址
    urls = ['https://so.gushiwen.org/gushi/tangshi.aspx',
           
    'https://so.gushiwen.org/gushi/sanbai.aspx',
           
    'https://so.gushiwen.org/gushi/songsan.aspx',
           
    'https://so.gushiwen.org/gushi/songci.aspx'
           
    ]
    #处理获取每个诗词的url地址
    poem_links = []
    for url in urls:
       
    # 请求头部
       
    ua = UserAgent()
        headers = {
    'User-Agent': ua.random}
        req = requests.get(url,
    headers=headers)
       
    #把爬取到的文本格式改成bs4可改变的格式
       
    soup = BeautifulSoup(req.text, "lxml")
       
    #定位到第一个class = sone的内容
       
    content = soup.find_all('div', class_="sons")[0]
       
    #获取该content 下所有a标签
       
    links = content.find_all('a')
       
    print(links)
       
    #进行比遍历,url地址拼接
       
    for link in links:
            poem_links.append(
    'https://so.gushiwen.org'+link['href'])

    poem_list = []
    def get_poem(url):
       
    # 请求头部
       
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36'}
        req = requests.get(url,
    headers=headers)
        soup = BeautifulSoup(req.text,
    "lxml")
        poem = soup.find(
    'div', class_='contson').text.strip()
        poem = poem.replace(
    ' ', '')
        poem = re.sub(re.compile(
    r"([sS]*?)"), '', poem)
        poem = re.sub(re.compile(
    r"([sS]*?)"), '', poem)
        poem = re.sub(re.compile(
    r"。([sS]*?)"), '', poem)
        poem = poem.replace(
    '!', '!').replace('?', '?')
        poem_list.append(poem)
    # 利用并发爬取
    executor = ThreadPoolExecutor(max_workers=10# 可以自己调整max_workers,即线程的个数
    # submit()的参数: 第一个为函数, 之后为该函数的传入参数,允许有多个
    future_tasks = [executor.submit(get_poem, url) for url in poem_links]
    # 等待所有的线程完成,才进入后续的执行
    wait(future_tasks, return_when=ALL_COMPLETED)

    # 将爬取的诗句写入txt文件
    poems = list(set(poem_list))
    poems =
    sorted(poems, key=lambda x:len(x))
    print(poems)
    for poem in poems:
        poem = poem.replace(
    '《','').replace('》','').replace(':', '').replace('“', '')
       
    print(poem)
       
    with open('poem.txt', 'a',encoding='utf-8') as f:
            f.write(poem)
            f.write(
    ' ')

    结果展示:

     

    生成词云进行分析:
    import jieba
    from wordcloud import WordCloud,STOPWORDS
    wc = WordCloud(
    background_color='white'# 背景颜色
                  
    max_words=1000# 最大词数
                   # mask=back_color,  # 以该参数值作图绘制词云,这个参数不为空时,width和height会被忽略
                  
    max_font_size=100# 显示字体的最大值
                  
    stopwords=STOPWORDS.add('国'),  # 使用内置的屏蔽词,再添加'苟利国'
                   # font_path="C:/Windows/Fonts/STFANGSO.ttf",  # 解决显示口字型乱码问题,可进入C:/Windows/Fonts/目录更换字体
                  
    font_path='C:WindowsFontssimfang.ttf',
                  
    random_state=42# 为每个词返回一个PIL颜色
                   # width=1000,  # 图片的宽
                   # height=860  #图片的长
                  
    )
    text =
    open('poem.txt').read()
    # 该函数的作用就是把屏蔽词去掉,使用这个函数就不用在WordCloud参数中添加stopwords参数了
    # 把你需要屏蔽的词全部放入一个stopwords文本文件里即可
    def stop_words(texts):
        words_list = []
        word_generator = jieba.cut(texts,
    cut_all=False# 返回的是一个迭代器
       
    for word in word_generator:
            words_list.append(word)
       
    print(words_list)
       
    return ' '.join(words_list)  # 注意是空格
    text = stop_words(text)
    wc.generate(text)
    # 显示图片
    wc.to_file('maikou.png')

    效果展示

     

  • 相关阅读:
    spring事务管理器设计思想(一)
    ThreaLocal内存泄露的问题
    denyhost防止SSH暴力破解
    qt下调用win32api 修改分辨率
    Windows下pip安装包报错:Microsoft Visual C++ 9.0 is required Unable to find vcvarsall.bat
    Centos 6.5 下安装socket5代理
    Mac 下安装mitmproxy
    Mac OS 下安装wget
    判断客户端是否使用代理服务器及其匿名级别
    Mac OS 下安装rar unrar命令
  • 原文地址:https://www.cnblogs.com/zydev/p/10959210.html
Copyright © 2011-2022 走看看