使用爬虫技术从今日头条获取社会热点

本文涉及的产品
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
实时计算 Flink 版,5000CU*H 3个月
简介: 今日头条是一款基于数据挖掘的推荐引擎产品,能够为用户提供个性化的信息流,涵盖了新闻、视频、娱乐、体育等多个领域。今日头条的内容来源于各大媒体、自媒体、网友等,具有丰富性和多样性。利用爬虫技术,我们可以从今日头条中获取社会热点和舆情分析,为我们的决策和研究提供有价值的数据和洞察。

亿牛云代理.jpg

导语

今日头条是一款基于数据挖掘的推荐引擎产品,能够为用户提供个性化的信息流,涵盖了新闻、视频、娱乐、体育等多个领域。今日头条的内容来源于各大媒体、自媒体、网友等,具有丰富性和多样性。利用爬虫技术,我们可以从今日头条中获取社会热点和舆情分析,为我们的决策和研究提供有价值的数据和洞察。

概述

本文将介绍如何使用爬虫技术从今日头条获取社会热点和舆情分析的方法和步骤。具体而言,我们将完成以下几个任务:

  • 获取今日头条的首页内容,包括标题、链接、标签、评论数等信息
  • 根据标题内容进行文本分析,提取关键词、情感倾向、主题等特征
  • 根据评论数进行排序,筛选出热度较高的内容
  • 根据标签进行分类,统计不同类别的内容数量和占比
  • 根据情感倾向进行分析,评估不同类别的内容的正负面情绪
  • 根据主题进行分析,发现不同类别的内容的主要话题和趋势

正文

获取今日头条的首页内容

为了获取今日头条的首页内容,我们需要使用爬虫技术模拟浏览器访问网站,并解析网页源码中的数据。由于今日头条采用了动态加载和反爬虫机制,我们需要使用一些高级的爬虫技术,如SeleniumBeautifulSoup亿牛云爬虫代理等。

Selenium是一个自动化测试工具,可以模拟用户操作浏览器,实现动态加载网页。BeautifulSoup是一个HTML解析库,可以方便地提取网页中的数据。亿牛云爬虫代理是一个专业的代理服务商,可以提供高速稳定的代理IP,避免被目标网站封禁。

以下是使用Python语言编写的爬虫代码:

# 导入相关库
import requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 设置亿牛云爬虫代理的域名、端口、用户名、密码
proxy_host = "www.16yun.cn"
proxy_port = "9020"
proxy_user = "16YUN"
proxy_pass = "16IP"

# 构造代理认证字符串
proxy_meta = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % {
   
   
    "host": proxy_host,
    "port": proxy_port,
    "user": proxy_user,
    "pass": proxy_pass,
}

# 设置Chrome浏览器选项,使用代理服务器和无头模式(不显示界面)
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--proxy-server=%s' % proxy_meta)
chrome_options.add_argument('--headless')

# 创建Chrome浏览器对象
driver = webdriver.Chrome(options=chrome_options)

# 访问今日头条首页
driver.get("https://www.toutiao.com/")

# 等待页面加载完成,并找到“查看更多”按钮
more_button = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.XPATH, '//div[@class="y-box more-mode"]/a'))
)

# 定义一个空列表,用于存储爬取的数据
data_list = []

# 定义一个循环次数,用于控制爬取的数量
loop_count = 10

# 循环点击“查看更多”按钮,加载更多内容
for i in range(loop_count):
    # 点击按钮
    more_button.click()
    # 等待页面加载完成,并找到所有的新闻条目
    news_items = WebDriverWait(driver, 10).until(
        EC.presence_of_all_elements_located((By.XPATH, '//div[@class="y-box container"]/div[@class="y-left index-content"]//div[@class="single-mode-rbox-inner"]'))
    )
    # 遍历每个新闻条目,提取数据
    for item in news_items:
        # 创建一个空字典,用于存储单个新闻的数据
        data_dict = {
   
   }
        # 提取标题
        title = item.find_element_by_xpath('.//a/div/div[1]/span').text
        data_dict['title'] = title
        # 提取链接
        link = item.find_element_by_xpath('.//a').get_attribute('href')
        data_dict['link'] = link
        # 提取标签
        tag = item.find_element_by_xpath('.//a/div/div[2]/div[1]/span').text
        data_dict['tag'] = tag
        # 提取评论数
        comment = item.find_element_by_xpath('.//a/div/div[2]/div[2]/span[2]').text
        data_dict['comment'] = comment
        # 将单个新闻的数据添加到列表中
        data_list.append(data_dict)
    # 打印当前循环次数和列表长度,用于监控爬虫进度
    print(f"Loop {i+1}, list length: {len(data_list)}")

