Android中如何提取JavaScript代码?谷歌翻译动态内容爬取求助
爬取谷歌翻译动态生成内容的解决方案
方案一:用无头浏览器渲染JS(适合页面爬取场景)
Jsoup只能解析静态HTML,要获取JS动态生成的内容,得用能模拟浏览器渲染JavaScript的工具,比如Selenium。它会完整加载页面并执行所有JS代码,之后就能像正常浏览器一样定位、提取目标元素。
步骤和Java代码示例:
- 先引入Selenium依赖(Maven配置):
<dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>4.15.0</version> </dependency> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-chrome-driver</artifactId> <version>4.15.0</version> </dependency>
- 编写爬取逻辑:
import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import java.time.Duration; public class GoogleTranslateScraper { public static void main(String[] args) { // 配置Chrome无头模式,无需打开可视化浏览器窗口 ChromeOptions options = new ChromeOptions(); options.addArguments("--headless=new"); options.addArguments("--disable-gpu"); WebDriver driver = new ChromeDriver(options); try { // 打开谷歌翻译主页 driver.get("https://translate.google.com"); // 输入要翻译的文本(示例为中文"你好") driver.findElement(By.cssSelector("textarea[aria-label='源文本']")).sendKeys("你好"); // 等待目标元素加载完成,最多等待10秒 WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); var targetDiv = wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("div.xUPQqb"))); // 提取翻译文本和元素完整HTML结构 String translatedText = targetDiv.getText(); String elementHtml = targetDiv.getAttribute("outerHTML"); System.out.println("翻译结果:" + translatedText); System.out.println("目标元素HTML:" + elementHtml); } finally { // 关闭浏览器实例 driver.quit(); } } }
方案二:直接调用谷歌翻译API(更稳定合规)
爬取网页容易因为谷歌更新页面布局、触发反爬机制而失效,直接使用官方API是更靠谱的选择,不过需要申请API密钥并按调用量付费。
Java代码示例(用OkHttp发送请求):
- 先引入OkHttp和JSON解析依赖:
<dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.12.0</version> </dependency> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20231013</version> </dependency>
- API调用逻辑:
import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import org.json.JSONArray; import org.json.JSONObject; import java.io.IOException; public class GoogleTranslateAPI { private static final String API_KEY = "替换成你的谷歌云API密钥"; private static final String API_BASE_URL = "https://translation.googleapis.com/language/translate/v2"; public static void main(String[] args) throws IOException { OkHttpClient client = new OkHttpClient(); String sourceText = "你好"; String sourceLang = "zh"; String targetLang = "en"; // 构造请求URL String requestUrl = String.format("%s?q=%s&source=%s&target=%s&key=%s", API_BASE_URL, sourceText, sourceLang, targetLang, API_KEY); Request request = new Request.Builder().url(requestUrl).build(); try (Response response = client.newCall(request).execute()) { if (!response.isSuccessful()) throw new IOException("请求失败: " + response.code()); // 解析JSON响应获取翻译结果 JSONObject responseJson = new JSONObject(response.body().string()); JSONArray translations = responseJson.getJSONObject("data").getJSONArray("translations"); String translatedText = translations.getJSONObject(0).getString("translatedText"); System.out.println("翻译结果:" + translatedText); } } }
注意事项
- 页面爬取方式:谷歌有反爬机制,频繁请求可能被封禁IP,建议添加请求延时,必要时使用代理IP
- API方式:需要在谷歌云平台申请API密钥并启用翻译服务,按实际调用量收费,但稳定性和合规性远高于页面爬取
- 页面元素的class(比如
xUPQqb)可能会被谷歌随时修改,若用页面爬取,需要定期检查调整元素选择器
内容的提问来源于stack exchange,提问作者Roony
相关产品推荐
相关产品推荐

