AI大模型探索之路-实战篇:智能化IT领域搜索引擎之知乎网站数据获取(初步实践)

news2025/6/26 2:25:40

系列篇章💥

No.文章
1AI大模型探索之路-实战篇:智能化IT领域搜索引擎的构建与初步实践
2AI大模型探索之路-实战篇:智能化IT领域搜索引擎之GLM-4大模型技术的实践探索
3AI大模型探索之路-实战篇:智能化IT领域搜索引擎之知乎网站数据获取(初步实践)
4AI大模型探索之路-实战篇:智能化IT领域搜索引擎之知乎网站数据获取(函数封装)
5AI大模型探索之路-实战篇:智能化IT领域搜索引擎之知乎网站数据获取(流程优化)
6AI大模型探索之路-实战篇:智能化IT领域搜索引擎之github网站在线搜索
7AI大模型探索之路-实战篇:智能化IT领域搜索引擎之HuggingFace网站在线搜索

目录

  • 系列篇章💥
  • 一、前言
  • 二、总体概览
  • 三、搜索API封装测试
    • 1、导入依赖并初始化客户端
    • 2、大模型回答问题策略测试
    • 3、function calling函数测试
    • 4、谷歌搜索API开发
  • 四、知乎网站数据爬取
    • 1、数据格式定义
    • 2、设置知乎排除的网站
    • 3、Google api调用测试
    • 4、爬虫之Cookie获取
    • 5、爬虫之user-agent
    • 6、爬虫之获取PATH
    • 7、网络爬虫代码编写
    • 8、question类型的网站爬虫测试
    • 9、网页数据保存
    • 10、question/answer网站爬虫测试
    • 11、专栏类网站爬虫测试
  • 结语


一、前言

在先前的文章中,我们完成了智能化IT领域搜索引擎的基础架构设计以及Google Search API的申请等前期准备工作。同时,我们还实践测试了GLM4的Function Calling能力,为后续的开发奠定了坚实的基础。本文将正式进入代码开发阶段,首先从知乎网站的数据搜索开始。

二、总体概览

本文将详细阐述如何逐步实现知乎网站数据获取的整个流程。我们将从知乎网站的结构分析入手,通过编写高效的网络爬虫程序,实现对知乎问题的智能检索,并利用先进的数据分析技术,对获取的数据进行深度挖掘和整合,最终将这些有价值的信息融入我们的智能化IT领域搜索引擎中,为用户提供更全面、准确的搜索结果。这一过程中,我们将不断优化算法,提升数据获取的效率和准确性,确保搜索引擎的智能化水平得到持续提升。

三、搜索API封装测试

1、导入依赖并初始化客户端

导入依赖

! pip install --upgrade zhipuai
! pip install --upgrade google-auth google-auth-httplib2 google-auth-oauthlib google-api-python-client requests

创建客户端

import os
import openai
from openai import OpenAI
import glob
import shutil

import numpy as np
import pandas as pd

import json
import io
import inspect
import requests
import re
import random
import string

from googleapiclient.discovery import build
from google.oauth2.credentials import Credentials
from google_auth_oauthlib.flow import InstalledAppFlow
import base64


from bs4 import BeautifulSoup
import dateutil.parser as parser
import tiktoken
from lxml import etree

## 初始化客户端
api_key = os.getenv("ZHIPU_API_KEY")


from zhipuai import ZhipuAI
client = ZhipuAI(api_key=api_key)

2、大模型回答问题策略测试

测试一

response = client.chat.completions.create(
  model="glm-4",
  messages=[
    {"role": "system", "content": "根据用户输入的问题进行回答,如果知道问题的答案,请回答问题答案,如果不知道问题答案,请回复‘抱歉,这个问题我并不知道’"},
    {"role": "user", "content": "请问,什么是机器学习?"}
  ]
)
response.choices[0].message.content

输出:

'机器学习是人工智能的一个核心领域,它让计算机能够模拟人类的学习和思考方式。通过使用大量数据和算法,机器学习可以使计算机学会分类、回归和聚类等任务,从而让计算机能够从数据中提取知识,进行决策和预测。在机器学习的流程中,包括数据获取、特征工程、建立模型、模型评估以及调参等步骤。深度学习和强化学习是机器学习的两个重要分支。深度学习主要用于处理复杂结构数据的建模问题,而强化学习则让机器在探索环境中通过试错进行学习。'

测试二

response = client.chat.completions.create(
  model="glm-4",
  messages=[
    {"role": "system", "content": "根据用户输入的问题进行回答,如果知道问题的答案,请回答问题答案,如果不知道问题答案,请回复‘抱歉,这个问题我并不知道’"},
    {"role": "user", "content": "介绍一下关于GPT-6的猜想"}
  ]
)
response.choices[0].message.content

