当前位置: 首页 > article >正文

狮子座大数据分析(python爬虫版)

十二星座爱情性格 - 星座屋

首先找到一个星座网站,作为基础内容,来获取信息

网页爬取与信息提取

我们首先利用爬虫技术(如 Python 中的 requests 与 BeautifulSoup 库)获取页面内容。该页面(xzw.com/astro/leo/)中,除了狮子座基本属性外,还有两个重点部分:

  • 狮子座女生:摘要中提到“特点:心地善良、爱心丰富”,“弱点:喜欢引人注目”,“爱情:不太懂得疼爱对方”。
  • 狮子座男生:摘要中提到“特点:热情、组织能力、正义感”,“弱点:高傲、虚荣心”,“爱情:追求轰轰烈烈的爱情”。

通过解析这些文字,我们可以归纳:

  • 狮子座男生:性格热情、具备较强的组织能力和正义感,但有时表现出高傲和虚荣,热衷于追求激情四溢的爱情。
  • 狮子座女生:性格温暖、心地善良且富有爱心,但喜欢吸引他人注意,在爱情中可能表现得不够细腻体贴。
import requests
from bs4 import BeautifulSoup
import time

base_url = "https://www.xzw.com/astro/leo/"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)"
}

collected_texts = []
visited_urls = set()

def scrape_page(url):
    global collected_texts

    if url in visited_urls:
        return

    try:
        response = requests.get(url, headers=headers, timeout=10)
        response.encoding = 'utf-8'
        soup = BeautifulSoup(response.text, 'html.parser')

        page_text = soup.get_text(separator="\n", strip=True)
        collected_texts.append(page_text)
        visited_urls.add(url)  # 标记该 URL 已访问

        print(f"已爬取: {url} (当前累计 {len(collected_texts)} 条文本)")

        for link in soup.find_all('a', href=True):
            full_link = link['href']

            if full_link.startswith("/"):
                full_link = "https://www.xzw.com" + full_link

            if full_link.startswith(base_url) and full_link not in visited_urls:
                if len(collected_texts) >= 1000:
                    return
                time.sleep(1)
                scrape_page(full_link)

    except Exception as e:
        print(f"爬取 {url} 失败: {e}")

scrape_page(base_url)

with open("test.txt", "w", encoding="utf-8") as file:
    file.write("\n\n".join(collected_texts))

print("🎉 爬取完成,数据已保存到 test.txt 文件!")

将爬取到的数据存入test.txt中后,进行分析
 

import jieba
import re
from collections import Counter

def read_file(file_path):
    with open(file_path, 'r', encoding='utf-8') as f:
        text = f.read()
    return text

def clean_text(text):
    text = re.sub(r'\s+', '', text)
    text = re.sub(r'[^\u4e00-\u9fa5]', '', text)
    return text

def tokenize(text):
    words = jieba.lcut(text)
    return words

def count_words(words):
    return Counter(words)

POSITIVE_WORDS = {"自信", "阳光", "大方", "慷慨", "勇敢", "领导", "果断", "豪爽", "热情", "友善","善良"}
NEGATIVE_WORDS = {"自负", "霸道", "固执", "急躁", "冲动", "强势", "高傲", "爱面子", "争强好胜", "以自我为中心"}

def analyze_personality(word_counts):
    total_words = sum(word_counts.values())
    pos_count = sum(word_counts[word] for word in POSITIVE_WORDS if word in word_counts)
    neg_count = sum(word_counts[word] for word in NEGATIVE_WORDS if word in word_counts)

    pos_percent = (pos_count / total_words) * 100 if total_words > 0 else 0
    neg_percent = (neg_count / total_words) * 100 if total_words > 0 else 0
    neutral_percent = 100 - pos_percent - neg_percent

    return pos_percent, neg_percent, neutral_percent

def evaluate_personality(pos_percent, neg_percent):
    if pos_percent > neg_percent:
        conclusion = "狮子座整体评价较好,正面特质占比更高。"
    elif neg_percent > pos_percent:
        conclusion = "狮子座评价存在较多负面特质,但也有正面评价。"
    else:
        conclusion = "狮子座评价较为中立,正负面评价相当。"

    return conclusion

def main():
    text = read_file("test.txt")
    text = clean_text(text)
    words = tokenize(text)

    word_counts = count_words(words)

    pos_percent, neg_percent, neutral_percent = analyze_personality(word_counts)

    conclusion = evaluate_personality(pos_percent, neg_percent)

    print("🔍 狮子座性格评价分析:")
    print(f"✅ 正面评价占比:{pos_percent:.2f}%")
    print(f"❌ 负面评价占比:{neg_percent:.2f}%")
    print(f"⚖ 中立评价占比:{neutral_percent:.2f}%")
    print(f"📢 结论:{conclusion}")

if __name__ == "__main__":
    main()

进行评价:

import jieba
import jieba.posseg as pseg 
import re
from collections import Counter
from wordcloud import WordCloud
import matplotlib.pyplot as plt

def read_file(file_path):
    with open(file_path, 'r', encoding='utf-8') as f:
        text = f.read()
    return text

def clean_text(text):
    text = re.sub(r'\s+', '', text)  # 去除空格和换行符
    text = re.sub(r'[^\u4e00-\u9fa5]', '', text)  # 只保留中文
    return text

