IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> Python爬虫实战:抓取知乎问题下所有回答 -> 正文阅读

[人工智能]Python爬虫实战:抓取知乎问题下所有回答

好久不见,工作有点忙...虽然每天都是在写爬虫,也解锁了很多爬虫实战新技能,但由于工作里是用 NodeJS,已经好久没动手写 Python 了。

对于解决需求问题来说,无论 Python 还是 NodeJS 也只不过是语法和模块不同,分析思路和解决方案是基本一致的。

最近写了个简单的知乎回答的爬虫,感兴趣的话一起来看看吧。

需求

抓取知乎问题下所有回答,包括其作者、作者粉丝数、回答内容、时间、回答的评论数、回答赞同数以及该回答的链接。

分析

以上图中问题为例,想要拿到回答的相关数据,一般我们可以在 Chrome 浏览器下按 F12 来分析请求;但借助Charles抓包工具可以更直观地获取相关字段:

注意我标注的 Query String 参数中 limit 5 表示每次请求返回 5 条回答,经测试最多可以改成 20;offset 表示从第几个回答开始;

而返回的结果是 Json 格式的,每一条回答包含的信息足够多,我们只要筛选想要抓取的字段记录保存即可。

需要注意的是 content 字段中返回的是回答内容,但它格式是带了网页标签的,经过搜索我选用了 HTMLParser 来解析,就免得自己再手动处理了。

代码

import requests,json
import datetime
import pandas as pd
from selectolax.parser import HTMLParser


url = 'https://www.zhihu.com/api/v4/questions/486212129/answers'
headers = {
    'Host':'www.zhihu.com',
    'user-agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36',
    'referer':'https://www.zhihu.com/question/486212129'
}
df = pd.DataFrame(columns=('author','fans_count','content','created_time','updated_time','comment_count','voteup_count','url'))


def crawler(start):
    print(start)
    global df
    data= {
        'include':'data[*].is_normal,admin_closed_comment,reward_info,is_collapsed,annotation_action,annotation_detail,collapse_reason,is_sticky,collapsed_by,suggest_edit,comment_count,can_comment,content,editable_content,attachment,voteup_count,reshipment_settings,comment_permission,created_time,updated_time,review_info,relevant_info,question,excerpt,is_labeled,paid_info,paid_info_content,relationship.is_authorized,is_author,voting,is_thanked,is_nothelp,is_recognized;data[*].mark_infos[*].url;data[*].author.follower_count,vip_info,badge[*].topics;data[*].settings.table_of_content.enabled',
        'offset':start,
        'limit':20,
        'sort_by':'default',
        'platform':'desktop'
    }


    #将携带的参数传给params
    r = requests.get(url, params=data,headers=headers)
    res = json.loads(r.text)
    if res['data']:
        for answer in res['data']:
            author = answer['author']['name']
            fans = answer['author']['follower_count']
            content = HTMLParser(answer['content']).text()
            #content = answer['content']
            created_time = datetime.datetime.fromtimestamp(answer['created_time'])
            updated_time = datetime.datetime.fromtimestamp(answer['updated_time'])
            comment = answer['comment_count']
            voteup = answer['voteup_count']
            link = answer['url']


            row = {
                'author':[author],
                'fans_count':[fans],
                'content':[content],
                'created_time':[created_time],
                'updated_time':[updated_time],
                'comment_count':[comment],
                'voteup_count':[voteup],
                'url':[link]
            }
            df = df.append(pd.DataFrame(row),ignore_index=True)


        if len(res['data'])==20:
            crawler(start+20)
    else:
        print(res)
        
crawler(0)
df.to_csv(f'result_{datetime.datetime.now().strftime("%Y-%m-%d")}.csv',index=False)
print("done~")

结果

最终抓取结果大致如下:

可以看到有的回答是空的,去问题下检查发现是视频回答,没有文本内容,这个就先忽略了,当然可以自己再取下视频链接加到结果中。

目前(2021.09)看这个问题接口没有特别大限制,包括我在代码里的请求也没有带 cookie 直接来抓取的,而且通过修改 limit 参数到 20 来减少请求次数。

爬虫意义

最近也在想爬虫抓取知乎回答的意义在哪,起初是想汇总所有答案来分析下,但实际抓取完想一起阅读,发现在表格中读回答的阅读体验很差,不如直接去刷知乎;但比较明显的价值在于横向对比这几百个回答,回答的赞同、评论以及作者的粉丝情况都一目了然。此外,还可以根据结果做一些词频分析、词云图展示等,这些就是后话了。

爬虫只是获取数据的一种途径,如何解读才是数据的更大价值所在。

我是TED,一个天天写爬虫、但好久没写Python的数据工程师,后续会继续更新一系列自己琢磨的 Python 爬虫项目,欢迎持续关注~

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-09-19 07:59:01  更:2021-09-19 07:59:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 14:31:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码