# 关闭浏览器对象
driver.quit()

# 打印爬取的数据列表,用于查看结果
print(data_list)

根据标题内容进行文本分析

为了对标题内容进行文本分析,我们需要使用一些自然语言处理的技术,如jiebaSnowNLPgensim等。

jieba是一个中文分词库,可以将标题内容切分成单个词语,方便后续的处理。SnowNLP是一个中文情感分析库,可以根据标题内容判断其情感倾向,返回一个0到1之间的数值,越接近1表示越积极,越接近0表示越消极。gensim是一个主题建模库,可以根据标题内容提取其主题,返回一个包含主题词和权重的列表。

以下是使用Python语言编写的文本分析代码:

# 导入相关库
import jieba
from snownlp import SnowNLP
from gensim import corpora, models

# 定义一个空列表,用于存储标题内容
title_list = []

# 遍历爬取的数据列表,提取标题内容,并添加到列表中
for data in data_list:
    title = data['title']
    title_list.append(title)

# 使用jieba对标题内容进行分词,并去除停用词
stopwords = set(open('stopwords.txt', encoding='utf-8').read().splitlines()) # 读取停用词文件,转换为集合
words_list = [] # 定义一个空列表,用于存储分词结果
for title in title_list:
    words = jieba.lcut(title) # 对标题进行分词
    words = [word for word in words if word not in stopwords] # 去除停用词
    words_list.append(words) # 将分词结果添加到列表中

# 使用SnowNLP对标题内容进行情感分析,并计算平均情感倾向
sentiment_list = [] # 定义一个空列表,用于存储情感分析结果
sentiment_sum = 0 # 定义一个变量,用于累计情感倾向值
for title in title_list:
    s = SnowNLP(title) # 创建SnowNLP对象
    sentiment = s.sentiments # 获取情感倾向值
    sentiment_list.append(sentiment) # 将情感倾向值添加到列表中
    sentiment_sum += sentiment # 累加情感倾向值

sentiment_avg = sentiment_sum / len(title_list) # 计算平均情感倾向值

# 使用gensim对标题内容进行主题建模,并提取前10个主题
dictionary = corpora.Dictionary(words_list) # 创建字典对象
corpus = [dictionary.doc2bow(words) for words in words_list] # 将分词结果转换为词袋表示
lda = models.LdaModel(corpus, num_topics=10, id2word=dictionary) # 创建LDA模型对象,并指定主题数为10
topics = lda.print_topics(num_words=5) # 提取前10个主题,并指定每个主题包含5个词

# 打印文本分析的结果,用于查看效果
print(f"Average sentiment: {sentiment_avg}")
print("Top 10 topics:")
for topic in topics:
    print(topic)

根据评论数进行排序,筛选出热度较高的内容

为了根据评论数进行排序,筛选出热度较高的内容,我们需要对爬取的数据列表进行处理,将评论数转换为整数,并按照降序排列。然后,我们可以选择前10个或前20个内容,作为社会热点的代表。

以下是使用Python语言编写的排序和筛选代码:

# 定义一个函数,用于将评论数转换为整数
def comment_to_int(comment):
    # 如果评论数包含“万”字,表示是以万为单位的
    if '万' in comment:
        # 去除“万”字,并转换为浮点数
        comment = float(comment.replace('万', ''))
        # 乘以10000,得到实际的评论数,并转换为整数
        comment = int(comment * 10000)
    # 否则,直接转换为整数
    else:
        comment = int(comment)
    # 返回转换后的评论数
    return comment

# 使用列表推导式,对爬取的数据列表中的每个元素,调用上述函数,将评论数转换为整数,并添加到新的列表中
data_list_new = [{
   
   'title': data['title'], 'link': data['link'], 'tag': data['tag'], 'comment': comment_to_int(data['comment'])} for data in data_list]

# 使用sorted函数,对新的列表进行排序,按照评论数降序排列,并赋值给新的变量
data_list_sorted = sorted(data_list_new, key=lambda x: x['comment'], reverse=True)

# 定义一个变量,用于指定筛选的数量
top_n = 10

# 使用切片操作,从排序后的列表中选择前top_n个元素,并赋值给新的变量
data_list_top = data_list_sorted[:top_n]

# 打印筛选后的数据列表,用于查看结果
print(data_list_top)

根据标签进行分类,统计不同类别的内容数量和占比

