我必须创建一个应用程序,对于给定的术语,它将从谷歌搜索页面下载前10个结果的链接,但有一个问题,
如果我用webClient下载源代码,而不是html,我会得到JS代码。
如果我查看Google chrome(ctrl+u)中的源代码,我会得到同样的结果,但如果我尝试使用内置的开发工具检查该元素,我可以看到真正的html代码
有人知道我如何下载真正的html代码以便提取链接吗?
您应该使用Google自定义搜索API
http://code.google.com/apis/customsearch/v1/overview.html
这里有一个例子,显示了搜索"汽车"的前10个结果
<html>
<head>
<title>JSON/Atom Custom Search API Example</title>
</head>
<body>
<div id="content"></div>
<script>
function hndlr(response) {
for (var i = 0; i < response.items.length; i++) {
var item = response.items[i];
// in production code, item.htmlTitle should have the HTML entities escaped.
document.getElementById("content").innerHTML += "<br>" + item.htmlTitle;
}
}
</script>
<script src="https://www.googleapis.com/customsearch/v1?key=YOUR-KEY&cx=017576662512468239146:omuauf_lfve&q=cars&callback=hndlr">
</script>
</body>
</html>
您可以制作一个Perl脚本来只提取您想要的数据,即使它包含大量JavaScript,文档也是有效的HTML,因此您可以使用HTML解析器转换为XHTML并使用XML::Simple
或XML::Twig
这是我使用API从谷歌获得搜索结果时使用的一些代码:
string googleUriPattern =
"http://ajax.googleapis.com/ajax/services/search/web?v=1.0&safe=off&rsz=large&userip={0}&q={1}";
var requestUri = new Uri(
string.Format(
googleUriPattern,
"A valid IP address",
"query"
));
var httpWebRequest = (HttpWebRequest)WebRequest.Create(requestUri);
httpWebRequest.Timeout = 5000;
using (var webResponse = httpWebRequest.GetResponse())
using (var sr = new StreamReader(webResponse.GetResponseStream()))
{
var result = JsonConvert.DeserializeXNode(sr.ReadToEnd(), "responseData");
var searchResultCount = Convert.ToInt32((string)result.Descendants("estimatedResultCount").FirstOrDefault());
}
正如你所看到的,我的案例是确定谷歌对查询的估计结果计数,但你会得到完整的回复,如果你愿意,你可以从中读取结果。