还是为了练手,开始想爬人民网主页的所有文章的,但是发现不同板块的页面结构不一样,有的页面还是论坛???我人晕了,最后改弄词云了,无奈╮(╯▽╰)╭
传送门:http://www.people.com.cn/
大体思路:
(1)这个页面相对简单,获取页面标签里的文本和链接就不说了
(2)利用jieba库的analyse自动分析方法拆分分析文本
(3)利用Wordcloud的方法实现词云
方法:
(1)页面获取方法:getHTMLText(url)
(2)获取新闻标题和链接的方法:fillList(html,newslist)
(3)利用jieba库和Wordcloud生成词云方法:getCloud(html,path)
参数介绍:
(1)newslist:存储新闻标题和对应链接的列表
(2)path:词云图本地存储路径
(1)关于jieba库和Wordcloud库:
这两个库在我之前学习计算机二级Python的时候就了解过并下载了,所以这里就不再介绍了
(2)join() 和 append() 方法的区别:
append是list(列表)的方法,函数参数是可以是任意一个元素,作用是在列表的最后添加上这个新元素
join是string(字符串)的方法,函数参数是一个由字符串组成的列表,作用是用字符串把这个字符串列表里的字符串连接起来
(3)jieba.analyse 和 textrank 简单用法:
传送门:https://www.cnblogs.com/1061321925wu/p/12518541.html
(4)Wordcloud方法与参数:
传送门:https://www.cnblogs.com/delav/articles/7837975.html
(5)wordcloud使之支持中文:
下载能够支持的字体即可:
SimHei字体:https://www.uslogger.com/details/3
注意是font_path,不是font;注意是font_path,不是font;注意是font_path,不是font;我自罚三杯
font_path = r"F:\Fonts\SimHei.ttf"
(6)plt.imshow() 与 plt.show() 区别:
plt.imshow():负责对图像进行处理,并显示其格式
plt.show():则是将plt.imshow()处理后的函数显示出来
plt.axis(‘off’):去掉图像的坐标轴
import requests
import re
import os
from bs4 import BeautifulSoup
import jieba.analyse
from wordcloud import WordCloud
import matplotlib.pyplot as plt
def getHTMLText(url):
try:
kv = {"user-agent":"Mozilla/5.0"}
r = requests.get(url,headers = kv)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
print("getHTMLText失败!")
return ""
#获取新闻标题和链接的方法
def fillList(html,newslist):
soup = BeautifulSoup(html, 'html.parser')
for ul in soup.find_all("ul",class_ = "list14"):
for li in ul.find_all("li"):
for a in li.find_all("a"):
newslist.append([a.text.strip(),a.get("href").strip()])
print(a.text.strip() + "\t\t" + a.get("href").strip())
#利用jieba库和Wordcloud生成词云方法
def getCloud(html,path):
soup = BeautifulSoup(html, 'html.parser')
news_text = ""
for news in soup.find_all("ul",class_ = "list14"):
news_text = "".join(news.text.strip())
result = jieba.analyse.textrank(news_text, topK=1000000, withWeight = True) #文本拆分分析
keywords = dict()
for i in result:
keywords[i[0]] = i[1]
print(keywords)
#词云的相关设置
wc = WordCloud(
font_path = r"F:\Fonts\SimHei.ttf",
background_color="skyblue",
max_words=50,
width = 800,
height = 600,
max_font_size = 200,
min_font_size = 2
)
wc.generate_from_frequencies(keywords)
plt.imshow(wc)
plt.axis("off") #去掉坐标轴
plt.show() #显示图像
wc.to_file(path) #保存图像
def main():
newslist = []
url = "http://www.people.com.cn/"
path = "rmwCloud.jpg"
html = getHTMLText(url)
fillList(html,newslist)
getCloud(html,path)
main()