爬取新闻标题,聚类分析实验

新闻标题是新闻最显眼的部分,集中概括了新闻的主要内容。因此对新闻标题进行分析分类,十分重要。

首先要获得足量的新闻标题分析数据。通过爬虫代码,在一个新闻网站上爬取了 足量数据。

下面是简单的爬虫和分析程序两个程序,爬取数据存入xlwt格式表格中,并将其标题数据进行聚类分析

1.爬虫程序

需要安装  random,request,bs4和xlwt,使用pip install命令或者去插件中心下载进行安装:

  1. 导入爬虫必要的库,采用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:绘制柱状图表示每个类别中样本的数量。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kanfoker

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值