输出

'抱歉,这个问题我并不知道。\n\n到2023为止,GPT-6尚未被公开提及或发布。GPT(Generative Pre-trained Transformer)系列模型由OpenAI开发,至今已发布了多个版本,如GPT-2和GPT-3。关于未来版本的GPT,如GPT-6,可能会有很多猜想和预期,但具体的内容和功能我无法提供,因为那将基于未来尚未公开的技术和信息。如果GPT-6在您提问之后有了新的消息,我可能无法获取那些最新的信息。'

3、function calling函数测试

增加外部函数测试一下,看大模型回答问题的时候是先去调用外部函数,还是先尝试自己回答。
1)定义函数信息生成器

def auto_functions(functions_list):
    """
    Chat模型的functions参数编写函数
    :param functions_list: 包含一个或者多个函数对象的列表;
    :return:满足Chat模型functions参数要求的functions对象
    """
    def functions_generate(functions_list):
        # 创建空列表,用于保存每个函数的描述字典
        functions = []
        # 对每个外部函数进行循环
        for function in functions_list:
            # 读取函数对象的函数说明
            function_description = inspect.getdoc(function)
            # 读取函数的函数名字符串
            function_name = function.__name__

            system_prompt = '以下是某的函数说明:%s,输出结果必须是一个JSON格式的字典,只输出这个字典即可,前后不需要任何前后修饰或说明的语句' % function_description
            user_prompt = '根据这个函数的函数说明,请帮我创建一个JSON格式的字典,这个字典有如下5点要求:\
                           1.字典总共有三个键值对;\
                           2.第一个键值对的Key是字符串name,value是该函数的名字:%s,也是字符串;\
                           3.第二个键值对的Key是字符串description,value是该函数的函数的功能说明,也是字符串;\
                           4.第三个键值对的Key是字符串parameters,value是一个JSON Schema对象,用于说明该函数的参数输入规范。\
                           5.输出结果必须是一个JSON格式的字典,只输出这个字典即可,前后不需要任何前后修饰或说明的语句' % function_name

            response = client.chat.completions.create(
                              model="glm-4",
                              messages=[
                                {"role": "system", "content": system_prompt},
                                {"role": "user", "content": user_prompt}
                              ]
                            )
            json_str=response.choices[0].message.content.replace("```json","").replace("```","")
            json_function_description=json.loads(json_str)
            json_str={"type": "function","function":json_function_description}
            functions.append(json_str)
        return functions
    ## 最大可以尝试4次
    max_attempts = 4
    attempts = 0

    while attempts < max_attempts:
        try:
            functions = functions_generate(functions_list)
            break  # 如果代码成功执行,跳出循环
        except Exception as e:
            attempts += 1  # 增加尝试次数
            print("发生错误:", e)
            if attempts == max_attempts:
                print("已达到最大尝试次数,程序终止。")
                raise  # 重新引发最后一个异常
            else:
                print("正在重新运行...")
    return functions

2)大模型API调用封装

def run_conversation(messages, functions_list=None, model="glm-4"):
    """
    能够自动执行外部函数调用的对话模型
    :param messages: 必要参数,字典类型,输入到Chat模型的messages参数对象
    :param functions_list: 可选参数,默认为None,可以设置为包含全部外部函数的列表对象
    :param model: Chat模型,可选参数,默认模型为glm-4
    :return:Chat模型输出结果
    """
    # 如果没有外部函数库,则执行普通的对话任务
    if functions_list == None:
        response = client.chat.completions.create(
                        model=model,
                        messages=messages,
                        )
        response_message = response.choices[0].message
        final_response = response_message.content
        
    # 若存在外部函数库,则需要灵活选取外部函数并进行回答
    else:
        # 创建functions对象
        tools = auto_functions(functions_list)

        # 创建外部函数库字典
        available_functions = {func.__name__: func for func in functions_list}

        # 第一次调用大模型
        response = client.chat.completions.create(
                        model=model,
                        messages=messages,
                        tools=tools,
                        tool_choice="auto", )
        response_message = response.choices[0].message


        tool_calls = response_message.tool_calls

        if tool_calls:

            #messages.append(response_message)
            messages.append(response.choices[0].message.model_dump())
            for tool_call in tool_calls:
                function_name = tool_call.function.name
                function_to_call = available_functions[function_name]
                function_args = json.loads(tool_call.function.arguments)
                ## 真正执行外部函数的就是这儿的代码
                function_response = function_to_call(**function_args)
                messages.append(
                    {
                        "role": "tool",
                        "content": function_response,
                        "tool_call_id": tool_call.id,
                    }
                ) 
            ## 第二次调用模型
            second_response = client.chat.completions.create(
                model=model,
                messages=messages,
                tools=tools
            ) 
            # 获取最终结果
            print(second_response.choices[0].message)
            final_response = second_response.choices[0].message.content
        else:
            final_response = response_message.content
                
    return final_response