def tokenize(text):
    words = pseg.lcut(text)  # 使用 jieba 进行分词并标注词性
    adjectives = [word for word, flag in words if flag == 'a']  # 只保留形容词
    return adjectives

def count_words(words):
    return Counter(words)

def generate_wordcloud(word_counts):
    wordcloud = WordCloud(font_path='msyh.ttc', width=800, height=600, background_color='white').generate_from_frequencies(word_counts)
    plt.figure(figsize=(10, 8))
    plt.imshow(wordcloud, interpolation='bilinear')
    plt.axis('off')
    plt.show()

def top_words(word_counts, top_n=10):
    return dict(word_counts.most_common(top_n))

def main():
    text = read_file("test.txt")
    text = clean_text(text)
    words = tokenize(text)

    word_counts = count_words(words)

    top_n_words = top_words(word_counts, top_n=10)

    generate_wordcloud(top_n_words)

if __name__ == "__main__":
    main()

多种图:

import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
import jieba
import jieba.posseg as pseg
import re
from collections import Counter
from wordcloud import WordCloud

# 设置支持中文的字体(以黑体为例)
plt.rcParams['font.sans-serif'] = ['SimHei']
# 防止负号显示为方块
plt.rcParams['axes.unicode_minus'] = False

def read_file(file_path):
    with open(file_path, 'r', encoding='utf-8') as f:
        text = f.read()
    return text

def clean_text(text):
    text = re.sub(r'\s+', '', text)
    text = re.sub(r'[^\u4e00-\u9fa5]', '', text)
    return text

def tokenize(text):
    # 使用 jieba 对文本进行分词和词性标注
    words = pseg.lcut(text)
    # 仅保留形容词相关词性(例如 'a' 表示形容词),过滤掉名词等其它词性
    adjectives = [word for word, flag in words if flag in ['a', 'ad', 'an', 'ag']]
    return adjectives

def count_words(words):
    return Counter(words)

def generate_wordcloud(word_counts):
    wordcloud = WordCloud(font_path='msyh.ttc', width=800, height=600, background_color='white').generate_from_frequencies(word_counts)
    plt.figure(figsize=(10, 8))
    plt.imshow(wordcloud, interpolation='bilinear')
    plt.axis('off')
    plt.title("狮子座相关评价词云", fontsize=20, fontweight='bold', family='Microsoft YaHei')
    plt.show()

def plot_bar_chart(word_counts, top_n=10):
    top_words = dict(word_counts.most_common(top_n))
    plt.figure(figsize=(10, 6))
    plt.bar(top_words.keys(), top_words.values(), color='skyblue')
    plt.title("狮子座最常见形容词柱状图", fontsize=18, fontweight='bold', family='Microsoft YaHei')
    plt.xlabel("形容词", fontsize=14, family='Microsoft YaHei')
    plt.ylabel("频率", fontsize=14, family='Microsoft YaHei')
    plt.xticks(rotation=45)
    plt.show()

def plot_horizontal_bar_chart(word_counts, top_n=10):
    top_words = dict(word_counts.most_common(top_n))
    plt.figure(figsize=(10, 6))
    plt.barh(list(top_words.keys()), list(top_words.values()), color='lightcoral')
    plt.title("狮子座最常见形容词条形图", fontsize=18, fontweight='bold', family='Microsoft YaHei')
    plt.xlabel("频率", fontsize=14, family='Microsoft YaHei')
    plt.ylabel("形容词", fontsize=14, family='Microsoft YaHei')
    plt.show()

def plot_pie_chart(word_counts, top_n=5):
    top_words = dict(word_counts.most_common(top_n))
    plt.figure(figsize=(8, 8))
    plt.pie(top_words.values(), labels=top_words.keys(), autopct='%1.1f%%', startangle=140,
            colors=['skyblue', 'lightgreen', 'lightcoral', 'gold', 'lightpink'])
    plt.title("狮子座最常见形容词饼状图", fontsize=18, fontweight='bold', family='Microsoft YaHei')
    plt.show()

def main():
    text = read_file("test.txt")
    text = clean_text(text)
    words = tokenize(text)
    word_counts = count_words(words)

    generate_wordcloud(word_counts)
    plot_bar_chart(word_counts)
    plot_horizontal_bar_chart(word_counts)
    plot_pie_chart(word_counts)

if __name__ == "__main__":
    main()

 

 


http://www.kler.cn/a/580076.html

相关文章:

  • 【AI论文】SurveyX: 通过大型语言模型实现学术调查自动化
  • FPGA前端设计适合哪些人学?该怎么学?
  • 【kubernetes】service
  • VS 2022 安装速成指南
  • SVN 标签
  • IDEA与Maven使用-学习记录(持续补充...)
  • 全面解析Tomcat:简介、安装与配置指南
  • Git 钩子自动化部署完全指南:掌握 post-receive 触发机制与生产实践
  • 简单以太网配置
  • WPF给ListBox中的每一项添加右键菜单功能
  • Windows平台使用NDK交叉编译OpenCV
  • 在window终端创建docker容器的问题
  • PyTorch中的损失函数:F.nll_loss 与 nn.CrossEntropyLoss
  • 小华半导体学习方法
  • 如何为服务设置合理的线程数
  • mac|IDEA语言中文改回英文
  • Elasticsearch Java API Client [8.17] 使用
  • RoboVQA:机器人多模态长范围推理
  • protobuf, rpc, 火焰图
  • Kubernetes(K8s)集群中使用 GPU