批量网页信息抓取+Deepseek模型完成信息匹配

0 使用前说明

~

需要有一些python知识

需要有一些网页结构知识

需要对大模型有一些了解(比如Chat-GPT,就是对话问答,你问一个问题,它会给你一个答案,这个答案的准确性需要你们自己去验证)

首先说明一下我使用的软件版本(软件版本无所谓,用的时候大致匹配就行,减少出现问题的概率):
Anaconda3-2021.05-Windows-x86_64.exe 和 pycharm-community-2021.3.2.exe

注意:遵纪守法!

补:如果需要的信息在PDF和图片中,其实也是可以提取的,但是需用到用python进行PDF文字提取和OCR文字识别,将其转换为文本信息(功能实现不麻烦稍微写一下就行),然后再用AI模型进行信息匹配就行。你要是用其他AI模型对PDF和图片直接进行信息提取和匹配也行,效果都是一样的。网页信息提取不出来的,这里没有解决方法。

————————————————

1 DeepSeek-V3模型

可以通过多个渠道了解这个模型

在这里插入图片描述

模型介绍

首先是微信公众号的推送:DeepSeek-V3 正式发布

其次,你可以在GitHub上了解其模型:deepseek

还有其文章:DeepSeek-V3 Technical Report

模型的具体内容可以去了解一下。

选择DeepSeek的原因: 国产开源,便宜,这对国内用户很友好。当然,国内其他AI工具也不错,个人推荐而已,这里并没有拉踩的意思(勿喷,理解)。

模型使用

这里web对话窗口就不介绍了,大家自己去尝试就行。

需要说明的是这个API接口:API接口
里面的信息可以看一下,有说明文档,价格说明。我使用的时候(2025-01-15)送了10元,所以没充钱,后续希望开发团队保持(谢谢)!!!

进入API平台之后可以创建一个 API key ,参考下面的步骤

在这里插入图片描述

后面可以得到一个 key,下面打码的地方,复制好之后做好保存,后续需要用到。

在这里插入图片描述

2 python项目

接下来需要用到python来编写代码了。

创建虚拟环境

建议重新创建一个虚拟环境,避免和你前面做的项目所用的库造成冲突。(我使用的python版本是3.9,其他版本没试过,可以自己尝试一下)

要是不会创建虚拟环境,可以找一下其他教程,有很多。实在不行可以参考我上一个博客 ~~。

安装相应库

安装相应的库,最好用一下镜像源(用自己习惯的就好)

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple openai
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple bs4
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple re
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple lxml
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pandas

如果你是初学者,不懂在哪里进行库的安装,可以直接在你创建的项目下面找到这个终端(Terminal),然后逐行输入上面的 pip 代码就行,正常来说,你前面创建虚拟环境时,如果是指定python版本的话,这里的安装的库会对应python版本的,如果报错的话,自己找一下原因并解决一下吧。

“终端”

代码示例

这里简单放一个代码,你们可以根据自己的需求进行修改,后面我结合网页结构做一下说明。(这个代码是批量进行处理的)

#!/usr/bin/python
# -*- coding: utf-8 -*-
from openai import OpenAI
# 创建 API 客户端
client = OpenAI(api_key="###", base_url="https://api.deepseek.com")   # api_key="###" 中把 ### 改为自己的key

import requests
from bs4 import BeautifulSoup
import re
from lxml import etree
import pandas as pd


def comein_url(url):
    # 设置请求头,模拟浏览器
    headers = {
        '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',
        'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
        'Accept-Encoding': 'gzip, deflate, br',
        'Connection': 'keep-alive',
    }
    # 请求网页
    response = requests.get(url, headers=headers)
    # 设置编码为 'utf-8'(如果网页使用的是这种编码)
    response.encoding = 'utf-8'
    return response

