GLM-OCR实战用Python爬虫自动采集并识别网页文本信息你是不是也遇到过这样的麻烦想分析某个网站上的产品信息或者监控一些行业动态但数据都“锁”在图片或者PDF文件里手动复制粘贴不仅慢还容易出错。以前处理这种问题要么靠人工要么用一些识别率不高的工具费时费力。现在我们可以换个思路把整个过程自动化。这篇文章我就来分享一个我自己在用的方案用Python爬虫把网页上的图片或PDF文件抓下来然后用GLM-OCR这个工具把里面的文字精准地“读”出来最后整理成结构化的数据。整个过程就像搭了一条流水线从采集、识别到整理一气呵成。这个组合拳特别适合一些需要持续跟踪信息的场景比如看看竞争对手最近在推什么新品或者把一堆历史文档快速转成可搜索的电子版。接下来我就带你一步步看看这套方案是怎么跑起来的以及在实际用的时候有哪些小技巧。1. 为什么需要自动化文本采集与识别在开始动手之前我们先聊聊为什么要把爬虫和OCR光学字符识别绑在一块用。单纯用爬虫只能拿到网页上的纯文本对于那些嵌在图片里的文字、扫描的PDF文档或者需要登录才能查看的内容它就无能为力了。而单纯的OCR软件往往又需要你手动一张张上传图片批量处理起来很不方便。把两者结合起来价值就出来了。爬虫负责不知疲倦地从网上“搬运”原始材料图片、PDF链接OCR则扮演“翻译官”的角色把图像里的文字转换成计算机能理解的文本。这样一来我们就能自动化地处理大量非结构化的图像文本信息。想想这些场景市场部的同事需要每天收集各大电商平台的产品主图分析上面的卖点文案研究机构需要把大量学术期刊的扫描版PDF转换成文本进行分析或者法务部门需要从一堆合同扫描件里快速提取关键条款。这些工作如果靠人工效率低且容易疲劳出错而我们的自动化流水线正好能解决这些痛点。2. 方案核心GLM-OCR与Python爬虫我们的方案主要依赖两个核心部分GLM-OCR和Python爬虫生态。GLM-OCR是一个基于大模型能力的文字识别工具。和传统OCR相比它的强项在于对复杂版面的理解能力更强比如那些混合了中英文、带有复杂表格或排版的图片它都能处理得比较好识别准确率更高。你可以把它想象成一个阅读能力更强的“AI眼睛”。Python爬虫部分我们则会用到一些非常成熟的库比如requests来获取网页内容BeautifulSoup来解析网页并找到我们需要的图片或PDF链接可能还会用到selenium来处理那些需要JavaScript渲染的动态页面。这些工具就像是我们的“机械手”负责从互联网上精准抓取目标。整个流程的骨架很简单爬虫找到并下载数据源 - GLM-OCR识别其中的文字 - 将结果清洗、结构化并保存。下面我们就进入具体的实战环节。3. 环境准备与工具安装工欲善其事必先利其器。我们先来把需要的环境搭好。这里假设你已经有基本的Python开发环境建议Python 3.8及以上版本。首先安装我们所需的Python库。打开你的终端或命令行执行以下命令pip install requests beautifulsoup4 pillow pymupdf简单解释一下这几个库requests用于发送HTTP请求下载网页内容和文件。beautifulsoup4用于解析HTML网页方便我们定位和提取图片、PDF的链接。pillow(PIL)Python的图像处理库有时需要对下载的图片进行预处理。pymupdf(PyMuPDF)一个功能强大的PDF处理库可以读取PDF内容也可以将PDF页面转为图片供OCR识别。接下来是GLM-OCR。根据你使用的具体版本和部署方式安装方法可能略有不同。最常见的是通过其提供的Python包来安装。例如如果它提供了glm-ocr包你可以这样安装pip install glm-ocr如果GLM-OCR是以API服务的形式提供那你则需要确保能通过网络访问到该服务端点并准备好相应的API密钥。安装完成后建议写个简单的测试脚本确认爬虫库和OCR功能都能正常调用。4. 实战步骤构建自动化流水线环境准备好了我们来一步步搭建这条流水线。我会用一个实际的例子来演示从一个产品列表页面上抓取所有产品的展示图片并识别出图片中的产品名称和价格。4.1 第一步用爬虫抓取目标链接我们的目标是某个电商网站的产品列表页。首先用爬虫获取页面内容并解析出所有产品图片的链接。import requests from bs4 import BeautifulSoup import os def fetch_image_urls(page_url, img_classproduct-image): 从指定页面抓取特定CSS类名的图片链接 headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 } try: response requests.get(page_url, headersheaders, timeout10) response.raise_for_status() # 检查请求是否成功 response.encoding response.apparent_encoding except requests.RequestException as e: print(f抓取页面失败: {e}) return [] soup BeautifulSoup(response.text, html.parser) image_tags soup.find_all(img, class_img_class) image_urls [] for img in image_tags: src img.get(src) if src and src.startswith(http): image_urls.append(src) # 处理可能存在的相对路径 elif src and src.startswith(//): image_urls.append(https: src) elif src and src.startswith(/): # 需要拼接基础URL这里简单处理实际情况可能更复杂 base_url /.join(page_url.split(/)[:3]) image_urls.append(base_url src) print(f从页面共找到 {len(image_urls)} 张图片。) return image_urls4.2 第二步下载图片到本地获取到图片链接列表后我们需要将它们下载到本地文件夹以便后续进行OCR处理。def download_images(image_urls, save_dir./downloads): 下载图片列表到指定目录 if not os.path.exists(save_dir): os.makedirs(save_dir) local_paths [] for i, url in enumerate(image_urls): try: # 从URL提取文件名如果没有则用索引 filename url.split(/)[-1].split(?)[0] if not filename.endswith((.png, .jpg, .jpeg, .gif, .bmp)): filename fimage_{i}.jpg filepath os.path.join(save_dir, filename) img_data requests.get(url, timeout15).content with open(filepath, wb) as f: f.write(img_data) local_paths.append(filepath) print(f已下载: {filename}) except Exception as e: print(f下载 {url} 失败: {e}) return local_paths4.3 第三步调用GLM-OCR识别文字图片下载完毕现在轮到GLM-OCR上场了。这里演示的是假设GLM-OCR提供了本地Python库的调用方式。from glm_ocr import GLMOCR # 假设的导入方式请根据实际SDK调整 def ocr_images(image_paths): 对本地图片列表进行OCR识别 # 初始化OCR识别器这里需要填入你实际的模型路径或配置 # 例如ocr_engine GLMOCR(model_pathpath/to/model) # 或者使用API方式ocr_engine GLMOCR(api_keyyour_key, endpointurl) ocr_engine GLMOCR() all_results [] for img_path in image_paths: try: # 调用识别函数具体函数名请参考GLM-OCR官方文档 result ocr_engine.recognize(img_path) # result 可能是一个包含文本、位置、置信度的字典或对象 all_results.append({ image_path: img_path, text: result.get(text, ), confidence: result.get(confidence, 0) }) print(f已识别: {os.path.basename(img_path)}) except Exception as e: print(f识别 {img_path} 失败: {e}) all_results.append({image_path: img_path, text: , confidence: 0}) return all_results4.4 第四步结果处理与存储识别出来的原始文本可能比较杂乱我们需要根据业务逻辑进行清洗和结构化。比如从识别文本中提取产品名和价格。import re import json def extract_product_info(ocr_text): 从OCR识别文本中提取产品名称和价格一个简单的示例 # 这是一个非常简单的规则示例实际应用需要更复杂的逻辑如正则表达式、关键词匹配等 lines ocr_text.split(\n) name price for line in lines: line line.strip() # 假设产品名是不包含数字和货币符号的较长字符串 if len(line) 2 and not re.search(r[\d¥$€], line): name line if len(line) len(name) else name # 假设价格是包含货币符号和数字的字符串 price_match re.search(r(¥|\$|€)\s*(\d\.?\d*), line) if price_match and not price: price price_match.group(0) return {name: name, price: price} def process_and_save_results(ocr_results, output_fileproducts.json): 处理OCR结果并保存为JSON文件 structured_data [] for item in ocr_results: info extract_product_info(item[text]) structured_data.append({ source_image: item[image_path], recognized_text: item[text], product_name: info[name], product_price: info[price], confidence: item[confidence] }) with open(output_file, w, encodingutf-8) as f: json.dump(structured_data, f, ensure_asciiFalse, indent2) print(f结果已保存至 {output_file}) return structured_data4.5 第五步组装完整流程最后我们把上面的所有步骤串联起来形成一个完整的脚本。def main_pipeline(target_url): 自动化流水线主函数 print( 开始自动化文本采集与识别流水线 ) # 1. 抓取图片链接 print(\n1. 正在抓取页面图片链接...) img_urls fetch_image_urls(target_url) if not img_urls: print(未找到图片链接流程终止。) return # 2. 下载图片 print(\n2. 正在下载图片...) local_imgs download_images(img_urls[:5]) # 这里只下载前5张作为演示 # 3. OCR识别 print(\n3. 正在调用GLM-OCR进行文字识别...) ocr_results ocr_images(local_imgs) # 4. 处理并保存结果 print(\n4. 正在处理并保存识别结果...) final_data process_and_save_results(ocr_results) print(\n 流水线执行完毕 ) # 打印一些结果摘要 for data in final_data: print(f图片: {os.path.basename(data[source_image])} - 产品: {data[product_name]}, 价格: {data[product_price]}) # 使用示例 if __name__ __main__: # 替换成你想要抓取的目标网页地址 demo_url https://example.com/products main_pipeline(demo_url)运行这个脚本你就会看到控制台打印出每一步的进度最终结果会保存到一个products.json文件中。这样一个基本的自动化采集识别流水线就完成了。5. 处理更复杂的情况PDF与动态页面上面的例子处理的是静态网页上的图片。在实际项目中你可能会遇到更复杂的情况。处理PDF文件如果目标链接是PDF流程类似。爬虫抓到PDF链接并下载后我们可以使用pymupdf将PDF的每一页转换为图片然后再送入OCR流程。import fitz # PyMuPDF def pdf_to_images(pdf_path, output_dirpdf_pages): 将PDF每一页转换为图片 if not os.path.exists(output_dir): os.makedirs(output_dir) image_paths [] pdf_document fitz.open(pdf_path) for page_num in range(len(pdf_document)): page pdf_document.load_page(page_num) pix page.get_pixmap() img_path os.path.join(output_dir, fpage_{page_num1}.png) pix.save(img_path) image_paths.append(img_path) pdf_document.close() return image_paths处理动态加载的网页有些网站的产品图片是通过JavaScript动态加载的用requestsBeautifulSoup直接抓取不到。这时就需要用到selenium这样的浏览器自动化工具它能模拟真实用户操作等待页面完全渲染后再获取HTML内容。from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def fetch_dynamic_image_urls(url): 使用Selenium抓取动态加载的图片链接 options webdriver.ChromeOptions() options.add_argument(--headless) # 无头模式不显示浏览器窗口 driver webdriver.Chrome(optionsoptions) driver.get(url) # 等待特定元素加载完成 wait WebDriverWait(driver, 10) wait.until(EC.presence_of_all_elements_located((By.CLASS_NAME, product-image))) # 获取页面源码并用BeautifulSoup解析 soup BeautifulSoup(driver.page_source, html.parser) driver.quit() # 后续解析逻辑与之前静态页面相同... image_tags soup.find_all(img, class_product-image) # ... 提取链接6. 实践经验与优化建议在实际跑这套流程时你可能会遇到一些问题。这里分享几个我总结的经验反爬虫策略很多网站有反爬机制。除了设置合理的User-Agent和请求间隔 (time.sleep)对于重要项目可以考虑使用IP代理池。同时务必遵守网站的robots.txt协议尊重数据版权。OCR精度提升如果原始图片质量差如尺寸小、模糊、背景复杂会直接影响识别率。可以在识别前用PIL对图片进行简单的预处理比如调整对比度、锐化或二值化。GLM-OCR本身对复杂版面的适应性较强但提供更清晰的输入总会有帮助。结果后处理OCR识别出的文本难免会有错别字或格式混乱。除了上面示例中简单的规则提取对于更复杂的结构化信息抽取如从发票中识别各项金额可能需要结合正则表达式、关键词词典甚至训练一个小的文本分类模型来提升准确性。流程健壮性在生产环境中一定要加入完善的错误处理 (try...except) 和日志记录。网络可能不稳定文件可能损坏OCR服务可能暂时不可用好的代码应该能处理这些异常并在中断后有机会恢复。性能考量如果需要处理成千上万的图片或PDF可以考虑将任务队列化使用多线程或异步IO来提高下载和识别的速度。同时注意本地存储空间的管理。这套Python爬虫结合GLM-OCR的方案把两个工具的优势充分发挥了出来实现了从信息采集到文本转换的端到端自动化。它最大的价值在于解放了人力让机器去完成那些重复、枯燥的“看”和“抄”的工作。无论是用于市场分析、资料归档还是信息监控都能显著提升效率。当然每个具体的业务场景都需要你对流程进行微调比如针对特定网站结构修改爬虫解析逻辑或者根据你要提取的信息特点优化文本清洗规则。但核心的框架和思路是相通的。希望这个分享能给你带来一些启发如果你在实践过程中有新的发现或更好的方法也欢迎一起交流。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。