如何用Python从HTML提取文本、获取动态验证码并获取KEY
嘿,我来帮你搞定这两个问题——首先是HTML文本提取,你用strip()肯定没用,因为它根本处理不了HTML的标签结构;然后是动态验证码的事儿,得看具体类型来选方案,咱们一步步说:
一、从长HTML提取文本:用专业解析库替代strip()
strip()只能移除字符串首尾的空白字符,完全没法识别HTML标签,所以处理HTML文本必须用专门的解析工具。推荐两个:BeautifulSoup(上手简单,适合大多数场景)和lxml(解析速度极快,适合超大型HTML页面)。
1. 先装依赖
打开终端装包:
pip install beautifulsoup4 lxml
2. 提取文本的示例代码
假设你已经通过requests拿到了HTML内容,直接用BeautifulSoup解析:
from bs4 import BeautifulSoup import requests # 先获取目标页面的HTML target_url = "你的目标页面URL" response = requests.get(target_url, headers={"User-Agent": "Mozilla/5.0"}) # 加UA伪装,避免被反爬 html_content = response.text # 用lxml解析器初始化BeautifulSoup(速度快) soup = BeautifulSoup(html_content, "lxml") # 提取所有文本,自动剔除HTML标签 raw_text = soup.get_text() # 可选:整理文本,去掉多余的换行和连续空格 clean_text = ' '.join(raw_text.split()) print(clean_text)
get_text()会把所有HTML标签过滤掉,只保留纯文本;split()+join()的操作能把杂乱的换行、多空格统一成单个空格,让长页面的文本更整洁。
如果是特别长的HTML(比如几万行那种),lxml解析器的速度会比默认的html.parser快好几倍,所以一定要指定"lxml"作为第二个参数。
二、处理动态验证码,获取KEY
动态验证码分好几种类型,不同类型的解决方案差异很大,我给你列几种最常见的场景:
1. 普通图片验证码(后端返回静态图片)
如果验证码是一张独立的图片(比如URL是/api/captcha),可以试试OCR识别:
- 首先得装
pytesseract和Tesseract OCR引擎(注意:Tesseract需要单独去官网下载安装,不是用pip装的) - 示例代码:
import requests from PIL import Image import pytesseract # 获取验证码图片 captcha_url = "验证码图片的URL" # 加headers伪装成浏览器请求 headers = {"User-Agent": "Mozilla/5.0"} img = Image.open(requests.get(captcha_url, headers=headers, stream=True).raw) # 预处理图片,提高识别率(转灰度+二值化) img_gray = img.convert('L') img_binary = img_gray.point(lambda x: 0 if x < 127 else 255, '1') # 识别验证码 captcha_code = pytesseract.image_to_string(img_binary).strip() print(captcha_code)
但这种方法对带干扰线、扭曲文字的验证码准确率很低,如果网站用了这类复杂验证码,可能得考虑付费的第三方验证码识别API,或者用模拟浏览器的方式。
2. 前端Canvas生成的动态验证码
这类验证码的图片是在浏览器里用Canvas绘制的,没法直接通过URL获取,这时候得用Selenium模拟真实浏览器操作:
from selenium import webdriver from PIL import Image import pytesseract import base64 # 初始化Chrome浏览器(需要下载对应版本的ChromeDriver) driver = webdriver.Chrome() driver.get("目标页面URL") # 获取Canvas元素,把它转成base64格式的图片数据 canvas = driver.find_element_by_tag_name("canvas") canvas_base64 = driver.execute_script("return arguments[0].toDataURL('image/png').substring(21);", canvas) # 把base64转成图片文件 img_data = base64.b64decode(canvas_base64) with open("captcha_temp.png", "wb") as f: f.write(img_data) # 识别验证码(和上面的步骤一样) img = Image.open("captcha_temp.png") captcha_code = pytesseract.image_to_string(img).strip() # 填写验证码并提交表单 driver.find_element_by_id("captcha-input").send_keys(captcha_code) driver.find_element_by_id("submit-btn").click() # 拿到KEY后可以提取页面内容 key_element = driver.find_element_by_id("key-display") target_key = key_element.text print(target_key) # 记得关闭浏览器 driver.quit()
3. 复杂验证码(滑块、文字点选、行为验证)
这类验证码是专门防爬虫的,OCR基本没用,解决方案有两种:
- 用Selenium结合OpenCV模拟人工操作:比如滑块验证码,用OpenCV识别缺口位置,然后模拟鼠标拖动;文字点选的话,识别文字位置再模拟点击。
- 第三方验证码识别服务:很多平台提供这类API,你只需要上传验证码图片或传递页面信息,就能拿到识别结果(但需要付费)。
⚠️ 重要提醒:很多网站禁止爬虫行为,使用这些方法前一定要仔细阅读网站的robots协议和用户条款,避免违反法律或网站规定。
最后补充一句:不管是提取文本还是处理验证码,都要注意反爬机制,比如给请求加合理的headers、控制请求频率、用代理IP(如果需要),避免被网站封禁IP。
内容的提问来源于stack exchange,提问作者3xp