# 定义一个函数来提取信息
def extract_info(text):
    info = {}
    lines = text.split("\n")
    for line in lines:
        if "**" in line:
            key = line.split("**")[1].strip()
            value = line.split(":")[-1].strip() if ":" in line else line.split(":")[-1].strip()
            info[key] = value
    return info
# 定义一个函数来标准化数据
def standardize_data(info):
    standardized = {
        "学校": info.get("学校", "未提供"),
        "院系": info.get("院系", "未提供"),
        "姓名": info.get("姓名", "未提供"),
        "性别": info.get("性别", "未提供"),
        "职称": info.get("职称", "未提供"),
        "籍贯": info.get("籍贯", "未提供"),
        "博士毕业院校": info.get("博士毕业院校", "未提供"),
        "博士毕业年份": info.get("博士毕业年份", "未提供"),
    }
    return standardized

def remove_special_characters(text):
    # 保留字母、数字、中文和空格
    return re.sub(r'[^\w\s]', '', text)

def reback_answer(tiwen):
    response = client.chat.completions.create(
        model="deepseek-chat",
        messages=[
            {"role": "system", "content": "You are a helpful assistant"},
            {"role": "user", "content": tiwen},
        ],
        stream=False
    )
    text = response.choices[0].message.content
    return text

# 如果不清楚过程变量的内容,可以print一下,看看是不是准确
# 需要看学院的网页确定结构,然后修改相应代码

url_v1 = 'https://ems.xju.edu.cn/szll.htm'   # 这里需要改
response_v1 = comein_url(url_v1)