3)定义工具函数

def ml_answer(q='什么是机器学习'):
    """
    解释什么是机器学习,返回机器学习的定义和解释
    :param q: 询问的问题,非必要参数,字符串类型对象
    :return:返回机器学习的定义和解释
    """
    return("机器学习是一种人工智能(AI)的分支领域,旨在使计算机系统通过学习和经验改进性能。")

4)工具函数调用测试

ml_answer()
'机器学习是一种人工智能(AI)的分支领域,旨在使计算机系统通过学习和经验改进性能。'
functions_list = [ml_answer]
tools = auto_functions(functions_list)
tools

查看输出结果可以看到,大模型已经找到了工具函数
在这里插入图片描述

5)大模型调用测试1

response = client.chat.completions.create(
        model="glm-4",
        messages=[
            {"role": "user", "content": "解释什么是机器学习?"}
        ],
        tools=tools,
        tool_choice="auto"
    )
response.choices[0].message

在这里插入图片描述

注意:我们发现,加入了外部函数以后,大模型回答同一个问题,有时候去调外部函数,有时候是自己去回答的。
但是我们想要的效果是,问任何问题的时候,大模型先自己判断一下自己知不知道,如果知道,那就基于自己的知识进行回答
如果自己不知道的时候采取调用外部函数回答问题。
6)大模型调用测试2

response = client.chat.completions.create(
        model="glm-4",
        messages=[
            {"role":"system","content": "对于用户提的问题,如果知道就直接回答,不知道才通过调用外部函数回答"},
            {"role": "user", "content": "什么是机器学习?"}
        ],
        tools=tools,
        tool_choice="auto"
    )
response.choices[0].message

在这里插入图片描述

7)大模型调用测试3

response = client.chat.completions.create(
        model="glm-4",
        messages=[
            {"role":"system","content": "对于用户提的问题,如果知道就直接回答,不知道才通过调用外部函数回答"},
            {"role": "user", "content": "什么是大模型?"}
        ],
        tools=tools,
        tool_choice="auto"
    )
response.choices[0].message

在这里插入图片描述

4、谷歌搜索API开发

1)API调用测试

google_search_key = os.getenv("GOOGLE_SEARCH_API_KEY")
cse_id = os.getenv("CSE_ID")
search_term = "OpenAI"
import requests

# Step 1.构建请求
url = "https://www.googleapis.com/customsearch/v1"

# Step 2.设置查询参数(还有很多参数)
params = {
    'q': search_term,           # 搜索关键词
    'key': google_search_key,   # 谷歌搜索API Key
    'cx': cse_id                # CSE ID
}

# Step 3.发送GET请求
response = requests.get(url, params=params)

# Step 4.解析响应
data = response.json()
data

在这里插入图片描述

data['items'][0]

在这里插入图片描述

2)Google API封装

def google_search(query, num_results=10, site_url=None):
    
    api_key = os.getenv("GOOGLE_SEARCH_API_KEY")
    cse_id = os.getenv("CSE_ID")
    
    url = "https://www.googleapis.com/customsearch/v1"

    # API 请求参数
    if site_url == None:
        params = {
        'q': query,          
        'key': api_key,      
        'cx': cse_id,        
        'num': num_results   
        }
    else:
        params = {
        'q': query,         
        'key': api_key,      
        'cx': cse_id,        
        'num': num_results,  
        'siteSearch': site_url
        }

    # 发送请求
    response = requests.get(url, params=params)
    response.raise_for_status()

    # 解析响应
    search_results = response.json().get('items', [])

    # 提取所需信息
    results = [{
        'title': item['title'],
        'link': item['link'],
        'snippet': item['snippet']
    } for item in search_results]

    return results

3)API调用测试

search_term = "OpenAI"
results = google_search(query=search_term, num_results=5)
results

输出:
在这里插入图片描述

results = google_search(query='GLM4大模型有什么新特性?', num_results=10, site_url='https://www.zhihu.com/')
results

输出:

[{'title': '智谱发布GLM-4 基座大模型,性能效果如何? - 知乎',
  'link': 'https://www.zhihu.com/question/639753877?write',
  'snippet': 'Jan 16, 2024 ... ... 大小时,路坚终于出现了。「我这边终于有新进展了,你在学校吗?我要当面告诉你!」室友激动坏了,突然高喊了一声「我赢了」,把我吓一跳。这个小镇\xa0...'},
 {'title': '智谱发布GLM-4 基座大模型,性能效果如何? - 新智元的回答- 知乎',
  'link': 'https://www.zhihu.com/question/639753877/answer/3364585933',
  'snippet': 'Jan 15, 2024 ... 它能够支持更长的上下文,具备更强的多模态 功能,支持更快的推理,更多并发,推理成本大大降低。 同时,GLM-4也增强了智能体能力。 基础能力. 从众多评测\xa0...'},
 {'title': '智谱发布GLM-4 基座大模型,性能效果如何? - 杨夕的回答- 知乎',
  'link': 'https://www.zhihu.com/question/639753877/answer/3364710951',
  'snippet': 'Jan 15, 2024 ... 众所周知,在我国众多大型模型企业中,我一直对智谱AI抱有极高的好感。 这不仅是因为他们浓厚的学术氛围…'},
 {'title': '智谱AI 宣布基座大模型GLM-4 发布,该大模型有何功能? - 知乎',
  'link': 'https://www.zhihu.com/question/640050703',
  'snippet': 'Jan 17, 2024 ... 1月16日下午消息,智谱AI首届技术开放日上,智谱AI宣布发布新一代基座大模型GLM-4。据介绍,GLM-4的整体…'},
 {'title': '智谱发布GLM-4 基座大模型,性能效果如何? - 大林的回答- 知乎',
  'link': 'https://www.zhihu.com/question/639753877/answer/3364780672',
  'snippet': 'Jan 16, 2024 ... 智谱发布GLM-4 基座大模型,性能效果如何? 量子位 ... 大模型的微调都是有益处的。 2、更长的上下文 ... 特性的基础之上,ChatGLM2-6B 引入了如下新特性:.'},
 {'title': '智谱发布GLM-4 基座大模型,性能效果如何? - 数字生命卡兹克的 ...',
  'link': 'https://www.zhihu.com/question/639753877/answer/3364475601',
  'snippet': 'Jan 15, 2024 ... 再将它们全部打包在了一起。 比如我说一句:“搜索一下过去7天北京的天气,然后给我处理成一张表格让我可以下载”.'},
 {'title': '如何看待智谱AI发布GLM4?国产大模型与GPT-4更加接近了吗? - 一 ...',
  'link': 'https://www.zhihu.com/question/639787253/answer/3365580226',
  'snippet': 'Jan 16, 2024 ... ... 新一代基座大模型GLM-4。 ➤GLM-4模型:性能逼近GPT-4. 先看总体的评测数据:. 在大规模多任务语言理解评测中,GLM-4得分远超GPT-3.5,平均达到GPT-4的\xa0...'},
 {'title': 'chatGLM和chatGPT的技术区别在哪里? - 李孟聊AI 的回答- 知乎',
  'link': 'https://www.zhihu.com/question/604393963/answer/3367583114',
  'snippet': 'Jun 1, 2023 ... \ufeff本文以GLM-4 发布功能作为基准对比ChatGPT4,Claude-2测试。 ... 新一代基座大模型GLM-4。 多模态理解. GLM-4 ... 目前ChatGLM是基于Base 模型进行有监督微调\xa0...'},
 {'title': '如何看待智谱AI发布GLM4?国产大模型与GPT-4更加接近了吗? - 知乎',
  'link': 'https://www.zhihu.com/question/639787253',
  'snippet': 'Jan 16, 2024 ... 他立刻下载安装,试用后发现ChatGLM4 All Tools功能强大,使用方便,心中无比高兴。'},
 {'title': '智谱发布GLM-4 基座大模型,性能效果如何? - GLM大模型的回答- 知乎',
  'link': 'https://www.zhihu.com/question/639753877/answer/3365018019',
  'snippet': 'Jan 16, 2024 ... GLMs & MaaS API. GLM-4的全线能力提升使得我们有机会探索真正意义上的GLMs。用户可以下载(更新)智谱清\xa0...'}]

四、知乎网站数据爬取

1、数据格式定义

import json

file_path = 'result.json'

# 创建包含JSON对象的列表
json_data = [
    {
        "link": "https://example.com/article/1",
        "title": "Sample Article 1",
        "content": "This is the content of the first article...",
        "tokens": "Number of tokens..."
    }
]

# 指定保存文件的路径
file_path = "result.json"

# 将JSON数据写入本地文件
with open(file_path, "w", encoding="utf-8") as json_file:
    json.dump(json_data, json_file, ensure_ascii=False, indent=4)

print(f"JSON数据已保存到文件:{file_path}")

2、设置知乎排除的网站

