利用搜索关键字爬取今日头条新闻评论信息案例

2023-11-19

利用搜索关键字爬取今日头条新闻评论信息案例

爬虫4步骤:

1.分析网页
2.对网页发送请求,获取响应
3.提取解析数据
4.保存数据

本案例所用到的模块

import requests
import time
import csv

案例网址:https://www.toutiao.com/

一、分析网页

如果我们想通过关键字来搜索爬取新闻的评论信息,就需要找到它们的接口,但是这个接口应该如何找呢,其实也不难找,我们在首页中的搜索栏中,输入想搜索的关键字,点击搜索:
在这里插入图片描述然后网址会给我们跳转到一个搜索出来该关键字的新闻页面:
在这里插入图片描述找到这个页面,我们就可以按F12进入到开发者模式。经过分析,因为是动态加载页面,我们很简单的就可以找到包含新闻数据的网址接口:
在这里插入图片描述有了网址接口,就需要分析这个网址的信息,可以看出这个网址非常的长,里面有很多必须要加载的参数,该参数也就是我们常说的params参数了:
在这里插入图片描述图中标识的这3个参数信息就是我们必须要用到的信息,offset是页码的信息,用它我们可以实现翻页的爬取数据,keyword是关键字信息,这个一般都懂的,timestamp就是一个时间戳,只不过这个时间戳做了些变化,我在之前的博文中也讲到过,这里就不在赘述了,感兴趣的可以看我之前的那篇博文:Python爬取基金数据案例
现在我们看看这个接口网址里面的信息是什么样的,如图:
在这里插入图片描述
可以看出,这个接口里面的信息就是一个json数据格式的信息,所有新闻数据的信息都在data这个列表中,每一个列表里面就是一条新闻数据信息,我们需要提取出来每条信息数据的链接地址和该新闻所属的ID信息,这个ID信息很有用,在提提取评论信息的时候需要用到:
在这里插入图片描述
上图这个是包含评论信息的params参数,可以看到该参数里面有两个关键参数,group_id和item_id,这个group_id正好对应上面那个接口信息里面的group_id,至于item_id那就是和group_id一样,到这里我们能就算分析完成了。现在说一下大体思路,通过搜索我们获取到所有包含该新闻数据的接口网址,然后对该网址发送请求,提取需要的数据,然后,在把需要的数据构建给包含每条信息数据评论的接口,对这个接口再次发送请求,最后提取出每条新闻数据的信息并保存。

二、构建params参数,并发送请求,获取响应数据

代码如下:

    def paramsData(self):
        """
        构建params的方法
        :return: 
        """
        params = {
            "aid": "24",
            "app_name": "web_search",
            "offset": str(self.page),
            "format": "json",
            "keyword": self.search_name,
            "autoload": "true",
            "count": "20",
            "en_qc": "1",
            "cur_tab": "1",
            "from": "search_tab",
            "pd": "synthesis",
            "timestamp": self.TIMESTRF,
        }
        return params

    def parse_url(self, url, params):
        """
        发送请求,获取响应的方法
        :param url: self.API_URL 
        :param params: 
        :return: 
        """
        response = requests.get(url=url, headers=self.headers, params=params)
        if response.status_code == 200:
            return response

三、提取需要的数据

  # 提取需要的信息的方法
    def get_news_data(self, json_str):
        """
        # 提取需要的信息的方法
        :param json_str:
        :return:
        """
        news_dict = {}
        # 提取新闻的url
        news_dict['news_url'] = json_str.get('article_url')
        # 提取新闻的标题
        news_dict['news_title'] = json_str.get('title')
        # 提取新闻的ID
        news_dict['group_id'] = json_str.get('group_id')
        return news_dict

四、再次构建params参数,并再次请求提取出的URL

    def paramsData2(self, news_dict):
        """
        再次构建params的方法
        :param news_dict:
        :return:
        """
        params2 = {
            "aid": "24",
            "app_name": "toutiao_web",
            "offset": "0",
            "count": "10",
            "group_id": news_dict.get('group_id'),
            "item_id": news_dict.get('group_id'),
        }
        return params2

五、提取评论数据

 def get_pinglun_data(self, resp):
        """
        提取需要的评论信息的方法
        :param resp:
        :return:
        """
        json_str = resp.json()
        for json in json_str.get('data'):
            create_time = time.localtime(json.get('comment').get('create_time'))
            Time = time.strftime("%Y-%m-%d %H:%M:%S", create_time)
            yield {
                # 提取评论者id
                'user_id': json.get('comment').get('user_id'),
                # 提取评论者名字
                'user_name': json.get('comment').get('user_name'),
                # 提取评论内容
                'pl_content': json.get('comment').get('text'),
                # 提取评论时间
                'pl_time': Time
            }
完成后效果:

在这里插入图片描述

六、完整代码:

# 导入需要的模块
import requests
import time
import csv


