北京营销型网站公司去哪学做网站
北京营销型网站公司,去哪学做网站,聚名网域名,旅游电子商务网站开发方案HUNYUAN-MT翻译模型Python爬虫实战#xff1a;多语言网页内容智能翻译处理
你是不是也遇到过这样的困扰#xff1f;想研究某个海外市场#xff0c;或者追踪某个国际新闻事件#xff0c;面对满屏的外语网页#xff0c;只能靠浏览器插件一句句翻译#xff0c;效率低不说 Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 } try: # 设置超时并随机延迟一下模拟人类行为 await asyncio.sleep(1) # 简单延迟更复杂的项目可以考虑随机延迟 response await self.client.get(url, headersheaders, timeout10.0) response.raise_for_status() # 如果状态码不是200抛出异常 logger.info(f成功抓取: {url}) return response.text except httpx.RequestError as e: logger.error(f请求失败 {url}: {e}) return None except httpx.HTTPStatusError as e: logger.error(fHTTP错误 {url}: {e.response.status_code}) return None def extract_main_content(self, html: str) - str: 从HTML中提取主要文本内容这是一个基础示例需要针对目标网站调整 if not html: return soup BeautifulSoup(html, lxml) # 示例尝试寻找article, main标签或者包含大量文本的div # 实际应用中你需要分析目标网站的HTML结构 for tag in [article, main, div.content, div.post-body]: element soup.select_one(tag) if element: # 获取所有段落文本并清理空白字符 text .join(p.get_text(stripTrue) for p in element.find_all(p)) return text if text else element.get_text(stripTrue) # 如果没找到特定标签回退到获取整个body的文本噪音会多 return soup.body.get_text(stripTrue) if soup.body else 这个爬虫类做了几件事使用自定义的User-Agent让自己看起来更像一个普通浏览器。添加了简单的抓取延迟await asyncio.sleep(1)避免请求过快把服务器搞崩溃也降低被封IP的风险。包含了基本的错误处理网络问题或页面不存在时能记录日志而不是让程序崩溃。extract_main_content方法提供了一个提取正文的模板。重要提示不同的网站结构千差万别这里用select_one尝试寻找常见的内容容器标签。在实际使用时你必须用浏览器的开发者工具F12仔细查看目标网站的HTML结构并修改这里的CSS选择器才能精准地提取出你想要的内容过滤掉导航栏、侧边栏、页脚等噪音。4. 第二步集成HUNYUAN-MT翻译模型爬虫把“原料”外语文本准备好了现在轮到翻译模型这个“大厨”上场了。我们创建一个翻译客户端负责与HUNYUAN-MT的API进行通信。class TranslationClient: HUNYUAN-MT翻译API客户端 def __init__(self, api_url: str, api_key: str): self.api_url api_url self.headers { Authorization: fBearer {api_key}, Content-Type: application/json } self.client httpx.AsyncClient(timeout30.0) # 翻译可能稍慢超时设长点 async def translate_batch(self, texts: List[str], source_lang: str auto, target_lang: str zh) - List[str]: 批量翻译文本列表 if not texts: return [] payload { texts: texts, source_lang: source_lang, target_lang: target_lang # 根据实际API文档可能还需要其他参数如model_id等 } try: response await self.client.post(self.api_url, jsonpayload, headersself.headers) response.raise_for_status() result response.json() # 解析API响应这里需要你根据HUNYUAN-MT API的实际返回格式调整 # 假设返回格式为 {translations: [译文1, 译文2, ...]} translations result.get(translations, []) if len(translations) ! len(texts): logger.warning(f翻译返回数量({len(translations)})与请求数量({len(texts)})不符) return translations except Exception as e: logger.error(f批量翻译失败: {e}) # 失败时返回空字符串列表避免后续处理出错 return [] * len(texts) async def close(self): 关闭HTTP客户端 await self.client.aclose()这个翻译客户端的关键点在于translate_batch方法批量处理它接受一个文本列表一次性发送给API。这比循环调用单条翻译接口效率高得多也更能发挥API的性能。参数灵活设置了源语言source_lang和目标语言target_lang。auto表示自动检测源语言对于抓取未知语种的网页非常有用。错误处理网络或API错误时记录日志并返回一个与原文数量相同的空字符串列表保证下游数据处理流程不会因为单条失败而中断。重要提示payload的结构和response.json()的解析逻辑必须严格按照你所使用的HUNYUAN-MT API的官方文档来编写。我上面的代码只是一个通用示例。5. 第三步组装全流程自动化脚本零件都造好了现在我们来把它们组装成一条自动化流水线。这个主脚本会协调爬虫和翻译器的工作。import pandas as pd from typing import List, Tuple async def main(urls_to_crawl: List[str]): 主流程抓取 - 翻译 - 保存 all_results [] # 1. 初始化客户端 async with httpx.AsyncClient() as http_client: scraper AsyncWebScraper(http_client) # 请替换为你的真实API地址和密钥 translator TranslationClient(api_urlYOUR_API_URL, api_keyYOUR_API_KEY) # 2. 异步抓取所有页面 fetch_tasks [scraper.fetch_page(url) for url in urls_to_crawl] html_pages await asyncio.gather(*fetch_tasks) # 3. 提取正文内容 original_texts [] for url, html in zip(urls_to_crawl, html_pages): if html: text scraper.extract_main_content(html) if text: # 只保留有内容的文本 original_texts.append((url, text)) else: logger.warning(f未从 {url} 提取到有效文本) else: logger.warning(f跳过 {url}抓取失败) # 4. 批量翻译提取到的文本 if original_texts: urls, texts zip(*original_texts) # 分离URL和文本 # 将文本列表分批避免单次请求过大例如每批20条 batch_size 20 translated_texts [] for i in range(0, len(texts), batch_size): batch texts[i:i batch_size] logger.info(f正在翻译第 {i//batch_size 1} 批共 {len(batch)} 条文本) batch_translations await translator.translate_batch(list(batch)) translated_texts.extend(batch_translations) await asyncio.sleep(0.5) # 批次间轻微延迟避免给API太大压力 else: logger.error(没有成功提取到任何可翻译的文本) return # 5. 组装结果 for url, orig, trans in zip(urls, texts, translated_texts): all_results.append({ url: url, original_text: orig[:200] ... if len(orig) 200 else orig, # 保存摘要 translated_text: trans[:200] ... if len(trans) 200 else trans, original_length: len(orig), translated_length: len(trans) }) # 6. 保存结果到CSV文件 df pd.DataFrame(all_results) output_file translated_contents.csv df.to_csv(output_file, indexFalse, encodingutf-8-sig) # utf-8-sig支持Excel直接打开 logger.info(f翻译完成结果已保存至: {output_file}) print(df.head()) # 预览前几条结果 # 7. 关闭翻译客户端 await translator.close() if __name__ __main__: # 替换成你想要抓取的真实网址列表 sample_urls [ https://example.com/article1, # 示例网址1 https://example.com/article2, # 示例网址2 # ... 添加更多网址 ] # 运行主异步函数 asyncio.run(main(sample_urls))这个主函数清晰地展示了整个流程初始化创建爬虫和翻译器。并发抓取使用asyncio.gather同时发起所有抓取任务速度飞快。内容提取对每个成功抓取的页面调用我们之前写好的提取函数拿到纯净的文本。批量翻译这是核心。我们把所有提取到的文本收集起来然后分成小批比如20条一批发送给翻译API。这样做既高效又符合API的调用规范还能在批次之间加点延迟做个“友好”的用户。结果组装与保存把原文、译文、对应的URL等信息组合起来用pandas转换成DataFrame然后轻松保存为CSV文件。用utf-8-sig编码是为了让生成的CSV文件用Excel打开时不会乱码。6. 实战技巧与问题应对跑通基本流程只是开始想让这个系统稳定可靠地用于生产环境还得考虑更多细节。6.1 应对反爬虫策略网站不喜欢被爬所以会有反爬措施。除了我们之前用的设置User-Agent和延迟还有几招使用代理IP池当单个IP请求过于频繁被封锁时轮换使用不同的代理IP是终极解决方案。你可以使用一些代理服务。# 示例在httpx客户端中使用代理 proxies {http://: http://your-proxy:port, https://: http://your-proxy:port} async with httpx.AsyncClient(proxiesproxies) as client: # ... 使用client进行请求处理Cookie和Session有些网站需要登录或验证。你可以使用httpx的Cookies功能来维持会话。解析JavaScript渲染的内容如果目标网站大量使用JavaScript动态加载内容httpx拿到的是空壳HTML。这时就需要用到playwright或selenium这类能控制真实浏览器的工具来抓取但速度会慢很多。6.2 翻译优化与后处理翻译模型很强大但直接使用原始结果有时需要微调。文本预处理抓取的文本可能包含多余的换行符、HTML实体如nbsp;、或乱码。在翻译前进行清洗会提升效果。import re def clean_text(text: str) - str: text re.sub(r\s, , text) # 合并多个空白字符 text text.strip() # 可以添加更多清洗规则如移除特定字符 return text处理长文本API可能有单次请求的长度限制。你需要将长文章分割成符合要求的段落分别翻译后再拼接。术语一致性如果你在翻译特定领域如医药、法律的内容可以构建一个术语表在翻译前后进行查找和替换确保专业词汇翻译准确统一。6.3 系统健壮性提升重试机制网络请求和API调用都可能偶尔失败。给fetch_page和translate_batch函数加上重试逻辑例如使用tenacity库能大幅提升稳定性。更细致的日志与监控记录每个URL的抓取状态、翻译状态甚至将失败的任务存入一个“重试队列”文件方便后续手动或自动重试。存储到数据库对于大量数据CSV文件可能变得笨重。可以考虑使用SQLite轻量级、PostgreSQL或MongoDB来存储便于查询和管理。pandas的to_sql方法可以很方便地将DataFrame写入数据库。7. 总结回过头看我们搭建的这个多语言网页内容智能处理管道其实思路并不复杂但带来的效率提升是颠覆性的。从手动复制粘贴到全自动抓取翻译你节省下来的不仅仅是时间更是让分析工作流变得可重复、可扩展。这套方案的核心优势在于它的灵活性和模块化。爬虫部分AsyncWebScraper和翻译部分TranslationClient是解耦的。这意味着如果将来HUNYUAN-MT模型升级了API或者你想换成另一个翻译服务只需要修改翻译客户端那一小部分代码爬虫和其他逻辑完全不用动。在实际使用中你可能会遇到各种奇怪的网站结构或者翻译API返回格式有变化这都是正常的。关键是根据我们上面提到的实战技巧耐心调试和优化。先从一两个简单的网站开始跑通整个流程然后再逐步增加复杂度比如加入代理、处理登录、优化文本清洗规则等。最后别忘了数据使用的伦理和法律边界只抓取公开且允许抓取的数据并合理控制请求频率做个有责任感的开发者。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。