对搜索引擎设置:https://programmablesearchengine.google.com/ ,设置排除的网址;以下几类是不需要的网页数据:
www.zhihu.com/collection 类网站(收藏列表),
www.zhihu.com/people 类网站(个人主页),
www.zhihu.com/column 类网站(个人文章主页),
www.zhihu.com/topic 类网站(主题)
在这里插入图片描述

3、Google api调用测试

results = google_search(query='GLM4大模型有什么新特性?', num_results=5, site_url='https://www.zhihu.com/')
results

输出:

在这里插入图片描述

4、爬虫之Cookie获取

  1. 手动登录:首先,你需要在浏览器中手动访问目标网站并登录知乎。
  2. 开发者工具:登录后,打开浏览器的开发者工具。在 Chrome 和 Firefox 中,你可以右键点击
    页面,然后选择“检查”或“检查元素”。
  3. 网络标签:在开发者工具中,转到“网络”或“Network”标签。
  4. 刷新页面:在开发者工具打开的情况下,刷新页面。这会捕获所有页面加载过程中的网络请求。
  5. 查找请求:在捕获的请求列表中,找到主要的请求(通常是顶部的第一个,或者是与你的目标
    URL匹配的请求)。
  6. 查看请求头:点击这个请求,然后查找“请求头”或“Request Headers”部分。
  7. 复制Cookie:在“请求头”部分,你应该能看到一个名为 Cookie 的字段。你可以直接复制这个
    字段的值。
  8. 使用在爬虫中:将复制的 Cookie 值用于你的爬虫代码中的请求头。
    需要注意的是Cookie 通常有有效期,过了有效期它可能会过期。如果你的爬虫在某个时间点突
    然无法工作,你可能需要重新获取新的 Cookie

5、爬虫之user-agent

  1. Chrome (Windows 10):
    Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
  2. Firefox (Windows 10):
    Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:89.0) Gecko/20100101 Firefox/89.0
  3. Safari (macOS):
    Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.3 Safari/605.1.15
  4. Edge (Windows 10):
    Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
    Edg/91.0.864.59
  5. Chrome (Android):
    Mozilla/5.0 (Linux; Android 10; SM-A205U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.120 Mobile
    Safari/537.36
  6. Safari (iPhone):
    Mozilla/5.0 (iPhone; CPU iPhone OS 14_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1 Mobile/15E148
    Safari/604.1

6、爬虫之获取PATH

以下是使用Google Chrome浏览器查看和获取XPath的步骤,但其他现代浏览器(如Firefox、Edge等)的操作方式也类似:

  1. 打开网页: - 在Chrome中打开你想要查看的网页。
  2. 打开开发者工具: - 右键点击页面上的任意位置,然后选择“检查”(或“Inspect Element”)。
  • 或者,你可以使用快捷键 Ctrl + Shift + I(Windows/Linux)或 Cmd + Option + I(Mac)。
  1. 使用元素选择器: - 在开发者工具的左上角,你会看到一个鼠标指针图标,这是“选择元素”工具。点击它。
  • 然后,将鼠标悬停在页面上的元素上。你会看到元素被高亮显示,并在开发者工具的“Elements”面板中显示其HTML结构。
  1. 获取XPath: - 当你找到想要的元素后,在“Elements”面板中右键点击它。
  • 在弹出的菜单中,选择“Copy” > “Copy XPath”。这将元素的XPath复制到剪贴板。
  1. 粘贴XPath: - 接下来即可将复制的XPath粘贴到你的代码或其他地方。

7、网络爬虫代码编写

1)请求头样例

## 请求头
headers = {
    'authority': 'www.zhihu.com',
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8',
    'cache-control': 'max-age=0',
    'cookie': "Your cookie",                # 需要手动获取cookie
    'upgrade-insecure-requests': '1',
    'user-agent': 'Your user-agent',        # 手动编写或者选择之后给出的user-agent选项选择其一填写
}
  1. authority: 通常表示请求的目标主机名。在当前项目中需要视情况填写www.zhihu.com或者zhuanlan.zhihu.com
  2. accept: 告诉服务器客户端能够处理的内容类型。这里列出了多种内容类型,包括HTML、XML和各种图片格式,该参数按照给定内容填写即可;
  3. accept-language: 告诉服务器客户端的首选语言。这里,首选语言被设置为简体中文(zh-CN),其次是其他中文版本(zh),然后是英文(en)。同样该参数的内容按照给定内容填写即可;
  4. cache-control: 控制缓存的行为。max-age=0通常表示客户端不希望得到缓存的响应,而希望从原始服务器获取一个新的响应。该参数的内容按照给定内容填写即可;
  5. cookie: 包含服务器之前发送给客户端的cookie。这些cookie可能用于身份验证、会话跟踪或其他目的。这里需要重点注意,建议大家自行获取对应个人浏览器产生的cookie,以避免cookie滥用导致被识别为机器人从而导致封IP;
  6. upgrade-insecure-requests: 这个头部告诉服务器,如果可能的话,客户端希望使用更安全的协议(如HTTPS)进行通信。建议取值为1即可;
  7. user-agent: 描述发出请求的客户端的类型。这里,它模拟了一个Chrome浏览器的用户代理字符串。网站有时会根据这个头部提供不同的内容或布局,或者检测是否是爬虫。该参数也需要根据自己实际情况进行编写。

2)设置cookie和user-agent