if response_v1.status_code == 200:
    print("请求成功")
    page_v1_text = response_v1.text
    #数据解析
    tree_v1 = etree.HTML(page_v1_text)

    tree_v1_ul_list = tree_v1.xpath('//div[@class="sidebar fl"]//ul')                         # 这里需要修改
    tree_v1_a_list = tree_v1.xpath('//div[@class="sidebar fl"]//ul/li/a')                     # 这里需要修改

    data_list = []

    for tree_v1_a in tree_v1_a_list:
        # 第一层,寻找教授/副教授
        tree_v1_a_text_content = tree_v1_a.xpath('./text()')[0]                                  # 这里需要修改
        tree_v1_a_href_value = tree_v1_a.xpath('@href')[0]  # 获取 <a> 标签中的 href 属性值         # 这里需要修改
        # print("text1:", tree_v1_a_text_content)

        # 设置条件, 按需判断,需要将后面的内容(到else前面)全部选择,然后TAB一下
        # if tree_v1_a_text_content == "副教授":
        #     # print("text1:", tree_v1_a_text_content)

        ###################################### 拼接网址
        url_v1_pitch_v1 = url_v1.split('.htm')[0]
        url_v2_pitch_v1 = tree_v1_a_href_value.split('/')[1]
        url_v2 = url_v1_pitch_v1 + "/" + url_v2_pitch_v1

        ####################################### 从这里进入第二个界面
        response_v2 = comein_url(url_v2)
        page_v2_text = response_v2.text
        tree_v2 = etree.HTML(page_v2_text)

        # 确定页数
        tree_v2_page_num_element = tree_v2.xpath('//span[@class="p_pages"]//span')   # 这里需要修改
        tree_v2_page_num = len(tree_v2_page_num_element) - 4   ##  排除  ”首页”。“上一页”,“下一页”,“尾页”,四项,所以减4    # 这里需要修改
        for tree_v2_i in range(1,tree_v2_page_num+1):
            #  看具体网页情况,以新疆大学经济与管理学院为例,是从1开始的,但是代码的1表示该网页的最后一页
            url_v2_pitch_v2 = url_v2.split('.htm')[0]
            url_v3 = url_v2_pitch_v2  + "/" + str(tree_v2_i) + ".htm"
            if tree_v2_i == tree_v2_page_num:
                url_v3 = url_v2
            # print(url_v3)

            ######################################  这里看网页的教师信息
            response_v3 = comein_url(url_v3)
            page_v3_text = response_v3.text
            tree_v3 = etree.HTML(page_v3_text)
            tree_v3_ul_list = tree_v1.xpath('//ul[@class="teach-list"]/li')                 # 这里需要修改
            tree_v3_a_list = tree_v1.xpath('//ul[@class="teach-list"]/li/a')                # 这里需要修改

            for tree_v3_a in tree_v3_a_list:
                ######################################  这里进入每个老师的界面
                tree_v3_a_href_value = tree_v3_a.xpath('@href')[0]  # 获取 <a> 标签中的 href 属性值       # 这里需要修改
                # print("tree_v3_a_href_value:",tree_v3_a_href_value)
                url_v3_pitch_v1 = url_v3.split('/szll')[0]
                url_v4 = url_v3_pitch_v1 + "/" + tree_v3_a_href_value

                ######################################  这里看教师的具体信息
                response_v4 = comein_url(url_v4)
                page_v4_text = response_v4.text
                tree_v4 = etree.HTML(page_v4_text)

                soup = BeautifulSoup(response_v4.text, 'html.parser')
                soup_txt = soup.text
                cleaned_text = re.sub(r'\n+', '\n', soup_txt)
                # print("文本信息:", cleaned_text)

                #  这里可以修改问题,比如,根据名字确定性别,如果不确定,在输出时可以进行说明
                tiwenxinxi_v1 = "从下面的文本: /n "
                tiwenxinxi_v2 = " /n 匹配需要的信息:学校、姓名、院系、性别、职称、籍贯、博士毕业院校、博士毕业年份)"
                tiwenxinxi_total = tiwenxinxi_v1 + cleaned_text + tiwenxinxi_v2
                # print("文本信息:", tiwenxinxi_total)

                tiwen = remove_special_characters(tiwenxinxi_total)
                answer = reback_answer(tiwen)

                # 提取信息
                info = extract_info(answer)
                # 标准化数据
                standardized_info = standardize_data(info)
                # 将标准化后的数据添加到列表中
                data_list.append(standardized_info)

    # 将数据列表转换为DataFrame
    df = pd.DataFrame(data_list)
    # 按指定顺序排列列
    columns_order = [
        "学校", "院系", "姓名", "性别", "职称", "籍贯", "博士毕业院校", "博士毕业年份"
    ]
    df = df[columns_order]

    # 这里进行修改,修改文件输出路径和文件名
    output_path = r"C:\Users\HP\Desktop\111"              # 这里需要修改
    output_name = "信息表.csv"                           # 这里需要修改
    output_file = output_path + "\\" + output_name
    # 保存到CSV文件
    df.to_csv(output_file, index=False, encoding="utf-8-sig")
    print("标准化信息已保存到 '标准化信息表.csv'")

else:
    print(f"请求失败,状态码:{response_v1.status_code}")

3 网页结构

了解网页

这里只是举个例子哈,并没有借此做一下乱七八糟的事情。

以某学校某学院的教师信息为例:
下面是学校教师的网页:

在这里插入图片描述

查看网页结构,这一步的目标就是:找到每一个教授具体的网址url

在这里插入图片描述

了解网页排版结构,得到相应的信息:

在这里插入图片描述

换个其他的网页:类似的目的。

在这里插入图片描述

代码说明

首先引用库,这里需要修改的的是 api_key=“###” 里面的 key 字符串。

#!/usr/bin/python
# -*- coding: utf-8 -*-
from openai import OpenAI
# 创建 API 客户端
client = OpenAI(api_key="###", base_url="https://api.deepseek.com")   # api_key="###" 中把 ### 改为自己的key

import requests
from bs4 import BeautifulSoup
import re
from lxml import etree
import pandas as pd

这个是为了统一文本编码,减少特殊字符带来报错的概率。↓

#!/usr/bin/python
# -*- coding: utf-8 -*-

根据查询到的网页结构进行修改。↓