为了根据标签进行分类,统计不同类别的内容数量和占比,我们需要对爬取的数据列表进行处理,将标签作为键,内容数量作为值,构建一个字典。然后,我们可以使用matplotlibseaborn等可视化库,绘制饼图或柱状图,展示不同类别的内容数量和占比。

以下是使用Python语言编写的分类和统计代码:

# 导入相关库
import matplotlib.pyplot as plt
import seaborn as sns

# 定义一个空字典,用于存储标签和内容数量的映射关系
tag_dict = {
   
   }

# 遍历爬取的数据列表,提取标签,并更新字典中的内容数量
for data in data_list:
    tag = data['tag']
    # 如果标签已经在字典中,将其对应的值加一
    if tag in tag_dict:
        tag_dict[tag] += 1
    # 否则,将标签作为键,1作为值,添加到字典中
    else:
        tag_dict[tag] = 1

# 打印标签和内容数量的字典,用于查看结果
print(tag_dict)

# 使用matplotlib设置画布大小和风格
plt.figure(figsize=(10, 10))
plt.style.use('ggplot')

# 使用seaborn绘制饼图,并添加标题和图例
sns.pieplot(data=tag_dict, x=tag_dict.keys(), y=tag_dict.values(), autopct='%1.1f%%')
plt.title('Distribution of Content Categories')
plt.legend()

# 显示图像
plt.show()

根据情感倾向进行分析,评估不同类别的内容的正负面情绪

为了根据情感倾向进行分析,评估不同类别的内容的正负面情绪,我们需要对文本分析的结果进行处理,将情感倾向值和标签进行匹配,构建一个新的列表。然后,我们可以使用pandasseaborn等数据分析和可视化库,计算不同类别的内容的平均情感倾向值,并绘制箱线图,展示不同类别的内容的情感分布。

以下是使用Python语言编写的情感分析代码:

# 导入相关库
import pandas as pd
import seaborn as sns

# 定义一个空列表,用于存储情感倾向值和标签的组合
sentiment_tag_list = []

# 遍历爬取的数据列表和情感分析结果列表,提取情感倾向值和标签,并添加到列表中
for data, sentiment in zip(data_list, sentiment_list):
    tag = data['tag']
    sentiment_tag_list.append((sentiment, tag))

# 使用pandas创建数据框对象,并指定列名
df = pd.DataFrame(sentiment_tag_list, columns=['sentiment', 'tag'])

# 使用pandas按照标签分组,并计算每个组的平均情感倾向值
df_grouped = df.groupby('tag').mean()

# 打印分组后的数据框,用于查看结果
print(df_grouped)

# 使用seaborn绘制箱线图,并添加标题和轴标签
sns.boxplot(data=df, x='tag', y='sentiment')
plt.title('Sentiment Analysis of Different Content Categories')
plt.xlabel('Category')
plt.ylabel('Sentiment')

# 显示图像
plt.show()

根据主题进行分析,发现不同类别的内容的主要话题和趋势

为了根据主题进行分析,发现不同类别的内容的主要话题和趋势,我们需要对主题建模的结果进行处理,将主题词和权重和标签进行匹配,构建一个新的字典。然后,我们可以使用wordcloud等可视化库,绘制词云图,展示不同类别的内容的主要话题。

以下是使用Python语言编写的主题分析代码:

# 导入相关库
from wordcloud import WordCloud

# 定义一个空字典,用于存储标签和主题词及权重的映射关系
tag_topic_dict = {
   
   }

# 遍历爬取的数据列表和主题建模结果列表,提取标签和主题词及权重,并更新字典中的值
for data, topic in zip(data_list, topics):
    tag = data['tag']
    # 如果标签已经在字典中,将其对应的值与主题词及权重合并
    if tag in tag_topic_dict:
        tag_topic_dict[tag] += topic[1]
    # 否则,将标签作为键,主题词及权重作为值,添加到字典中
    else:
        tag_topic_dict[tag] = topic[1]

# 打印标签和主题词及权重的字典,用于查看结果
print(tag_topic_dict)

# 使用wordcloud创建词云对象,并指定字体、背景颜色、最大词数等参数
wc = WordCloud(font_path='simhei.ttf', background_color='white', max_words=50)

# 遍历字典中的每个键值对,绘制词云图,并添加标题
for tag, topic in tag_topic_dict.items():
    # 使用词云对象生成词云图
    wc.generate_from_text(topic)
    # 添加标题
    plt.title(f'Top Topics of {tag}')
    # 显示图像
    plt.imshow(wc)
    plt.show()

结语

