我正在尝试解析谷歌搜索结果的HTML以获取每个结果的标题。这是通过 android 在如下所示的私有嵌套类中完成的:
private class WebScraper extends AsyncTask<String, Void, String> {
public WebScraper() {}
@Override
protected String doInBackground(String... urls) {
Document doc;
try {
doc = Jsoup.connect(urls[0]).get();
} catch (IOException e) {
System.out.println("Failed to open document");
return "";
}
Elements results = doc.getElementsByClass("rc");
int count = 0;
for (Element lmnt : results) {
System.out.println(count++);
System.out.println(lmnt.text());
}
System.out.println("Count is : " + count);
String key = "test";
//noinspection Since15
SearchActivity.this.songs.put(key, SearchActivity.this.songs.getOrDefault(key, 0) + 1);
// return requested
return "";
}
}
我正在尝试解析的示例网址:http://www.google.com/#q=i+might+site:genius.com
出于某种原因,当我运行上面的代码时,我的计数被打印为 0,因此结果中没有存储任何元素。任何帮助都非常感谢!附言文档肯定已初始化,HTML 页面正在正确加载
此代码将在谷歌中搜索像"Apple"这样的单词,并从结果中获取所有链接并显示其标题和网址。它可以在一天内搜索多达 500 个单词,之后谷歌检测到它并停止给出结果。
search="Apple"; //your word to be search on google
String userAgent = "ExampleBot 1.0 (+http://example.com/bot)";
Elements links=null;
try {
links = Jsoup.connect(google +
URLEncoder.encode(search,charset)).
userAgent(userAgent).get().select(".g>.r>a");
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
for (Element link : links) {
String title = link.text();
String url = link.absUrl("href"); // Google returns URLs in
format "http://www.google.com/url?q=<url>&sa=U&ei=<someKey>".
try {
url = URLDecoder.decode(url.substring(url.indexOf('=') +
1, url.indexOf('&')), "UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (!url.startsWith("http")) {
continue; // Ads/news/etc.
}
System.out.println("Title: " + title);
System.out.println("URL: " + url);
}
如果你检查谷歌页面的源代码,你会发现它不包含任何在浏览器中正常显示的文本数据 - 只有一堆javascript代码。这意味着谷歌动态输出所有搜索结果。
Jsoup将获取该javascript代码,并且不会找到任何带有"rc"类的html代码,这就是为什么您在代码示例中获得零计数的原因。
考虑使用 Google 的公共搜索 API,而不是直接解析其 html 页面:https://developers.google.com/custom-search/。
我完全同意Matvey Sidorenko的观点,但要使用谷歌公共搜索API,你需要有谷歌Api密钥。但问题是谷歌限制每个 api 密钥 100 次搜索,超过该值,它将停止工作并在 24 小时内重置。
最近我正在做一个项目,我们需要获取用户提供的不同查询的谷歌搜索结果链接,为了克服 API 限制的问题,我制作了自己的 API,可以直接在谷歌/ncr 上搜索并给你结果链接。
免费的谷歌搜索API-http://freegoogleapi.azurewebsites.net/或 http://google.bittque.com
我使用HTML-UNIT库来制作这个API。
您可以使用我的API,也可以使用HTML UNIT库来实现所需的内容。