# 如果不清楚过程变量的内容,可以print一下,看看是不是准确
# 需要看学院的网页确定结构,然后修改相应代码
# 一部分注释的内容是我之前做的案例,可供参考,自己进行修改
url_v1 = 'https://philosophy.whu.edu.cn/szdw1.htm'   # 这里需要改
response_v1 = comein_url(url_v1)
page_v1_text = response_v1.text
#数据解析
tree_v1 = etree.HTML(page_v1_text)

tree_v1_a_list = tree_v1.xpath('//div[@class="tech_content"]//li/a')  # 这里需要修改

data_list = []
index = 0

其中:
url_v1 = 'https://philosophy.whu.edu.cn/szdw1.htm' # 这里需要改
这里需要修改问学院网站的网址;

这里
tree_v1_a_list = tree_v1.xpath('//div[@class="tech_content"]//li/a') # 这里需要修改
这里需要根据前面了解到的网页结构按需修改,div[@class=“tech_content”]这里要找到合适class名称进行修改,把这个**“tech_content”**修改为你需要的,正常来说,后一个信息的网址应该都有一个指定的class名称,后面的“//li/a”也是需要自己领悟一下网页结构的排版双//表示多层级,单/表示下一层级。

接着
# 第一层,寻找教师信息 tree_v1_a_href_value = tree_v1_a.xpath('@href')[0] # 获取 <a> 标签中的 href 属性值 # 这里需要修改 # print("text1:", tree_v1_a_href_value) ###################################### 拼接网址 url_v1_pitch_v1 = url_v1.split('/szdw1.htm')[0] url_v1_pitch_v2 = "/info" + tree_v1_a_href_value.split("info")[1] url_v2 = url_v1_pitch_v1 + "/" + url_v1_pitch_v2 print("text",str(index),":", url_v2)
这里需要根据后面的网址进行拼接修改,也可以参考前面第二节的代码示例;

最后修改一下文件保存路径和文件名:
# 这里进行修改,修改文件输出路径和文件名 output_path = r"C:\Users\HP\Desktop\网页信息抓取" # 这里需要修改 output_name = "信息表1.csv" # 这里需要修改 output_file = output_path + "\\" + output_name

后面需要匹配的信息可以根据自己需要增删修改。

最终代码:

#!/usr/bin/python
# -*- coding: utf-8 -*-
from openai import OpenAI
# 创建 API 客户端
client = OpenAI(api_key="###", base_url="https://api.deepseek.com")   # api_key="###" 中把 ### 改为自己的key

import requests
from bs4 import BeautifulSoup
import re
from lxml import etree
import pandas as pd


def comein_url(url):
    # 设置请求头,模拟浏览器
    headers = {
        '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',
        'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
        'Accept-Encoding': 'gzip, deflate, br',
        'Connection': 'keep-alive',
    }
    # 请求网页
    response = requests.get(url, headers=headers)
    # 设置编码为 'utf-8'(如果网页使用的是这种编码)
    response.encoding = 'utf-8'
    return response
# 定义一个函数来提取信息
def extract_info(text):
    info = {}
    lines = text.split("\n")
    for line in lines:
        if "**" in line:
            key = line.split("**")[1].strip()
            value = line.split(":")[-1].strip() if ":" in line else line.split(":")[-1].strip()
            info[key] = value
    return info
# 定义一个函数来标准化数据
def standardize_data(info):
    standardized = {
        "学校": info.get("学校", "未提供"),
        "院系": info.get("院系", "未提供"),
        "姓名": info.get("姓名", "未提供"),
        "性别": info.get("性别", "未提供"),
        "职称": info.get("职称", "未提供"),
        "籍贯": info.get("籍贯", "未提供"),
        "博士毕业院校": info.get("博士毕业院校", "未提供"),
        "博士毕业年份": info.get("博士毕业年份", "未提供"),
    }
    return standardized
def remove_special_characters(text):
    # 保留字母、数字、中文和空格
    return re.sub(r'[^\w\s]', '', text)
