新闻标题是新闻最显眼的部分,集中概括了新闻的主要内容。因此对新闻标题进行分析分类,十分重要。
首先要获得足量的新闻标题分析数据。通过爬虫代码,在一个新闻网站上爬取了 足量数据。
下面是简单的爬虫和分析程序两个程序,爬取数据存入xlwt格式表格中,并将其标题数据进行聚类分析
1.爬虫程序
需要安装 random,request,bs4和xlwt,使用pip install命令或者去插件中心下载进行安装:
- 导入爬虫必要的库,采用beautifulsoup方法
在开始之前,需要导入必要的库
#导入模块
import random
import requests
from bs4 import BeautifulSoup
import xlwt
2.解析网页,从中收集有效信息
从新闻网站中获取新闻标题,时间,主题。并将其保存为xls格式:
def get_ua():
"""
在UA库中随机选择一个UA
:return: 返回一个库中的随机UA
"""
ua_list = [
"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.0 Safari/532.5",
"Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.310.0 Safari/532.9",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.514.0 Safari/534.7",
"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/9.0.601.0 Safari/534.14",
"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/10.0.601.0 Safari/534.14",
"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.20 (KHTML, like Gecko) Chrome/11.0.672.2 Safari/534.20",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.27 (KHTML, like Gecko) Chrome/12.0.712.0 Safari/534.27",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.24 Safari/535.1",
"Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.120 Safari/535.2",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.36 Safari/535.7",
"Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; en-US; rv:1.9pre) Gecko/2008072421 Minefield/3.0.2pre",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10",
"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11 (.NET CLR 3.5.30729)",
"Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 GTB5",
]
return random.choice(ua_list)
if __name__ == "__main__":
workbook =xlwt.Workbook()# 创建一个Excel文件
sheet = workbook.add_sheet('News')# 在Excel文件中添加一个名为'News'的工作表
sheet.write(0,0,'标题')
sheet.write(0,1,'时间')
sheet.write(0,2,'正文')
for i in range(11):
target = 'https://#############list{}.htm'.format(i)
req = requests.get(url=target)
req.headers=get_ua() # 设置爬虫头部,建议多设置一些,防止被封
req.encoding = 'utf-8'
# 使用BeautifulSoup解析HTML
html = req.text
bf = BeautifulSoup(html, 'html.parser')
li = bf.find_all('li', attrs={'data-title': True})
time = bf.find_all('span', class_='times')
text = bf.find_all('div', class_='news_text')
# 遍历列表, 在工作表中写入相应数据
for index, l in enumerate(li, start=1):
data_title = l['data-title']
sheet.write(index+20*i-20, 0, data_title)
for index, t in enumerate(time,start=1):
time_data = t.get_text()
sheet.write(index+20*i-20, 1, time_data)
for index,n in enumerate(text,start=1):
news = n.get_text()
sheet.write(index+20*i-20, 2, news)
file_path = "D:/EcustNews.xls"
workbook.save(file_path)
2. 聚类分析程序
使用numpy,xlrd,TfidfVectorizer ,KMeans,PCA, matplotlib进行聚类分析并进行可视化:
import numpy as np
import xlrd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
# 读取Excel文件中的新闻标题
file_path = "D:/EcustNews.xls"
book = xlrd.open_workbook(file_path)
sheet = book.sheet_by_index(0)
titles = [sheet.cell_value(i, 0) for i in range(1, sheet.nrows)] # 跳过表头
# 使用TF-IDF向量化新闻标题
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(titles)
# 使用K-means算法进行聚类分析
k = 8 # 假设聚成8个类别
kmeans = KMeans(n_clusters=k, random_state=0)
kmeans.fit(X)
# 获取每个新闻标题所属的类别
labels = kmeans.labels_
# 统计每个类别的数量
cluster_counts = np.bincount(labels)
# 使用主成分分析进行降维
pca = PCA(n_components=2)
X_reduced = pca.fit_transform(X.toarray())
#生成两子图
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 5))
# 根据聚类类别绘制不同颜色的散点图
for i in range(k):
ax1.scatter(X_reduced[labels == i, 0], X_reduced[labels == i, 1], label=f"Cluster {i+1}")
# 添加图例和标题
ax1.legend()
ax1.set_title("Cluster Visualization")
# 绘制柱状图表示类别数量
ax2.bar(range(k), cluster_counts)
# 添加标签和标题
ax2.set_xlabel('Cluster')
ax2.set_ylabel('Count')
ax2.set_title('Number of Samples in Each Cluster')
# 输出每个新闻标题所属的类别
for i, title in enumerate(titles):
label = kmeans.labels_[i]
print(f"标题: {title},类别: {label}")
# 显示图表
plt.show()
这段代码是对给定的新闻标题进行聚类分析,并可视化展示聚类结果和每个类别中样本的数量。
读取Excel文件中的新闻标题数据。再使用TF-IDF向量化新闻标题,将文本数据转换成数值特征表示。用K-means算法进行聚类分析,假设聚成8个类别获取每个新闻标题所属的类别,统计每个类别的数量。使用主成分分析(PCA)进行降维,将高维特征降至2维以便可视化。最后生成两个子图:子图1:根据聚类类别绘制不同颜色的散点图,展示聚类结果。子图2:绘制柱状图表示每个类别中样本的数量。