class JrttSpider:
    """爬取今日头条新闻评论"""

    def __init__(self, search_name, page):
        self.API_URL = 'https://www.toutiao.com/api/search/content/'
        self.PINGLUN_URL = 'https://www.toutiao.com/article/v2/tab_comments/'
        self.headers = {
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36'
        }
        self.search_name = search_name
        self.PAGE = page
        self.TIMESTRF = int(time.time()) * 1000

    def paramsData(self):
        """
        构建params的方法
        :return:
        """
        params = {
            "aid": "24",
            "app_name": "web_search",
            "offset": str(self.PAGE),
            "format": "json",
            "keyword": self.search_name,
            "autoload": "true",
            "count": "20",
            "en_qc": "1",
            "cur_tab": "1",
            "from": "search_tab",
            "pd": "synthesis",
            "timestamp": self.TIMESTRF,
        }
        return params

    def parse_url(self, url, params):
        """
        发送请求,获取响应的方法
        :param url: self.API_URL
        :param params:
        :return:
        """
        response = requests.get(url=url, headers=self.headers, params=params)
        if response.status_code == 200:
            return response

    # 提取需要的信息的方法
    def get_news_data(self, json_str):
        """
        # 提取需要的信息的方法
        :param json_str:
        :return:
        """
        news_dict = {}
        # 提取新闻的链接
        news_dict['news_url'] = json_str.get('article_url')
        # 提取新闻的标题
        news_dict['news_title'] = json_str.get('title')
        # 提取新闻的ID
        news_dict['group_id'] = json_str.get('group_id')
        return news_dict

    def paramsData2(self, news_dict):
        """
        再次构建params的方法
        :param news_dict:
        :return:
        """
        params2 = {
            "aid": "24",
            "app_name": "toutiao_web",
            "offset": "0",
            "count": "10",
            "group_id": news_dict.get('group_id'),
            "item_id": news_dict.get('group_id'),
        }
        return params2

    def get_pinglun_data(self, resp):
        """
        提取需要的评论信息的方法
        :param resp:
        :return:
        """
        json_str = resp.json()
        for json in json_str.get('data'):
            create_time = time.localtime(json.get('comment').get('create_time'))
            Time = time.strftime("%Y-%m-%d %H:%M:%S", create_time)
            yield {
                # 提取评论者id
                'user_id': json.get('comment').get('user_id'),
                # 提取评论者名字
                'user_name': json.get('comment').get('user_name'),
                # 提取评论内容
                'pl_content': json.get('comment').get('text'),
                # 提取评论时间
                'pl_time': Time
            }

    def run(self):
        """
        # 实现主要逻辑思路
        :return:
        """
        with open('./news_pl.csv', 'a', encoding='utf-8-sig', newline="") as csvfile:
            fieldnames = ['news_title', 'user_id', 'user_name', 'pl_content', "pl_time"]
            write_dict = csv.DictWriter(csvfile, fieldnames=fieldnames)
            write_dict.writeheader()
            # 1.构建params数据
            params = self.paramsData()
            # 2.发送请求,获取响应
            response = self.parse_url(self.API_URL, params)
            # 3.提取需要的数据
            for json_str in response.json().get('data'):
                # 4.把提取出的数据放入到字典里面
                news_dict = self.get_news_data(json_str)
                # 5.再次构建params数据
                params2 = self.paramsData2(news_dict)
                # 6.再次发送请求,获取响应
                resp = self.parse_url(self.PINGLUN_URL, params2)
                # 7.提取需要的数据
                pinglun_list = self.get_pinglun_data(resp)
                news_pl_dict = {'news_title': news_dict.get('news_title')}
                for pinglun_dict in pinglun_list:
                    news_pl_dict.update(pinglun_dict)
                    print(news_pl_dict)
                    # 8.保存数据
                    write_dict.writerow(news_pl_dict)


if __name__ == '__main__':
    serch_name = input('请输入你需要搜索的新闻关键字:')
    for page in range(0, 201, 20):
        jrtt_data = JrttSpider(serch_name, page)
        jrtt_data.run()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用搜索关键字爬取今日头条新闻评论信息案例 的相关文章