cookie = "q_c1=3c10baf5bd084b3cbfe7eece648ba243|1704976541000|1704976541000; _zap=086350b3-1588-49c4-9d6d-de88f3faae03; d_c0=AGCYfYvO_RePTvjfB1kZwPLeke_N5AM6nwo=|1704949678; _xsrf=qR1FJHlZ9dvYhhoj4SUj43SAIBUwPOqm; __snaker__id=wNWnamiJKBI0kzkI; q_c1=d44e397edb6740859a7d2a0d4155bfab|1706509753000|1706509753000; Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1706509695,1706589529,1706765465,1708650963; z_c0=2|1:0|10:1713167971|4:z_c0|80:MS4xOGRHQVNnQUFBQUFtQUFBQVlBSlZUYjZqOTJaLXVDSjdRSmJKMHgyVEhxTE13UGN1TUJBdHZnPT0=|15b2c2ece393ac4ea374d9b36cde5af7304f8ee7632e060fe6835bfadb5e4132; KLBRSID=9d75f80756f65c61b0a50d80b4ca9b13|1713170212|1713167958"
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"

3)设置请求头信息

## 请求头
headers = {
    'authority': 'www.zhihu.com',
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8',
    'cache-control': 'max-age=0',
    'cookie': cookie,                # 需要手动获取cookie
    'upgrade-insecure-requests': '1',
    'user-agent': user_agent,        # 手动编写或者选择之后给出的user-agent选项选择其一填写
}

8、question类型的网站爬虫测试

## question类型的网站
url = 'https://www.zhihu.com/question/639753877'
res = requests.get(url, headers=headers).text
res 

输出:
在这里插入图片描述

1)网页标题解析

res_xpath = etree.HTML(res)
res_xpath

在这里插入图片描述

title = res_xpath.xpath('//div/div[1]/div/h1/text()')[0]
#%%
title

在这里插入图片描述

2)网页内容解析

## 获取回答的正文
#//*[@id="root"]/div/main/div/div/div[1]/div[2]/div/div[1]/div[1]/div[6]/div/div/div/div/span/p[1]/text()
text = ''
text_d = res_xpath.xpath('//div/div/div/div[2]/div/div[2]/div/div/div[2]/span[1]/div/div/span/p/text()')
for t in text_d:
    txt = str(t).replace('\n', ' ')
    text +=txt

print(text)

在这里插入图片描述

9、网页数据保存

encoding = tiktoken.encoding_for_model("gpt-3.5-turbo")
len(encoding.encode(text))
json_data = [
    {
        "link": url,
        "title": title,
        "content": text,
        "tokens": len(encoding.encode(text))
    }
]
title="智谱发布GLM-4基座大模型,性能效果如何"
#%%
with open('./auto_search/介绍一下GLM4大模型的特性/%s.json' % title, 'w') as f:
    json.dump(json_data, f)
#%%
with open('./auto_search/介绍一下GLM4大模型的特性/%s.json' % title, 'r') as f:
    jd = json.load(f)
#%%
jd

在这里插入图片描述

10、question/answer网站爬虫测试

## question/answer网站
url = 'https://www.zhihu.com/question/639787253/answer/3365580226'
res = requests.get(url, headers=headers).text
res_xpath = etree.HTML(res)
#%%
# question/answer网站标题
res_xpath.xpath('//div/div[1]/div/h1/text()')[0]

在这里插入图片描述

回答内容爬取解析

# question/answer网站置顶回答内容
dic = []
text_d = res_xpath.xpath('//*[@id="root"]/div/main/div/div/div[3]/div[1]/div/div[2]/div/div/div/div[2]/span[1]/div/div/span/p/text()')
for t in text_d:
    txt = str(t).replace('\n', ' ')
    dic.append(txt)
    print(txt)

在这里插入图片描述

11、专栏类网站爬虫测试