# 这个函数就是通过提问,然后得到response返回,返回答案的格式与前面 extract_info 和 standardize_data 两个格式的内容一致,
# 后续可以自己先问问题,然后再设置格式,自己弄就好
def reback_answer(tiwen):
    '''
    :param tiwen:  提问的文本问题
    :return: 返回答案
    '''
    response = client.chat.completions.create(
        model="deepseek-chat",
        messages=[
            {"role": "system", "content": "You are a helpful assistant"},
            {"role": "user", "content": tiwen},
        ],
        stream=False
    )
    text = response.choices[0].message.content
    return text

# 如果不清楚过程变量的内容,可以print一下,看看是不是准确
# 需要看学院的网页确定结构,然后修改相应代码
# 一部分注释的内容是我之前做的案例,可供参考,自己进行修改
url_v1 = 'https://philosophy.whu.edu.cn/szdw1.htm'   # 这里需要改
response_v1 = comein_url(url_v1)
page_v1_text = response_v1.text
#数据解析
tree_v1 = etree.HTML(page_v1_text)

tree_v1_a_list = tree_v1.xpath('//div[@class="tech_content"]//li/a')  # 这里需要修改

data_list = []
index = 0
for tree_v1_a in tree_v1_a_list:
    index += 1

    # 这里做一个范例,只提取前20条数据,后续有问题自己尝试解决一下
    if index < 20:
        # 第一层,寻找教师信息
        tree_v1_a_href_value = tree_v1_a.xpath('@href')[0]  # 获取 <a> 标签中的 href 属性值         # 这里需要修改
        # print("text1:", tree_v1_a_href_value)
        ###################################### 拼接网址
        url_v1_pitch_v1 = url_v1.split('/szdw1.htm')[0]
        url_v1_pitch_v2 = "/info" + tree_v1_a_href_value.split("info")[1]
        url_v2 = url_v1_pitch_v1 + "/" + url_v1_pitch_v2
        print("text",str(index),":", url_v2)

        ######################################  这里看教师的具体信息
        response_v4 = comein_url(url_v2)
        page_v4_text = response_v4.text
        tree_v4 = etree.HTML(page_v4_text)

        soup = BeautifulSoup(response_v4.text, 'html.parser')
        soup_txt = soup.text
        cleaned_text = re.sub(r'\n+', '\n', soup_txt)
        # print("文本信息:", cleaned_text)

        #  这里可以修改问题,比如,根据名字确定性别,如果不确定,在输出时可以进行说明
        tiwenxinxi_v1 = "从下面的文本: /n "
        tiwenxinxi_v2 = " /n 匹配需要的信息:学校、姓名、院系、性别、职称、籍贯、博士毕业院校、博士毕业年份"
        tiwenxinxi_total = tiwenxinxi_v1 + cleaned_text + tiwenxinxi_v2
        # print("文本信息:", tiwenxinxi_total)

        tiwen = remove_special_characters(tiwenxinxi_total)
        answer = reback_answer(tiwen)

        # 提取信息
        info = extract_info(answer)
        # 标准化数据
        standardized_info = standardize_data(info)
        # 将标准化后的数据添加到列表中
        data_list.append(standardized_info)


# 将数据列表转换为DataFrame
df = pd.DataFrame(data_list)
# 按指定顺序排列列
columns_order = [
    "学校", "院系", "姓名", "性别", "职称", "籍贯", "博士毕业院校", "博士毕业年份"
]
df = df[columns_order]

# 这里进行修改,修改文件输出路径和文件名
output_path = r"C:\Users\HP\Desktop\网页信息抓取"              # 这里需要修改
output_name = "信息表1.csv"                           # 这里需要修改
output_file = output_path + "\\" + output_name
# 保存到CSV文件
df.to_csv(output_file, index=False, encoding="utf-8-sig")
print("标准化信息已保存到 '标准化信息表.csv'")

结果:
在这里插入图片描述

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