API Key (client_id)https://api.fanyi.baidu.com/api/trans/product/desktopSystem.Web.Extensions (JavaScriptSerializer) 或 Newtonsoft.Json
using System;
using System.Net;
using System.Web.Script.Serialization;
using System.Text.RegularExpressions;
public class BaiduTranslator {
private readonly string _apiKey;
private readonly JavaScriptSerializer _jss = new JavaScriptSerializer();
public BaiduTranslator(string apiKey) { _apiKey = apiKey; }
public string Translate(string text, string from = "auto", string to = "auto") {
string url = $"https://api.fanyi.baidu.com/api/trans/vip/translate?q={WebUtility.UrlEncode(text)}&from={from}&to={to}&appid={_apiKey}&salt={DateTime.Now.Ticks}&sign={GenerateSign(text)}";
// 註:正式版需簽名 sign=MD5(appid+q+salt+密鑰),此處簡化演示
using (WebClient wc = new WebClient()) {
string json = wc.DownloadString(url);
var result = _jss.Deserialize(json);
return result?.trans_result?.FirstOrDefault()?.dst ?? text;
}
}
// 批量翻譯(含延遲防封禁)
public string TranslateBatch(string[] texts, int delayMs = 1000) {
var results = new List();
foreach (var t in texts) {
results.Add(Translate(t));
System.Threading.Thread.Sleep(delayMs);
}
return string.Join("。", results);
}
private string GenerateSign(string q) { /* MD5 實現 */ return ""; }
}
public class BaiduResult {
public List trans_result { get; set; }
}
public class TransResult { public string src { get; set; } public string dst { get; set; } }
public partial class Collector : System.Web.UI.Page {
protected void Page_Load(object sender, EventArgs e) {
var translator = new BaiduTranslator("YOUR_API_KEY");
var db = new Entities();
for (int i = 740; i < 900000; i++) {
try {
string url = $"https://www.52mvc.com/story/love/{i}.html";
string html = DownloadHtml(url);
// 提取標題
string title = Regex.Match(html, @"(.+?)").Groups[1].Value;
// 提取正文
string content = Regex.Match(html, @"雙擊或拖選\)(.+?) ").Groups[1].Value;
content = StripHtml(content).Replace(" ", "").Replace(""", "“");
// 翻譯標題
string zhTitle = translator.Translate(title);
// 分句翻譯正文
var sentences = content.Split('.').Where(s => s.Length > 0).ToArray();
string zhContent = translator.TranslateBatch(sentences);
// 入庫
db.Contents.Add(new Content { Title = zhTitle, Body = zhContent });
db.SaveChanges();
Thread.Sleep(100); // 禮貌延遲
} catch (Exception ex) {
LogError(i, ex);
Thread.Sleep(1500); // 錯誤後較長延遲
}
}
}
private string DownloadHtml(string url) { /* WebClient 下載 */ return ""; }
private string StripHtml(string html) => Regex.Replace(html, "<[^>]*>", "");
}
| 技術點 | 實現細節 |
|---|---|
| URL 編碼 | WebUtility.UrlEncode 處理中文/特殊字符 |
| JSON 反序列化 | JavaScriptSerializer 或 JsonConvert 映射 DTO |
| HTML 清洗 | Regex 移除標籤,處理實體字符 |
| 分句翻譯 | 按標點分割,避免單次請求過長被拒 |
| 防封禁策略 | 請求間隔 Sleep、異常重試、User-Agent 模擬 |
| 簽名生成 | MD5(appid + q + salt + 密鑰) —— 正式版必須 |
// 中文轉 Unicode (\uXXXX)
public string ToUnicode(string str) {
if (string.IsNullOrEmpty(str)) return "";
var sb = new StringBuilder();
foreach (char c in str) sb.Append("\\u" + ((int)c).ToString("x4"));
return sb.ToString();
}
// Unicode 轉中文
public string FromUnicode(string str) {
if (string.IsNullOrEmpty(str)) return "";
return Regex.Replace(str, @"\\u([0-9A-Fa-f]{4})", m => ((char)int.Parse(m.Groups[1].Value, System.Globalization.NumberStyles.HexNumber)).ToString());
}
百度翻譯 API 提供了低成本的機器翻譯能力,配合 ASP.NET 後台採集、清洗、入庫流程,可快速構建多語言內容庫。核心在於請求頻率控制、異常重試、數據清洗三大工程化保障。