ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

爬取唐诗宋词生成词云

2019-06-01 12:49:00  阅读:271  来源: 互联网

标签:poem 爬取 soup wordcloud 唐诗宋词 词云 print 参数 find


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"\([\s\S]*?\)"), '', poem)
    poem = re.sub(re.compile(
r"([\s\S]*?)"), '', poem)
    poem = re.sub(re.compile(
r"。\([\s\S]*?)"), '', 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(
'\n')

结果展示:

 

生成词云进行分析:
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:\Windows\Fonts\simfang.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')

效果展示

 

 

标签:poem,爬取,soup,wordcloud,唐诗宋词,词云,print,参数,find
来源: https://www.cnblogs.com/zydev/p/10959210.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有