本文介绍了如何使用爬虫技术从今日头条获取社会热点和舆情分析的方法和步骤。通过使用Selenium、BeautifulSoup、亿牛云爬虫代理等高级爬虫技术,我们可以成功地爬取和分析了今日头条的首页内容,包括标题、链接、标签、评论数等信息。通过使用jieba、SnowNLP、gensim等自然语言处理技术,我们可以对标题内容进行文本分析,提取关键词、情感倾向、主题等特征。通过使用matplotlib、seaborn、wordcloud等可视化库,我们可以对不同类别的内容进行排序、分类、情感分析、主题分析等,展示社会热点和舆情分析的结果。本文的目的是为了演示如何使用爬虫技术从今日头条获取社会热点和舆情分析,仅供参考和学习,感谢你的阅读和支持。

相关文章
|
2月前
|
数据采集 监控 数据库
爬虫技术详解:从原理到实践
本文详细介绍了爬虫技术,从基本概念到实际操作,涵盖爬虫定义、工作流程及Python实现方法。通过使用`requests`和`BeautifulSoup`库,演示了如何发送请求、解析响应、提取和保存数据,适合初学者学习。强调了遵守法律法规的重要性。
299 4
|
26天前
|
数据采集 搜索推荐 数据安全/隐私保护
Referer头部在网站反爬虫技术中的运用
Referer头部在网站反爬虫技术中的运用
|
11天前
|
数据采集 存储 缓存
如何使用缓存技术提升Python爬虫效率
如何使用缓存技术提升Python爬虫效率
|
26天前
|
数据采集 存储 JavaScript
网页爬虫技术全解析:从基础到实战
在信息爆炸的时代,网页爬虫作为数据采集的重要工具,已成为数据科学家、研究人员和开发者不可或缺的技术。本文全面解析网页爬虫的基础概念、工作原理、技术栈与工具,以及实战案例,探讨其合法性与道德问题,分享爬虫设计与实现的详细步骤,介绍优化与维护的方法,应对反爬虫机制、动态内容加载等挑战,旨在帮助读者深入理解并合理运用网页爬虫技术。
|
3月前
|
数据采集 存储 数据挖掘
深入探索 Python 爬虫:高级技术与实战应用
本文介绍了Python爬虫的高级技术,涵盖并发处理、反爬虫策略(如验证码识别与模拟登录)及数据存储与处理方法。通过asyncio库实现异步爬虫,提升效率;利用tesseract和requests库应对反爬措施;借助SQLAlchemy和pandas进行数据存储与分析。实战部分展示了如何爬取电商网站的商品信息及新闻网站的文章内容。提醒读者在实际应用中需遵守法律法规。
220 66
|
14天前
|
数据采集 安全 API
高级技术文章:使用 Kotlin 和 Unirest 构建高效的 Facebook 图像爬虫
高级技术文章:使用 Kotlin 和 Unirest 构建高效的 Facebook 图像爬虫
|
2月前
|
数据采集 Web App开发 iOS开发
如何利用 Python 的爬虫技术获取淘宝天猫商品的价格信息?
本文介绍了使用 Python 爬虫技术获取淘宝天猫商品价格信息的两种方法。方法一使用 Selenium 模拟浏览器操作,通过定位页面元素获取价格;方法二使用 Requests 和正则表达式直接请求页面内容并提取价格。每种方法都有详细步骤和代码示例,但需注意反爬措施和法律法规。
|
2月前
|
数据采集 存储 Web App开发
利用Python 的爬虫技术淘宝天猫销量和库存
使用 Python 爬虫技术获取淘宝天猫商品销量和库存的步骤包括:1. 安装 Python 和相关库(如 selenium、pandas),下载浏览器驱动;2. 使用 selenium 登录淘宝或天猫;3. 访问商品页面,分析网页结构,提取销量和库存信息;4. 处理和存储数据。注意网页结构可能变化,需遵守法律法规。
|
2月前
|
数据采集 JavaScript 程序员
探索CSDN博客数据:使用Python爬虫技术
本文介绍了如何利用Python的requests和pyquery库爬取CSDN博客数据,包括环境准备、代码解析及注意事项,适合初学者学习。
97 0
|
3月前
|
数据采集 Web App开发 JavaScript
Selenium爬虫技术:如何模拟鼠标悬停抓取动态内容
本文介绍了如何使用Selenium爬虫技术抓取抖音评论,通过模拟鼠标悬停操作和结合代理IP、Cookie及User-Agent设置,有效应对动态内容加载和反爬机制。代码示例展示了具体实现步骤,帮助读者掌握这一实用技能。
140 0
Selenium爬虫技术:如何模拟鼠标悬停抓取动态内容