Python|练习1——词云
作者:互联网
Python|练习1——词云:从数据爬取到词云制作(以盗墓笔记为例)
需求分析
- 获取盗墓笔记全文并保存为.txt格式
- 目标资源网站分析
- 资源获取策略制定
- 代码编写及数据获取
- 对盗墓笔记全文进行词云制作
- 读取待处理对象
- 词语划分、词频计算
- 词云制作
爬虫源码分析
爬取策略
- 目标网站:http://www.daomubiji.org/
- 数据爬取:
- requests.get()
- UA伪装
- 数据解析:
- xpath
- 数据存储
- .txt文本
注:先获取每一章的url,将每一章标题及url存储在.csv文件中,再遍历.csv文件,爬取每一章内容并保存在.txt文件中
总结反思
1.网页编码问题
- 使用.encoding,对获取的网页进行编码,否则会出现乱码问题,尤其是存在中文的情况下
2.xpath定位问题
- tree.xpath()获取的是
lxml.etree._Element
类型的列表,可以进行列表操作,包含标签节点下所有同名的元素 - /text()获取的是标签元素的字符串列表,要获取元素,需要进行索引操作
- /@herf获取的是标签属性的字符串列表,要获取元素,需要进行索引操作
- 小技巧:为避免标签列表为空,在对其进行索引前可以先用
if
进行判断
3.数据存储
- 对文件进行操作时,优先选用
with open(path,'mode') as fp
,可以自动关闭文件 - 遍历字典并进行赋值的便捷操作
- 当数据中有
,
英文逗号时,储存为csv格式需要多加注意 - 当数据中有
不可作文件名的符号
时,需要作出修改(中文的?
可作为文件名)
4.csv文件读取与转化
- 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.文件读取
- 读取文件夹下所有文件并返回列表,使用
os.listdir(dirpath)
2.词语划分,词频计算
- 词语划分,使用
jieba
库 - 通过词语的长度对词语进行初步筛选
- 对词频计数,
dict.get(key, default=None)
可以对此查找并对key
对应的value
赋值
3.词语排序
- 使用
list(dict.items())
对字典的键值对进行列表化,键值对转化为元组类型 - 使用
list.sort(key = lambda x:x[1],reverse = True)
对列表进行降序排列,其中的x
是列表中的每一个元素 - 格式化输出
{:<5}.format()
表示左对齐的5个字符数。
4.词云制作
- 将词语进行划分并使用
/
来链接成字符串 - WordCloud的基本设置:https://blog.csdn.net/jinsefm/article/details/80645588
附件:
源码
数据爬取
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