随机推荐

  • vue + 高德地图 + 标记点

    其他 高德地图引入及使用 vue 高德地图 标记点 变大变小闪烁动画 多标记点 同一位置标记点显示个数 增加标记点 绘制地图 this map new AMap Map map resizeEnable true center 120 35
  • 区块链学习笔记(一)——比特币概念以及密码学相关的知识

    自己做一些让自己读得懂的笔记 区块链学习笔记 一 1 Bitcoin History 1 1 一个关于bitcoin的时间线 2 Crytography of the Blockchain 2 1 the Hash function 2 1
  • 时间序列预测之ARMA、ARIMA序列及季节性序列matlab实现

    ARMA是一种平稳时间序列模型 即均值和协方差不随时间的平移而改变 ARMA有三种类型 AR序列 MA序列 ARMA序列 但是由于ARMA只能处理平稳序列 而现实中的问题往往有趋势性或周期性等 为了得到平稳序列 我们对数据进行差分运算 使得
  • 【编辑器】UnityConsole界面双击日志跳转

    环境 发布正式包时 Unity的原生Log肯定是要屏蔽的 最常用的做法就是自己封装一下 实现一个debug 不过这样的话 双击跳转就会去到Debug类里面去 为了方便查bug 实现一下日志跳转 实现 看了一下网上的资料 思路应该就是通过类型
  • 【系统移植】开发板的启动过程(认识uboot)

    在系统移植之前 需要先了解开发板启动的大致流程 了解了大致流程后 才知道开发板启动需要哪些东西 了解开发板启动的时候 一定会遇到闻所未闻的东西 所以我们了解的顺序是 了解开发板启动时涉及到的部件 了解启动过程中涉及到的文件 uboot 内核
  • msfvenom生成各种Payload命令

    msfvenom生成各种Payload命令 msfvenom l 列出所有模块 攻击载荷 Binaries linux msfvenom p linux x86 meterpreter reverse tcp LHOST
  • Ubuntu 安装配置NFS网络文件系统服务器(详细)

    现在我的电脑连接情况 Ubuntu 安装配置NFS服务器 一 安装NFS服务器1 1 安装Ubuntu nfs服务器端 sudo apt get install nfs kernel server 很显然 我已经安装过了 继续往下走 1 2
  • 从零开始刷题1

    又一道简单等级的题 小白打小怪 最大时间 给定一个由 4 位数字组成的数组 返回可以设置的符合 24 小时制的最大时间 最小的 24 小时制时间是 00 00 而最大的是 23 59 从 00 00 午夜 开始算起 过得越久 时间越大 以长
  • 网络编程是什么

    转载 http peixun eol cn company company article detail php articleid 15033 对于初学者 或者没有接触过网络编程的程序员 会觉得网络编程涉及的知识很高深 很难 其实这是一种
  • 【数据结构】堆、栈的区别

    heap 是堆 stack 是栈 在编程语言中 内存分配方式主要包括 栈 堆 静态存储分配 栈的内存是由操作系统自动分配 释放的 存放函数的参数值 局部变量等 堆的内存是由程序员手动申请和释放的 对应C语言中的malloc函数和C 中的ne
  • 服务器意外重启后redis启动失败或无法连接的问题解决办法

    今天开发服务器因机房断电重启了 然后发现所有的PHP接口都报错 session write close Failed to write session data using user defined save handler session
  • 【C++自我精讲】基础系列四 static

    C 自我精讲 基础系列四 static 0 前言 变量的存储类型 存储类型按变量的生存期划分 分动态存储方式和静态存储方式 1 动态存储方式的变量 生存期为变量所在的作用域 即程序运行到此变量时才为其分配存储空间 作用域结束时 会自动收回为
  • 企业支付宝白名单和数字娱乐线上接口解析。

    企业支付宝白名单 企业支付宝白名单是指企业在支付宝平台上享受更多支付和服务权限的一种认证机制 通过加入支付宝白名单 企业可以获得更高的交易额度 更灵活的支付功能和更便捷的服务 具体来说 企业支付宝白名单的好处包括 提升支付额度 白名单企业可
  • unzip命令常用参数

    1 l 显示压缩文件内所包含的文件 2 t 检查压缩文件是否正确 3 o 不必先询问用户 unzip执行后覆盖原有的文件 4 n 解压缩时不要覆盖原有的文件 5 q 执行时不显示任何信息 6 d lt 目录 gt 指定文件解压缩后所要存储的
  • redis进行set操作时异常总结

    事情经过 项目中使用redis 环境进行过一次网络迁移 之后就无法拿到redis连接 1 先通过ping命令排除网络原因 其实这里建议使用 telnet 命令 格式 telnet ip port 不仅能排查网络是否连通并且知道改端口号是否能
  • PTA-ASCII码实战

    给出一系列字符 有大小写英文字母和其他一些字符 仅涉及ASCII打印字符 即ASCII码值 gt 32 现在想让你鉴别以下这些字符 如果是英文字母则输出其ASCII码值 否则输出 illegal 不包含引号 输入格式 第一行一个整数N 0
  • 详解Singleton、Factory、Strategy在项目中的应用

    一 前言 前几天阅读一框架文档 里面有一段这样的描述 从对象工厂中 促使写下本文 尽管一些模式简单和简单 但是常用 有用 结合最近一个项目场景回顾一下里面应用到的一些模式 Singleton Factory Strategy Singlet
  • pm2的的使用(基础)

    技术背景 相信大家都有这样一个烦恼 自己写了一个服务 并且通过cmd面板开启了这个服务 可是 当你关掉cmd命令行面板的时候 你会发现你的服务也跟着停止了 这种现象是我们不想要的 所以 诞生了一种技术 pm2服务持久化管理 技术的简单使用
  • SQL主键与外键的创建与解析

    一个表中 会存很多条记录 需要一个列来位置标识一条数据 1 主键 唯一标识一条数据 值不能为空 不能重复 标识列 一旦将一个列设置成标识列 它就不能再手动输入值 是插入数据时自动生成的 这个列的类型必须的不带小数的数值型 整型 标识列的标识
  • 利用搜索关键字爬取今日头条新闻评论信息案例

    利用搜索关键字爬取今日头条新闻评论信息案例 爬虫4步骤 1 分析网页 2 对网页发送请求 获取响应 3 提取解析数据 4 保存数据 本案例所用到的模块 import requests import time import csv 案例网址