# 专栏类网站
url = 'https://zhuanlan.zhihu.com/p/469793124'
res = requests.get(url, headers=headers).text
res_xpath = etree.HTML(res)
#%%
# 专栏类网站标题
res_xpath.xpath('//div[1]/div/main/div/article/header/h1/text()')[0]

在这里插入图片描述

网页内容解析读取

# 专栏类网站标题内容
dic = []
text_d = res_xpath.xpath('//div/main/div/article/div[1]/div/div/div/p/text()')
for t in text_d:
    txt = str(t).replace('\n', ' ')
    dic.append(txt)
    print(txt)

在这里插入图片描述

结语

随着本章的结束,我们已经完成了知乎网站数据的智能搜索的基本链路拉通,下一篇章我们将对想要的函数进行封装改造,提高整各项目模块的扩展和复用性。

在这里插入图片描述

🎯🔖更多专栏系列文章:AIGC-AI大模型探索之路

😎 作者介绍:我是寻道AI小兵,资深程序老猿,从业10年+、互联网系统架构师,目前专注于AIGC的探索。
📖 技术交流:建立有技术交流群,可以扫码👇 加入社群,500本各类编程书籍、AI教程、AI工具等你领取!
如果文章内容对您有所触动,别忘了点赞、⭐关注,收藏!加入我,让我们携手同行AI的探索之旅,一起开启智能时代的大门!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1822850.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringMVC01-初始SpringMVC

SpringMVC 回顾MVC 什么是MVC MVC是模型(Model)、视图(View)、控制器(Controller)的简写&#xff0c;是一种软件设计规范。是将业务逻辑、数据、显示分离的方法来组织代码。MVC主要作用是降低了视图与业务逻辑间的双向偶合。MVC不是一种设计模式&#xff0c;MVC是一种架构模…

石化加工vr中毒窒息事故培训系统开发降低了培训成本和风险。

化工行业是工伤预防工作的重点领域之一&#xff0c;工伤预防及安全生产整治工作任务艰巨、责任重大。为进一步强化红线意识、底线思维&#xff0c;深圳VR公司研发的化工VR事故警示教育系统&#xff0c;以其独特的沉浸式体验&#xff0c;为员工的安全教育开辟了新的道路。目前化…

【算法题解】关于DFS的经典题目与分析

目录 1. 全排列问题2. n皇后问题3. 递归实现指数型枚举4. 递归实现组合型枚举5. 数水坑6. 打死我也不说7. 字母顺序归位8. 不同路径数 1. 全排列问题 题目链接 #include<iostream> using namespace std; const int N10;int n; int path[N];//存储 bool st[N];//状态数…

基于SSM框架的电影院售票网站

开头语&#xff1a; 你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果您对我们的电影院售票网站感兴趣或者有相关需求&#xff0c;欢迎通过文末的联系方式与我联系。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM框架 工具&#xff1a;ID…

【 EI会议 | 西南大学主办 | 往届均已实现检索】第三届神经形态计算国际会议(ICNC 2024)

第三届神经形态计算国际会议&#xff08;ICNC 2024) 2024 3rd International Conference on Neuromorphic Computing (ICNC 2024) 一、重要信息 大会官网&#xff1a;www.ic-nc.org&#xff08;点击投稿/参会/了解会议详情&#xff09; 会议时间&#xff1a;2024年12月13-15…

for 、while循环

练习1&#xff1a;输入一个数&#xff0c;判断是否是完美数 完美数&#xff1a;正序和逆序的结果一致 练习2&#xff1a; * ** *** **** 练习3&#xff1a; **** *** ** * 练习4&#xff1a;输入一个数&#xff0c;计算最大公约数&#xff0c;以及最小公倍数 练习5&#xff…

Git代码冲突原理与三路合并算法

Git代码冲突原理 Git合并文件是以行为单位进行一行一行合并的&#xff0c;但是有些时候并不是两行内容不一样Git就会报冲突&#xff0c;这是因为Git会帮助我们进行分析得出哪个结果是我们所期望的最终结果。而这个分析依据就是三路合并算法。当然&#xff0c;三路合并算法并不…

Python第二语言(十四、高阶基础)

目录 1. 闭包 1.1 使用闭包注意事项 1.2 小结 2. 装饰器&#xff1a;实际上也是一种闭包&#xff1b; 2.1 装饰器的写法&#xff08;闭包写法&#xff09; &#xff1a;基础写法&#xff0c;只是解释装饰器是怎么写的&#xff1b; 2.2 装饰器的语法糖写法&#xff1a;函数…

AMD核显推理Stable Diffusion

目标 近期&#xff0c;我开始了尝试使用Stable Diffusion进行文生图和。为此&#xff0c;我也尝试了多种在线服务&#xff0c;如WHEE。虽然在线平台能够提供不错的生成效果&#xff0c;但是生成的图片太多的话最终还是需要收费的。 因此我想尝试在本地部署SD模型进行图像生成。…

