GLM-OCR与Python爬虫结合:自动化采集网页信息的文本识别方案

发布时间:2026/7/10 14:09:42

GLM-OCR与Python爬虫结合:自动化采集网页信息的文本识别方案 GLM-OCR与Python爬虫结合自动化采集网页信息的文本识别方案你有没有遇到过这种情况用Python爬虫抓取网页数据信心满满地写好了代码结果运行后发现很多关键信息——比如新闻里的图表数据、电商商品的规格参数、学术论文里的公式截图——都抓取不到。因为这些信息根本不是文本而是图片。传统的爬虫只能抓取HTML里的纯文本对图片里的文字束手无策。这就好比一个视力极好但看不懂图画的人能看清一切却无法理解画中的含义。今天我们就来聊聊怎么给这个“视力好的人”配上一副“智能眼镜”让他不仅能看见还能看懂。这副眼镜就是GLM-OCR。简单来说我们要做的就是把GLM-OCR一个强大的文字识别工具和Python爬虫结合起来打造一个能从图片里“读”出文字的自动化信息采集系统。无论你是想批量分析竞品详情页还是想收集特定主题的新闻图表数据这套方案都能帮你搞定。1. 为什么需要OCR爬虫一个真实的痛点我们先来看一个具体的例子。假设你想监控某个电商平台上几款热门手机的价格和核心参数变化。你用requests和BeautifulSoup写了个爬虫轻松抓取了商品标题、店铺名称这些文本信息。但当你打开抓取到的数据一看傻眼了手机的处理器型号、内存大小、摄像头参数这些最关键的信息全是图片商家把这些信息做成了精美的详情图你的爬虫只能抓到一张张无法直接读取的图片文件。这就是纯文本爬虫的局限。在今天的互联网上大量有价值的信息以图片形式存在新闻媒体数据图表、信息图、采访截图。电商平台商品规格参数表、促销活动图、用户评价晒图。学术网站论文中的公式、图表、实验数据截图。社交媒体带有文字信息的表情包、海报、长图。手动一张张去识别这些图片效率太低也不现实。我们的目标就是让这个过程完全自动化爬虫负责找到并下载图片OCR负责识别图片中的文字最后把结果规整地保存起来。2. 方案核心GLM-OCR能带来什么在众多OCR工具中我们选择GLM-OCR主要是看中它几个对自动化场景特别友好的特点。首先它的识别准确率很高尤其是对复杂场景。网页上的图片五花八门可能有复杂背景、艺术字体、低分辨率或者倾斜排版。GLM-OCR在这些挑战面前表现比较稳定能大大减少我们后期人工校对的工作量。其次它提供了简单易用的API。这对于我们构建自动化管道至关重要。我们不需要在本地部署复杂的模型环境只需要通过HTTP请求把图片发送过去就能拿回识别结果。这种方式部署快也方便扩展。最后它能返回结构化的信息。GLM-OCR不仅能识别出文字还能告诉我们这些文字在图片中的位置坐标。这个功能有时候非常有用比如你想从一张复杂的商品详情图中只提取出“价格”区域附近的文字就可以利用坐标信息进行筛选。简单来说GLM-OCR就像我们流水线上的一个高效、可靠的“读图员”而Python爬虫则是负责搬运和整理的“机器人”两者结合生产线就跑通了。3. 动手搭建端到端的自动化管道理论说再多不如动手做一遍。下面我们以一个实际场景为例自动抓取某个新闻网站中带数据图表的文章并提取图表中的关键数据。我们的自动化管道会分为四个清晰的步骤抓取网页 - 提取图片 - 识别文字 - 保存结果。3.1 第一步用爬虫抓取网页与图片首先我们需要从目标网页中找到我们需要的图片。这里以抓取一篇假设的新闻文章为例。import requests from bs4 import BeautifulSoup import os import time # 目标网页URL url ‘https://example-news.com/article-with-chart’ # 设置请求头模拟浏览器访问 headers { ‘User-Agent‘: ’Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36‘ } try: # 1. 获取网页内容 response requests.get(url, headersheaders) response.raise_for_status() # 检查请求是否成功 html_content response.text # 2. 使用BeautifulSoup解析HTML soup BeautifulSoup(html_content, ’html.parser‘) # 3. 创建目录保存图片 article_title soup.title.string[:50].replace(’ ‘, ’_‘) # 用文章标题作为目录名 img_dir f’./downloads/{article_title}‘ os.makedirs(img_dir, exist_okTrue) # 4. 查找所有的图片标签这里假设图表在img标签中 # 可能需要根据实际网站结构调整选择器例如只找class包含‘chart’的图片 image_tags soup.find_all(’img‘, srcTrue) # image_tags soup.select(’img.chart-img‘) # 更精确的选择器示例 img_urls [] for idx, img_tag in enumerate(image_tags): img_url img_tag[’src‘] # 处理可能的相对路径 if not img_url.startswith(’http‘): img_url requests.compat.urljoin(url, img_url) img_urls.append(img_url) print(f”找到图片 {idx1}: {img_url}“) except requests.exceptions.RequestException as e: print(f”网页请求失败: {e}“) except Exception as e: print(f”解析过程出错: {e}“)这段代码完成了网页抓取和图片链接的提取。关键点在于soup.find_all(’img‘, srcTrue)这一行它找到了页面上所有有效的图片。在实际项目中你需要根据目标网站的具体HTML结构来调整这个选择器可能要用到class、id等属性来精确定位那些包含信息的图表图片而不是Logo或广告图。3.2 第二步下载图片并做预处理拿到图片链接后我们需要把它们下载到本地并做一些简单的预处理比如统一格式这能让后续的OCR识别更顺利。from PIL import Image import io def download_and_preprocess_image(img_url, save_path, index): ”“”下载图片并进行预处理”“” try: img_response requests.get(img_url, headersheaders, timeout10) img_response.raise_for_status() # 使用PIL打开图片 image Image.open(io.BytesIO(img_response.content)) # 预处理示例1: 统一转换为RGB模式避免RGBA或P模式导致问题 if image.mode ! ’RGB‘: image image.convert(’RGB‘) # 预处理示例2: 如果图片太大可以按比例缩小加快OCR处理速度 # max_size 2000 # if max(image.size) max_size: # ratio max_size / max(image.size) # new_size tuple(int(dim * ratio) for dim in image.size) # image image.resize(new_size, Image.Resampling.LANCZOS) # 保存图片 final_path os.path.join(save_path, f’chart_{index}.jpg‘) image.save(final_path, ’JPEG‘, quality85) print(f”图片已保存至: {final_path}“) return final_path except Exception as e: print(f”下载或处理图片 {img_url} 失败: {e}“) return None # 遍历图片链接并下载 local_image_paths [] for i, url in enumerate(img_urls[:5]): # 这里只处理前5张作为演示 time.sleep(1) # 礼貌性延迟避免对服务器造成压力 path download_and_preprocess_image(url, img_dir, i) if path: local_image_paths.append(path)预处理步骤不是必须的但很有用。比如将图片统一转为RGB格式可以避免一些OCR接口因图片模式不兼容而报错。如果图片分辨率过高适当缩小既能提升传输和识别速度通常也不会对识别精度造成太大影响。3.3 第三步调用GLM-OCR API识别文字这是核心环节。我们需要将下载好的图片发送给GLM-OCR服务并获取识别结果。这里假设你已经有可用的API端点Endpoint和密钥。import base64 import json def recognize_text_with_glm_ocr(image_path, api_url, api_key): ”“”调用GLM-OCR API识别图片中的文字”“” with open(image_path, ’rb‘) as f: image_data f.read() # 将图片进行Base64编码 image_base64 base64.b64encode(image_data).decode(’utf-8‘) # 构造请求载荷 payload { “image”: image_base64, # 其他可能的参数例如指定语言等根据API文档调整 # “language”: “zh”, } headers { “Authorization”: f”Bearer {api_key}“, “Content-Type”: “application/json” } try: response requests.post(api_url, headersheaders, datajson.dumps(payload), timeout30) result response.json() if response.status_code 200: # 假设API返回格式为 {“text”: “识别出的文字”, “words”: [...]} extracted_text result.get(“text”, “”) print(f”识别成功字符数{len(extracted_text)}“) return extracted_text, result else: print(f”OCR识别失败状态码{response.status_code}, 返回{result}“) return None, None except requests.exceptions.RequestException as e: print(f”API请求失败: {e}“) return None, None except json.JSONDecodeError as e: print(f”解析API响应失败: {e}“) return None, None # 你的GLM-OCR API信息 API_URL “YOUR_GLM_OCR_API_ENDPOINT” API_KEY “YOUR_API_KEY_HERE” # 对每张本地图片进行识别 ocr_results [] for img_path in local_image_paths: print(f”\n正在识别: {img_path}“) text, raw_result recognize_text_with_glm_ocr(img_path, API_URL, API_KEY) if text: ocr_results.append({ “image_path”: img_path, “extracted_text”: text, “raw_data”: raw_result # 保存原始数据可能包含文字位置信息 }) # 打印前500个字符预览一下 print(“识别预览:”, text[:500], “...” if len(text) 500 else “”) time.sleep(0.5) # 控制一下请求频率这段代码的关键是将图片转换成Base64编码然后通过POST请求发送给OCR服务。拿到返回的JSON数据后我们主要提取其中的text字段它就是识别出的纯文本。原始的raw_result也建议保存下来里面可能包含每个字的位置和置信度用于更精细的数据处理。3.4 第四步数据清洗与结构化存储OCR识别出来的文字通常是纯文本可能包含换行、空格以及一些识别错误。我们需要清洗这些数据并把它和之前抓取到的网页元信息如文章标题、URL一起结构化的保存起来。import pandas as pd import re def clean_ocr_text(text): ”“”简单的文本清洗函数”“” if not text: return “” # 1. 合并过多的换行和空格 text re.sub(r’\n‘, ’\n‘, text) # 多个换行符合并为一个 text re.sub(r’[ \t]‘, ’ ‘, text) # 多个空格/制表符合并为一个空格 # 2. 移除一些常见的OCR错误字符根据实际情况调整 # text text.replace(’|‘, ’1‘).replace(’[‘, ’1‘) # 示例 # 3. 去除首尾空白 text text.strip() return text # 假设我们之前也抓取了文章元数据 article_metadata { “title”: article_title, “url”: url, “fetch_time”: time.strftime(’%Y-%m-%d %H:%M:%S‘) } # 清洗OCR结果并组装数据 structured_data [] for result in ocr_results: cleaned_text clean_ocr_text(result[“extracted_text”]) data_entry { **article_metadata, # 合并元数据 “image_file”: os.path.basename(result[“image_path”]), “recognized_text”: cleaned_text, “text_length”: len(cleaned_text) } structured_data.append(data_entry) # 使用Pandas DataFrame进行查看和操作 df pd.DataFrame(structured_data) print(df[[“image_file”, “text_length”]].head()) # 保存到CSV文件 csv_filename f’./results/{article_title}_ocr_results.csv‘ os.makedirs(’./results‘, exist_okTrue) df.to_csv(csv_filename, indexFalse, encoding’utf-8-sig‘) # utf-8-sig支持Excel中文 print(f”\n所有结果已结构化保存至: {csv_filename}“) # 也可以选择保存到数据库例如SQLite import sqlite3 conn sqlite3.connect(’web_scraping_ocr.db‘) df.to_sql(’ocr_results‘, conn, if_exists’append‘, indexFalse) conn.close() print(“数据已追加至数据库。”)清洗规则需要根据你识别的具体内容来定制。存储方面CSV文件简单直观适合数据交换和快速查看而SQLite这类轻型数据库则更适合管理大量、持续增长的数据方便进行查询和分析。4. 让方案更健壮实践经验与建议在实际项目中跑通这个流程只是第一步。要让它在生产环境中稳定运行还需要考虑更多。第一处理反爬机制。目标网站可能会封禁你的IP。解决方案包括设置合理的请求间隔time.sleep、使用代理IP池、以及轮换User-Agent。requests库本身比较简单对于复杂的反爬网站可能需要用到Selenium或Playwright来模拟真实浏览器行为。第二优化图片筛选逻辑。不是所有图片都值得识别。你需要写更智能的规则来过滤掉广告、图标、头像等无关图片。除了用HTML属性如class、alt文本过滤还可以用图片的尺寸、宽高比作为筛选条件。第三管理OCR成本与错误。API调用通常有费用。可以对图片进行预筛选只对可能包含文本的图片通过简单的图像处理检测边缘、颜色分布发起识别。同时一定要做好异常处理和日志记录对识别失败或返回空结果的图片进行标记方便后续排查。第四设计数据流水线。对于大规模采集任务最好将流程模块化、任务队列化。你可以用Scrapy框架来构建更强大的爬虫用Celery等工具异步调度OCR任务并将最终数据管道连接到你的数据分析平台或业务系统。5. 总结回过头看我们把GLM-OCR和Python爬虫结合其实做了一件很自然的事情延伸爬虫的感知能力。爬虫不再是只能“读码”的工具而是变成了能“读图”的信息收集专家。这套方案的实施门槛并不高核心代码也就百来行但能解决的实际问题却很多。从电商比价到舆情监控从学术资料收集到市场报告生成凡是需要从网页图片中批量提取信息的场景它都能派上用场。我自己的使用感受是初期需要花些时间调试针对特定网站的爬取规则和图片过滤逻辑一旦这个环节稳定了后面的OCR识别和数据入库就像流水线一样顺畅。GLM-OCR的识别准确率确实帮了大忙省去了大量后期校正的麻烦。如果你正面临类似的信息采集痛点不妨就从今天文章里的示例代码开始找一个简单的目标网站试试水。先跑通整个流程再逐步加入错误处理、代理IP、任务调度等更复杂的功能。你会发现自动化处理图片信息并没有想象中那么难。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

相关新闻