GLM-OCR基础教程:3步快速部署与Python爬虫数据提取实战
GLM-OCR基础教程:3步快速部署与Python爬虫数据提取实战
你是不是经常遇到这样的场景:看到一个网页上有大量有用的文字信息,比如产品参数、新闻内容或者表格数据,但网站偏偏不提供下载,手动复制粘贴又慢又容易出错?或者,你拿到了一些图片格式的文档,里面的文字没法直接复制,只能干瞪眼?
今天要聊的GLM-OCR,就是专门解决这类问题的利器。它是一款开源的文字识别工具,简单说,就是能把图片里的文字“读”出来,变成你可以编辑和处理的文本。更棒的是,现在我们可以把它部署在云端,再配合Python爬虫,就能轻松实现网页信息的自动化抓取和识别。
这篇教程,我就手把手带你走一遍。从零开始,在星图GPU平台上把GLM-OCR跑起来,再到写一个Python脚本,让它自动抓网页、识文字、存数据。整个过程非常直接,哪怕你之前没怎么接触过OCR或者爬虫,跟着做也能搞定。
1. 环境准备与快速部署
万事开头难,但这次开头特别简单。我们不需要在本地电脑上折腾复杂的Python环境或者CUDA驱动,一切都在云端完成。
1.1 注册与资源准备
首先,你需要有一个星图平台的账号。这个过程和注册任何一个普通网站没什么区别,按照提示填写邮箱、设置密码就行,几分钟就能完成。
登录之后,关键一步是领取或者确保你有可用的GPU资源。GLM-OCR在处理图片时,有GPU加速会快很多。在星图平台,新用户通常会有一些免费的体验资源,足够我们完成这个教程。你可以在“资源中心”或类似页面查看你的GPU时长,确认它处于“可用”状态就行。
1.2 一键部署GLM-OCR镜像
这是最核心的一步,但操作上却是最简单的。
- 在星图平台找到“镜像广场”或“应用市场”。
- 在搜索框里输入“GLM-OCR”,你应该能很快找到对应的开源镜像。它的介绍页面通常会写明版本信息和基本功能。
- 点击“部署”或“创建实例”按钮。这时,平台会弹出一个配置页面。
配置页面看起来选项不少,但我们需要关注的只有几个:
- 实例名称:给你这个“云端机器”起个名字,比如“my-ocr-service”,方便自己识别。
- GPU规格:选择最基础的GPU型号即可,例如“RTX 4090”或类似选项,对于我们的测试和轻量使用完全够用。
- 镜像选择:系统应该已经自动选中了刚才搜索到的GLM-OCR镜像,确认一下版本无误。
- 网络与存储:保持默认设置,通常不需要改动。
其他高级设置,比如自定义端口、环境变量,在第一次部署时可以先跳过。最后,点击“确认部署”或“立即创建”。平台会开始拉取镜像并启动实例,这个过程需要一两分钟,喝口水等待一下就好。
1.3 验证服务是否启动成功
实例状态变成“运行中”后,点击进入它的详情页。我们需要找到服务的访问方式。
通常,GLM-OCR这类镜像会提供一个Web界面(比如一个简单的交互页面)和一个更重要的API接口地址。API地址看起来像http://你的实例IP:端口号。你可以在实例的“访问方式”或“服务地址”栏目找到它。
怎么验证它真的在工作呢?最简单的方法就是把这个API地址直接粘贴到浏览器的地址栏里访问一下。如果返回了一些JSON格式的信息,比如{“status”: “ok”, “message”: “GLM-OCR service is running”},或者是一个简单的欢迎页面,那就说明服务已经成功启动了。
至此,你的专属OCR识别引擎就已经在云端待命了。接下来,我们就要学习怎么指挥它干活。
2. 认识GLM-OCR:它能做什么?
在动手写代码之前,我们先花几分钟了解一下GLM-OCR的基本能力,这样用起来心里更有底。
本质上,它是一个接收图片、返回文字的工具。你给它一张包含文字的图片,它就能把图片里的文字内容识别出来,以结构化的文本(比如字符串、段落)还给你。它特别擅长处理印刷体文字,比如截图、扫描文档、宣传海报上的文字,识别准确率在大多数场景下都相当不错。
它通常通过一个HTTP API来提供服务。这意味着,你不需要在代码里导入复杂的库,只需要像访问一个普通网页一样,向某个特定的网址(就是刚才部署得到的API地址)发送一张图片,它就会把识别结果传回来。
这个API的调用格式也很简单。最常见的是使用一个/predict或/ocr这样的路径。你需要发送一个POST请求,并把图片数据放在请求里。服务器处理完后,会返回一个JSON对象,里面就包含了识别出的文本、文字在图片中的位置(边框坐标)等信息。
听起来是不是和用搜索引擎差不多?只不过我们“搜索”的是图片里的文字信息。有了这个基础认识,我们就可以进入最有趣的环节——让它和爬虫联动起来。
3. Python爬虫与OCR联动实战
现在我们来搭建一个自动化流程:用爬虫获取网页上的图片,然后用GLM-OCR识别图片中的文字,最后把结果保存下来。我会用一个模拟的场景来演示,你可以轻松替换成你自己的目标网站。
3.1 项目初始化与依赖安装
在你的本地电脑上,新建一个文件夹,比如叫web_ocr_scraper。然后打开命令行,进入这个文件夹,创建一个新的Python虚拟环境(这是个好习惯,可以避免包版本冲突):
python -m venv venv # 激活虚拟环境 # Windows: venv\Scripts\activate # Mac/Linux: source venv/bin/activate激活虚拟环境后,安装我们需要的Python库:
pip install requests pillow beautifulsoup4requests:用来发送HTTP请求,既用于爬虫抓取网页,也用于调用OCR的API。pillow(PIL):一个强大的图像处理库,这里我们主要用它来打开和保存图片。beautifulsoup4:用来解析HTML网页,轻松地从中提取出图片链接。
3.2 第一步:编写网页图片抓取脚本
我们写一个函数,它的任务是访问一个网页,并把网页里所有的图片下载到本地。这里我们以一个图片网站为例。
import os import requests from bs4 import BeautifulSoup from urllib.parse import urljoin def download_images_from_url(url, save_dir='downloaded_images'): """ 从指定URL下载所有图片到本地文件夹 """ # 创建保存图片的目录 if not os.path.exists(save_dir): os.makedirs(save_dir) try: # 1. 获取网页内容 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' } response = requests.get(url, headers=headers) response.raise_for_status() # 检查请求是否成功 html_content = response.text # 2. 解析HTML,找到所有图片标签 soup = BeautifulSoup(html_content, 'html.parser') img_tags = soup.find_all('img') downloaded_paths = [] for i, img_tag in enumerate(img_tags): # 获取图片的src链接 img_url = img_tag.get('src') if not img_url: continue # 处理相对路径,拼接成完整URL full_img_url = urljoin(url, img_url) try: # 3. 下载图片 img_data = requests.get(full_img_url, headers=headers).content # 生成一个本地文件名 file_extension = os.path.splitext(full_img_url)[1] or '.jpg' filename = f"image_{i}{file_extension}" filepath = os.path.join(save_dir, filename) # 4. 保存图片到本地 with open(filepath, 'wb') as f: f.write(img_data) print(f"已下载: {filename}") downloaded_paths.append(filepath) except Exception as e: print(f"下载图片失败 {full_img_url}: {e}") return downloaded_paths except Exception as e: print(f"处理网页失败: {e}") return [] # 测试一下这个函数 if __name__ == '__main__': # 替换成你想抓取的任何包含图片的网页地址 test_url = "https://example.com" image_files = download_images_from_url(test_url) print(f"总共下载了 {len(image_files)} 张图片。")注意:在实际使用时,请务必将test_url替换成目标网站地址,并遵守该网站的robots.txt协议和相关使用条款,避免对服务器造成压力。
3.3 第二步:调用GLM-OCR API识别文字
图片下载好了,现在轮到GLM-OCR出场。我们写另一个函数,负责把图片发送给云端服务并取回识别结果。
import base64 def ocr_image_via_api(image_path, api_base_url): """ 将本地图片发送到GLM-OCR API进行识别 """ # 构造完整的API端点,这里假设是 /predict api_endpoint = f"{api_base_url.rstrip('/')}/predict" try: # 1. 读取图片文件并编码为base64(一种常见的API传输方式) with open(image_path, 'rb') as image_file: image_data = base64.b64encode(image_file.read()).decode('utf-8') # 2. 准备请求数据 payload = { "image": image_data, # 有些API可能需要其他参数,如 language, detail_level 等 # 请根据你部署的GLM-OCR镜像的具体API文档调整 } # 3. 发送POST请求 headers = {'Content-Type': 'application/json'} response = requests.post(api_endpoint, json=payload, headers=headers, timeout=30) response.raise_for_status() # 4. 解析返回的JSON结果 result = response.json() # 返回的结果结构可能包含 text, boxes 等字段 # 例如:{'text': '识别出的文字内容', 'confidence': 0.98} return result except requests.exceptions.RequestException as e: print(f"调用OCR API失败 ({image_path}): {e}") return None except Exception as e: print(f"处理图片时发生错误 ({image_path}): {e}") return None # 测试单张图片识别 if __name__ == '__main__': # 替换成你部署GLM-OCR后得到的真实API地址 YOUR_API_BASE_URL = "http://你的实例IP:端口号" test_image = "downloaded_images/image_0.jpg" # 假设这是刚才下载的图片 ocr_result = ocr_image_via_api(test_image, YOUR_API_BASE_URL) if ocr_result: print("识别结果:", ocr_result.get('text', 'No text field found')) # 你可以根据API实际返回的结构,打印更多信息,比如文字框位置关键点:你需要把YOUR_API_BASE_URL替换成你在第1步部署成功后得到的那个真实地址。另外,不同版本的GLM-OCR镜像,其API的请求格式和返回字段可能略有不同,最好能参考一下该镜像的说明文档。
3.4 第三步:整合流程与数据保存
最后,我们把前两步串联起来,形成一个完整的自动化脚本,并把识别出的文字保存到文件里,比如一个CSV表格,方便后续分析。
import csv import time def main_scraping_and_ocr_pipeline(target_url, api_url, output_csv='ocr_results.csv'): """ 主流程:抓图 -> OCR识别 -> 保存结果 """ print("开始网页图片抓取...") image_paths = download_images_from_url(target_url) if not image_paths: print("未下载到任何图片,流程终止。") return print(f"开始对 {len(image_paths)} 张图片进行OCR识别...") all_results = [] for img_path in image_paths: print(f"正在处理: {os.path.basename(img_path)}") result = ocr_image_via_api(img_path, api_url) if result: # 整理结果,这里我们简单保存图片名和识别出的文本 # 你可以根据需要保存更多信息,如置信度、坐标等 record = { 'image_filename': os.path.basename(img_path), 'recognized_text': result.get('text', ''), 'source_url': target_url, 'process_time': time.strftime('%Y-%m-%d %H:%M:%S') } all_results.append(record) else: print(f" -> {os.path.basename(img_path)} 识别失败。") # 为了避免对API服务器造成过大压力,可以添加短暂延迟 time.sleep(0.5) # 将结果保存到CSV文件 if all_results: fieldnames = ['image_filename', 'recognized_text', 'source_url', 'process_time'] with open(output_csv, 'w', newline='', encoding='utf-8-sig') as csvfile: writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() writer.writerows(all_results) print(f"所有识别完成!结果已保存至: {output_csv}") else: print("没有成功的识别结果可保存。") # 运行完整流程 if __name__ == '__main__': TARGET_WEBSITE = "https://example.com" # 你的目标网站 GLM_OCR_API = "http://你的实例IP:端口号" # 你的OCR服务地址 main_scraping_and_ocr_pipeline(TARGET_WEBSITE, GLM_OCR_API)运行这个脚本,你就会得到一个ocr_results.csv文件,用Excel或文本编辑器打开,里面整齐地记录着每张图片的名字和识别出的文字内容。一个简单的网页信息自动化提取工具就诞生了。
4. 常见问题与实用技巧
第一次跑通整个流程,你可能会遇到一些小麻烦。这里我总结几个常见的情况和解决办法。
问题一:调用OCR API时返回连接错误或超时。
- 检查:首先确认你的云实例状态是“运行中”,而不是“已停止”。然后,在本地电脑的浏览器里,再次尝试访问那个API地址,看是否能打开。如果打不开,可能是网络配置问题,检查实例的安全组或防火墙规则,确保你部署时开放的端口(比如7860、8080)是允许访问的。
- 尝试:有时候公网IP会变,去实例详情页确认一下最新的访问地址。
问题二:识别结果乱码或准确率不高。
- 调整图片:OCR的识别效果很大程度上取决于图片质量。尝试在发送前对图片进行一些预处理,比如使用PIL库将图片转为灰度图、增加对比度或进行二值化处理,往往能提升识别效果。
from PIL import Image, ImageEnhance def preprocess_image_for_ocr(image_path): img = Image.open(image_path) # 转为灰度图 img = img.convert('L') # 增强对比度 enhancer = ImageEnhance.Contrast(img) img = enhancer.enhance(2.0) # 增强因子,可调整 processed_path = image_path.replace('.jpg', '_processed.jpg') img.save(processed_path) return processed_path - 查看日志:如果GLM-OCR服务提供了日志查看功能,可以看看有没有报错信息,有时是模型加载的问题。
问题三:爬虫被网站屏蔽了。
- 模拟浏览器:在爬虫请求头(
headers)里加入更完整的浏览器信息,并合理设置请求间隔(time.sleep)。 - 使用Session:对于需要登录或有多步操作的网站,使用
requests.Session()来保持会话状态。 - 遵守规则:始终是最重要的。控制抓取频率,避免给目标网站服务器带来负担。
让脚本更健壮的小技巧:
- 异常处理:像示例代码中那样,用
try...except包裹可能出错的网络请求和文件操作。 - 进度提示:在处理大量图片时,打印当前进度,让你知道脚本还在正常运行。
- 结果去重:如果连续抓取,可以考虑对识别出的文本进行简单的去重,避免保存过多重复信息。
5. 总结
走完这一趟,你会发现,将GLM-OCR这样的AI工具与Python爬虫结合起来,思路其实非常直接:就是把原本需要人眼去看、手动去复制的事情,拆解成“获取图片”和“识别图片”两个自动化步骤。
在星图平台上部署GLM-OCR镜像,省去了本地配置环境的繁琐,让你能立刻获得一个稳定、带GPU加速的识别服务。而Python爬虫部分,requests和BeautifulSoup的组合足够应对大多数静态网页的抓取需求。
这个简单的实战项目就像一个模板,你可以基于它做很多扩展。比如,识别电商网站的商品详情图、抓取并识别PDF报告里的图表、甚至是对接实时监控截图进行分析。关键在于理解每个环节在做什么,然后根据你的具体需求去调整和强化。
希望这篇教程能帮你打开一扇门,看到用自动化工具处理信息的高效与乐趣。接下来,就试着用这套方法,去解决你实际工作中遇到的那个“复制粘贴”难题吧。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
