ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python|练习1——词云

2021-12-28 21:30:54  阅读:264  来源: 互联网

标签:__ xpath Python text 练习 url 词云 items path


Python|练习1——词云:从数据爬取到词云制作(以盗墓笔记为例)

需求分析

  • 获取盗墓笔记全文并保存为.txt格式
    • 目标资源网站分析
    • 资源获取策略制定
    • 代码编写及数据获取
  • 对盗墓笔记全文进行词云制作
    • 读取待处理对象
    • 词语划分、词频计算
    • 词云制作

爬虫源码分析

爬取策略

  • 目标网站:http://www.daomubiji.org/
  • 数据爬取:
    • requests.get()
    • UA伪装
  • 数据解析:
    • xpath
  • 数据存储
    • .txt文本

注:先获取每一章的url,将每一章标题及url存储在.csv文件中,再遍历.csv文件,爬取每一章内容并保存在.txt文件中

总结反思

1.网页编码问题

image-20211228144158205
  • 使用.encoding,对获取的网页进行编码,否则会出现乱码问题,尤其是存在中文的情况下

2.xpath定位问题

image-20211228145837645
  • tree.xpath()获取的是lxml.etree._Element类型的列表,可以进行列表操作,包含标签节点下所有同名的元素
  • /text()获取的是标签元素的字符串列表,要获取元素,需要进行索引操作
  • /@herf获取的是标签属性的字符串列表,要获取元素,需要进行索引操作
  • 小技巧:为避免标签列表为空,在对其进行索引前可以先用if进行判断

3.数据存储

image-20211228150029276
  • 对文件进行操作时,优先选用with open(path,'mode') as fp,可以自动关闭文件
  • 遍历字典并进行赋值的便捷操作
  • 当数据中有,英文逗号时,储存为csv格式需要多加注意
  • 当数据中有不可作文件名的符号时,需要作出修改(中文的可作为文件名)

4.csv文件读取与转化

image-20211228150624192
  • pandas读取文件时默认有标头,注意设置
  • pandas读取文件时注意中文编码问题
  • pandas数据索引,对列索引用iloc[m,n]//m行n列
  • 将列表转化为字典,可以使用dict(zip(key,value))

5.编程习惯

  • 使用函数式编程,
    • 导入包
    • 全局变量定义
    • 功能函数
    • main()函数
    • if __name__ == '__main__':

词云源码分析

词云制作策略

  • 读取所有.txt文件
    • 使用os.listdir(path)
  • 词语划分,词频计算
    • 使用jieba.lcut(text)
  • 词云制作
    • WordCloud.generate(text)

总结反思

1.文件读取

image-20211228152541406
  • 读取文件夹下所有文件并返回列表,使用os.listdir(dirpath)

2.词语划分,词频计算

image-20211228152824006
  • 词语划分,使用jieba
  • 通过词语的长度对词语进行初步筛选
  • 对词频计数,dict.get(key, default=None)可以对此查找并对key对应的value赋值

3.词语排序

image-20211228153219143
  • 使用list(dict.items())对字典的键值对进行列表化,键值对转化为元组类型
  • 使用list.sort(key = lambda x:x[1],reverse = True)对列表进行降序排列,其中的x是列表中的每一个元素
  • 格式化输出{:<5}.format()表示左对齐的5个字符数。

4.词云制作

image-20211228154107278

附件:

源码

数据爬取

from lxml import etree
import requests
import pandas as pd
import os


headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36'
}

def getChapter(url):
    req = requests.get(url=url,headers=headers)
    req.encoding = 'utf-8'
    html = req.text
    tree = etree.HTML(html)
    chapter_data = {}
    partList = tree.xpath('/html/body/div')[8:20]

    for part in partList:
        liList = part.xpath('./div/ul/li')
        for li in liList:
            if li.xpath('./span/a/text()'):
                section_name = li.xpath('./span/a/text()')[0]
            if li.xpath('./span/a/@href'):
                section_url = li.xpath('./span/a/@href')[0]
            chapter_data[section_name] = section_url
    
    csv_path = 'Src/盗墓笔记小说/盗墓笔记目录.csv'
    with open(csv_path,'a') as fp:
        [fp.write('{0},{1}\n'.format(title,url)) for title,url in chapter_data.items()]

    print("Successfully get the chapterData!")

    return chapter_data

def getContent(chapter_data):
    if not os.path.exists('Src/盗墓笔记小说/盗墓笔记'):
        os.makedirs('Src/盗墓笔记小说/盗墓笔记')
    for title,url in chapter_data.items():
        req = requests.get(url = url,headers = headers)
        req.encoding = 'utf-8'
        html = req.text
        tree = etree.HTML(html)
        p_list = tree.xpath('/html/body/div[7]/div[@class="content"]/p')[1:-4]

        text_path = 'Src/盗墓笔记小说/盗墓笔记/'+title+'.txt'
        with open(text_path,'a') as fp:
            fp.write(title+'\n')
            for p in p_list:
                if p.xpath('./text()'):
                    content = p.xpath('./text()')[0]               
                    fp.write(content+'\n')

        print(title+'保存成功!')

    print("Successfully get the Content!")      

def main():
    # root_url = 'http://www.daomubiji.org/'
    # chapter_data = getChapter(root_url)
    df=pd.read_csv("Src\盗墓笔记小说\盗墓笔记目录.csv",header=None,encoding='gbk')
    key=[]
    value=[]
    for i in df.iloc[1,0]: #为避免误触发,此处修改了读取的行数
        key.append(i)
    for j in df.iloc[1,1]: 
        value.append(j)
    chapter_data = dict(zip(key,value))
    getContent(chapter_data)

if __name__ == '__main__':
    main()

词云制作

import jieba as jb
from wordcloud import WordCloud as wc
import matplotlib.pyplot as plt
import os

root_path = "Src/盗墓笔记小说/盗墓笔记"

def getData():
    counts = {}

    if os.path.exists(root_path):
        files_name = os.listdir(root_path)
        # print(files_name[2])

        for file_name in files_name:
            data_path = root_path + "/" + file_name
            # print(data_path)
            with open (data_path,'r',encoding='gbk') as fp:
                text = fp.read()
                words = jb.lcut(text)
                # print(words)

                for word in words:
                    if len(word) < 2:
                        continue
                    else:
                        counts[word] = counts.get(word,0) + 1

    items = list(counts.items())
    # print(items)
    items.sort(key = lambda x:x[1],reverse=True)
    # print(items)
    # print("{0:<5}{1:<8}{2:<5}".format('序号','词语', '频率'))
    # for i in range(20):
    #     word,count = items[i]
    #     print("{0:<5}{1:<8}{2:>5}".format(i+1,word,count))
    return items

def getCloud(items):
    str = []
    for item in items:
        if item[1] > 100:
            word = item[0]
            str.append(word)
    text_cut = '/'.join(str)
    cloud = wc(
        background_color='white',
        font_path = 'Src\盗墓笔记小说\fonts\simsun.ttc', 
        max_font_size=150,
        relative_scaling=0.6,
        width=1000,
        height=860,
        margin=2).generate(text_cut)
    
    plt.imshow(cloud)
    plt.axis('off')
    plt.show()

def main():
    items = getData()
    getCloud(items)

if __name__ == "__main__":
    main()

参考资料:

[1].https://zhuanlan.zhihu.com/p/265100275

[2].https://zhuanlan.zhihu.com/p/138356932

标签:__,xpath,Python,text,练习,url,词云,items,path
来源: https://blog.csdn.net/weixin_44745770/article/details/122202814

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

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

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

ICode9版权所有