使用Leaflet库创建交互式地图:技术解析与实践

一&#xff1a;引言 在现代Web开发中&#xff0c;地图可视化已成为许多项目不可或缺的一部分。Leaflet是一个开源的JavaScript库&#xff0c;用于在Web页面上创建交互式地图。它简单易用、轻量级且高度可定制&#xff0c;使得开发者能够快速地创建出具有丰富功能的地图应用。本…

提升你的编程体验:自定义 PyCharm 背景图片

首先&#xff0c;打开 PyCharm 的设置菜单&#xff0c;点击菜单栏中的 File > Settings 来访问设置&#xff0c;也可以通过快捷键 CtrlAItS 打开设置。 然后点击Appearance & Behavior > Appearance。 找到Background image...左键双击进入。 Image:传入自己需要设置…

Unity引擎在UI上渲染粒子播放

大家好&#xff0c;我是阿赵。   在UI上面显示粒子特效&#xff0c;如果把粒子系统直接拖到Canvas里面&#xff0c;会存在很多问题&#xff0c;比如层级问题、裁剪问题等。这里分享一种用MaskableGraphic和UIVertex来显示粒子特效的方法。 一、 MaskableGraphic和UIVertex简…

数据结构和矩阵细节用法:double、cell和complex #matlab

矩阵建立 建立矩阵用[]&#xff1b; 矩阵的同一行内的元素用逗号或者空格隔开&#xff1b; 矩阵的不同行的元素用分号隔开 eg. 矩阵 A 1 2 3 4 5 6 7 8 9 在matlab中矩阵A表示为&#xff1a; clc;clear; A[1,2,3;4,5,6;7,8,9]; %或者A[1 2 3;4 5 …

SAP FI 批量显示科目余额 发生额的报表

实际界面 结果 源代码 *&---------------------------------------------------------------------* *& Report ZRPT_FICO_F01 *&---------------------------------------------------------------------* *& 20240614 批量显示余额 发生额 *&---------…

怎么批量去除EXCEL表格内时间?(已解决)

作为竞价优化师&#xff0c;经常碰到下载表格以后发现有冗余数据&#xff0c;这个时候我们该怎么快速处理呢&#xff01; 第一步&#xff0c;选择这一行数据 第二步&#xff0c;右击选择“单元格格式-日期” 第三步&#xff0c;选择日期中的2001-3-7格式&#xff0c;点击“确定…

QML学习及实战

QML学习及实战&#xff08;更多内容&#xff09; 创建项目 3. 剩下的就是一路下一步即可 添加静态资源——图片 添加之后完成之后的路径 案列 || demo 可以参考的资料&#xff1a;https://github.com/gongjianbo/MyTestCode/blob/master/README.md 1. 文本省略号 Text {wi…

RedHat9 | Mariadb数据库的配置与管理

一、实验环境 1、Mariadb数据库介绍 MariaDB数据库管理系统是一个开源的关系型数据库管理系统&#xff0c;与MySQL高度兼容&#xff0c;并提供了更多的功能和性能优化。 起源和背景 MariaDB是MySQL的一个分支&#xff0c;主要由开源社区维护。由MySQL的创始人Michael Widen…

百度OCR初探-python

百度OCR使用&#x1f680; 在项目中需要对一些资料首先进行OCR识别&#xff0c;然后对OCR之后得到的结果进行结构化分析&#xff0c;各家的都打算简单尝试一下&#xff0c;首先尝试一下百度的OCR&#xff0c;首先找到百度的OCR的官方&#xff0c;开始自己搜索然后尝试。 OCR&am…

浅谈数据管理架构 Data Fabric(数据编织)及其关键特征、落地应用

伴随着企业从数字化转型迈向更先进的数智化运营新阶段&#xff0c;对看数、用数的依赖越来越强&#xff0c;但数据的海量增长给数据管理带来一系列难题&#xff0c;如数据类型和加工链路日益复杂&#xff0c;数据存储和计算引擎更加分散&#xff0c;数据需求响应与数据质量、数…

【电机控制】FOC算法验证步骤——PWM、ADC

【电机控制】FOC算法验证步骤 文章目录 前言一、PWM——不接电机1、PWMA-H-50%2、PWMB-H-25%3、PWMC-H-0%4、PWMA-L-50%5、PWMB-L-75%6、PWMC-L-100% 二、ADC——不接电机1.电流零点稳定性、ADC读取的OFFSET2.电流钳准备3.运放电路分析1.电路OFFSET2.AOP3.采样电路的采样值范围…