python五十行代码批量下载热榜回答

news/2024/7/19 10:13:03 标签: python, 爬虫, 语言模型

前言

作为微调语言模型的一环,我们需要去网上搜集大量的文字资料,某网充满大量公开的高质量的问题和回答,适合用来训练。那么我们今天将下载它两年的热榜问题和回答。

思路

首先我们随便点进一个问题的回答,点击分享,复制链接。
发现链接构造如下:
https://www.zhihu.com/question/431730729/answer/1591942026
由一个question ID和answer ID构造而成的链接,那么引出以下问题:
1.question ID即问题的id,如何获得近两年热榜的所有问题id呢?
2.answer ID即回答的id,这个看起来像是所有的问题下的回答共享一个,没办法通过循环获取当前问题下的回答id。
3.有了这些id之后如何获取链接里面的文字?

准备

1.可以在github上找到定时爬取的热搜榜:
https://github.com/justjavac/zhihu-trending-hot-questions
从 2020-11-24 日开始,下载后解压,在archive文件夹下可以找到所有热搜的md文档。

2.安装需要的库

python">pip install beautifulsoup4
pip install lxml

3.规划代码
根据问题可以分为三部分:
第一部分从md文档里提取所有的热榜url链接。
第二部分根据热榜的url链接获取下面的回答链接。
第三部分根据问题和回答构造的唯一链接来获取页面内容。

代码

注意该代码默认存放位置在archive目录下以读取所有md文档的文件名。

python">from bs4 import BeautifulSoup
import json
import numpy as np
import requests
import os
import re
import time
#第一部分
headers = {
    'content-type': 'text/html; charset=UTF-8',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)'
                  ' Chrome/111.0.0.0 Safari/537.36'}
arr = os.listdir()
print(arr)
list_total_question = []
for x in arr:
    if x.endswith('.md'):
        with open(x,'r',encoding='utf8') as hot_diary:
            pattern = r'https://www.zhihu.com/question/(\d+)'
            list_total_question+=re.findall(pattern, hot_diary.read())
print(len(list_total_question))
#第二部分
list_all_url = []
for x in list_total_question:
    a1 = time.time()
    url = 'https://www.zhihu.com/api/v4/questions/'+str(x)+'/feeds?'
    datas = requests.get(url,headers=headers).json()
    for info in datas['data']:
        answerid = info['target']['id']
        final_url = 'https://www.zhihu.com/question/'+x+'/answer/'+str(answerid)
        list_all_url.append(final_url)
        #break #每条问题默认提取五条问答,此处Break则只选默认排序第一条
    a2 = time.time()
    print(a2-a1) #0.5s
    break #选一条问题进行测试
print(list_all_url)
#第三部分
list_json = []
for x in list_all_url:
    html = requests.get(url=x, headers=headers)
    site = BeautifulSoup(html.text, 'lxml')
    title = site.find_all('meta', attrs={'itemprop': "name"}, recursive=True, limit=1)[0].__getattribute__('attrs')[
        'content']
    text = site.find('div', attrs={'class': "RichContent-inner"})
    print(title)
    total_string = ""
    for i in text:
        if i.text.find('.css') == -1:
            total_string += i.text
    dict_json = {"instruction":title,"input":"","output":total_string}
    list_json.append(dict_json)
print(list_json)

爬取所有168500条热榜需要大概91000秒,提取信息还没测试,如果只是想简单看下效果可以添加break测试单条。代码中默认是提取了第一条问题的五条回答。 存文件的代码这里就不写了,很简单。

效果

在这里插入图片描述
这里以json形式构造是为了接下来使用库来微调大语言模型,不需要的话自行去掉。


http://www.niftyadmin.cn/n/218959.html

相关文章

javaweb笔记2

JSP 1、在webapp的根目录下新建一个index.jsp文件,访问以下地址: http://localhost:8080/webappName/index.jsp 实际上访问这个index.jsp文件,底层执行的是:index_jsp.class这个程序。 这个index.jsp会被tomcat翻译成index_jsp.j…

【c++初阶】命名空间的定义

命名空间的定义一.缺陷二.namespace和::三.访问namespace四.一些注意1.工程里标准库的展开2.命名域的小技巧一.缺陷 在c语言中,如果我们同时定义一个全局变量和一个局部变量并且使用同一个名称的话,是可以编过的(因为全局和局部是属于两个不同…

JavaScript基础05 - JSON

JavaScript基础05students.xml001002003-eval函数004students.xml <?xml version"1.0" encoding"GBK"?><!--HTML和XML有一个父亲&#xff1a;SGML&#xff08;标准通用的标记语言。&#xff09;HTML主要做页面展示&#xff1a;所以语法松散。很…

UDS介绍

首先要有网络网络七层的概念&#xff1a; 学习链接&#xff1a; 七层网络模型-CSDN博客 UDS网络层/TP层&#xff08;ISO 15765-2&#xff09;的解读 - 知乎 (zhihu.com) 概念&#xff1a; UDS&#xff08;Unified Diagnostic Services&#xff0c;统一的诊断服务。 标准名是《…

iot-Scada免费Scada组态软件系列教程1-初识iot-Scada

iot-Scada免费Scada组态软件系列教程 系列文章目录 iot-Scada免费Scada组态软件系列教程1-初识iot-Scada iot-Scada免费Scada组态软件系列教程2-架构设计 iot-Scada免费Scada组态软件系列教程3-各模块详细介绍 iot-Scada免费Scada组态软件系列教程4-二次开发与版本部署 前…

Spring学习(五):一篇讲清楚动态代理(jdk和cglib)的使用、原理和源码

目录 一、jdk动态代理的基本使用 二、cglib动态代理的基本使用 2.1 方法一&#xff1a;method.invoke() 方法反射调用 2.2 方法二&#xff08;spring使用的这个方法&#xff09;&#xff1a; methodProxy.invoke() 2.3 方法三&#xff1a;methodProxy.invokeSuper() 三、…

终端针对2G/3G退网场景处理方式介绍

本文介绍两种终端针对2G、3G网络频谱释放场景处理方式。 呼叫过程中网络返回SIP ERROR终端IMS呼叫过程中,网络返回PRACK message error,不同的运营商可能会有不同的要求。 如果运营商希望终端保持较好的IMS呼叫连续性和呼通率,那么终端可以忽略网络返回的错误继续完成IMS呼…

Spark core 弹性式数据集RDD

目录 一.RDD简介 二.RDD的特性&#xff1a; 三.执行原理&#xff1a; 1.启动Yarn集群环境&#xff1a; 2.Spark通过申请资源创建调度节点和计算节点&#xff1a; 3.Spark框架根据需求将计算逻辑根据分区划分不同的任务&#xff1a; 4.调度节点将任务根据计算节点状态发送到对应…