吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3286|回复: 47
收起左侧

[Python 原创] 利用Python爬虫获取知乎热榜

[复制链接]
zz443470785 发表于 2023-8-11 20:04

利用Python爬虫获取知乎热榜

如今,知乎必须要登录才能查看相关话题内容,给我们的日常造成了极大的不便,今天我就教大家如何利用简单的代码,绕开知乎登录限制。

准备工作

  1. 配置好python运行环境,推荐 pycharm。
  2. 复制下面的源代码,运行,大功告成。

源代码

import requests

class Zhihu:
    """
    知乎热榜
    """

    def __init__(self):
        self.hot_lists_api = 'https://api.zhihu.com/topstory/hot-lists/total'  # 热榜api
        self.recommend_lists_api = 'https://api.zhihu.com/topstory/recommend'  # 推荐api
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
        }
        self.hot = self.get_hot_lists()  # 热榜未处理数据
        self.recommend = self.get_recommend_lists()  # 推荐未处理数据
        self.hot_data = self.wash_hot_lists()  # 热榜处理后数据
        self.recommend_data = self.wash_recommend_lists()  # 推荐处理后数据

    def get_hot_lists(self):
        """
        获取知乎热榜
        :return: json
        """
        params = {'limit': '10',
                  'is_browser_model': '0'}
        response = requests.get(url=self.hot_lists_api, headers=self.headers, params=params)
        return response.json()

    def get_recommend_lists(self):
        """
        获取随机推荐
        :return:
        """
        params = {
            "action": "down",
            "ad_interval": "-10",
            "after_id": '1',  # TODO:
            "page_number": '1',  # TODO:
            "session_token": "99872c210b53364be1ede4bf459e8005", }
        response = requests.get(url=self.recommend_lists_api, headers=self.headers, params=params)
        return response.json()

    def wash_hot_lists(self):
        """
        清洗热榜数据
        :return:['[title](url)',....]
        """
        hot_lists = []
        for data in self.hot['data']:
            title = data['target']['title']
            url = data['target']['url'].replace('api.zhihu.com/questions', 'zhihu.com/question')
            hot_lists.append(f'[{title}]({url})')
        return hot_lists

    def wash_recommend_lists(self):
        """
        清洗推荐数据
        :return:
        """
        hot_lists = []
        for data in self.recommend['data']:
            try:
                title = data['target']['question']['title']
                url = data['target']['question']['url'].replace('api.zhihu.com/questions', 'zhihu.com/question')
            except KeyError:
                title = data['target']['title']
                url = data['target']['url'].replace('api.zhihu.com/questions', 'zhihu.com/question')
            hot_lists.append(f'[{title}]({url})')
        return hot_lists

zhihu = Zhihu()

使用教程

  • 要获取当前知乎热榜数据,在源代码末尾添加下面这行代码,然后运行程序即可。
    print(zhihu.hot_data)
  • 要想获取随机推荐话题,在源代码末尾添加下面这行代码,然后运行程序即可。
    print(zhihu.recommend_data)

运行结果展示


运行结果

运行结果

内容展示

内容展示

免费评分

参与人数 8吾爱币 +14 热心值 +8 收起 理由
suoai216 + 1 + 1 谢谢@Thanks!
junjia215 + 1 + 1 热心回复!
kennem + 1 + 1 有用,学习了👍!
fan666 + 1 + 1 我很赞同!
TL1ng + 1 + 1 已经处理,感谢您对吾爱破解论坛的支持!
ghost9527 + 1 + 1 谢谢@Thanks!
chatweish + 1 + 1 我很赞同!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

JKARES 发表于 2023-12-2 16:52
import requests

class Zhihu:
    """
    知乎热榜
    """

    def __init__(self):
        self.hot_lists_api = 'https://api.zhihu.com/topstory/hot-lists/total'  # 热榜api
        self.recommend_lists_api = 'https://api.zhihu.com/topstory/recommend'  # 推荐api
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
        }
        self.hot = self.get_hot_lists()  # 热榜未处理数据
        self.recommend = self.get_recommend_lists()  # 推荐未处理数据
        self.hot_data = self.wash_hot_lists()  # 热榜处理后数据
        self.recommend_data = self.wash_recommend_lists()  # 推荐处理后数据

    def get_hot_lists(self):
        """
        获取知乎热榜
        :return: JSON
        """
        params = {'limit': '10', 'is_browser_model': '0'}
        response = requests.get(url=self.hot_lists_api, headers=self.headers, params=params)
        return response.json()

    def get_recommend_lists(self):
        """
        获取随机推荐
        :return: JSON
        """
        params = {
            "action": "down",
            "ad_interval": "-10",
            "after_id": '1',  # TODO: 设置适当的值
            "page_number": '1',  # TODO: 设置适当的值
            "session_token": "99872c210b53364be1ede4bf459e8005"
        }
        response = requests.get(url=self.recommend_lists_api, headers=self.headers, params=params)
        return response.json()

    def wash_hot_lists(self):
        """
        清洗热榜数据
        :return: ['[title](url)',....]
        """
        hot_lists = []
        for data in self.hot.get('data', []):
            target = data.get('target', {})
            title = target.get('title', '')
            url = target.get('url', '').replace('api.zhihu.com/questions', 'zhihu.com/question')
            hot_lists.append(f'[{title}]({url})')
        return hot_lists

    def wash_recommend_lists(self):
        """
        清洗推荐数据
        :return: ['[title](url)',....]
        """
        hot_lists = []
        for data in self.recommend.get('data', []):
            target = data.get('target', {})
            try:
                question = target.get('question', {})
                title = question.get('title', '')
                url = question.get('url', '').replace('api.zhihu.com/questions', 'zhihu.com/question')
            except KeyError:
                title = target.get('title', '')
                url = target.get('url', '').replace('api.zhihu.com/questions', 'zhihu.com/question')
            hot_lists.append(f'[{title}]({url})')
        return hot_lists

# 创建对象
zhihu = Zhihu()
451982616 发表于 2023-8-29 20:49
有bug,偶发性的,遇到了会报错。推荐里面,不是只有question和无question两种状态,还有没有title和url这种状态。如下图:
有空多多交流
7.png
ztqddj007 发表于 2023-8-15 09:57
chatweish 发表于 2023-8-15 10:01
感谢分享收藏一下
Zw666666 发表于 2023-8-15 11:00
感谢分享,学习下
xinxiu 发表于 2023-8-15 19:27
学习了,做成类,方便调用,不错的写法。
 楼主| zz443470785 发表于 2023-8-15 19:53
xinxiu 发表于 2023-8-15 19:27
学习了,做成类,方便调用,不错的写法。

还有B站、微博、百度、抖音、财经我都做了
xinxiu 发表于 2023-8-15 20:08
zz443470785 发表于 2023-8-15 19:53
还有B站、微博、百度、抖音、财经我都做了

不错,有API接口研究一下应该不难。
我只爬了今日头条。
 楼主| zz443470785 发表于 2023-8-15 22:43
xinxiu 发表于 2023-8-15 20:08
不错,有API接口研究一下应该不难。
我只爬了今日头条。

是的,我都是用手机app抓包,拿到了api接口
ck19960802 发表于 2023-8-18 11:03
感谢分享,是个实用的功能
qlydxy 发表于 2023-8-18 14:00
感谢分享,是个实用的功能,试试手
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 17:53

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表