从谷歌搜索结果页面中提取图像的URL
本文关键字:提取 图像 URL 谷歌 搜索结果 | 更新日期: 2023-09-27 18:27:02
谷歌添加了一个很好的功能,可以让你获得任何名人的即时信息,例如,当你搜索"Barack Obama"时,你会在结果页面上看到一份个人简历和一张照片,这样你就不必访问任何结果来获得这些信息。
活样本:http://goo.gl/vf1ti3
我想做的是在即时信息框的左侧获取图像的URL。我想使用HTML代码中的System.Text.RegularExpressions.Regex
来实现这一点。
我可以用以下代码获得结果页面的来源:
private void getInfoAboutCelebrities()
{
try
{
string celebrityName = null;
Dispatcher.Invoke((Action)delegate()
{
DisableUI();
celebrityName = celebrityName_textBox.Text;
});
celebrityName = HttpUtility.UrlEncode(celebrityName);
string queryURL = "http://www.google.com/search?q=" + celebrityName + "+Height&safe=active&oq=" + celebrityName + "+Height&gs_l=heirloom-serp.12...0.0.0.3140.0.0.0.0.0.0.0.0..0.0....0...1ac..24.heirloom-serp..0.0.0.hXJwfydNFhk";
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(queryURL);
request.ContentType = "application/x-www-form-urlencoded";
request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0";
request.Method = "GET";
// make request for web page
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader htmlSource = new StreamReader(response.GetResponseStream());
string htmlStringSource = string.Empty;
htmlStringSource = htmlSource.ReadToEnd();
response.Close();
// Extracting height
var regex = new Regex(@"<span class=""kno-a-v"">(.*?)</span>");
var match = regex.Match(htmlStringSource);
var result = match.Groups[1].Value;
///////////////////////////////////////////////////////////
// Extracting photo ( which I couldn't do it
regex = new Regex(@"data:image/jpeg;base64(.*?)'x3d'x3d");
match = regex.Match(htmlStringSource);
///////////////////////////////////////////////////////////
result = HttpUtility.HtmlDecode(result);
if (String.IsNullOrWhiteSpace(result))
MessageBox.Show("Sorry, no such entry.", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
else
{
Dispatcher.Invoke((Action)delegate()
{
preloader_Image.Visibility = Visibility.Hidden;
MessageBox.Show(result);
});
}
Dispatcher.Invoke((Action)EnableUI);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Error");
}
}
有人能告诉我应该使用什么正则表达式吗?(因为实际上我甚至无法通过查看源代码自己获得URL!)
很可能图像URL甚至不在您返回的HTML中。那个页面上有很多Javascript。该页面旨在在浏览器中查看,浏览器可以运行Javascript并下载图像、格式化页面等。无法保证显示的信息在HTML中可用。
然而,我怀疑您要查找的图像是在文件末尾以base64编码的嵌入图像。搜索imgthumb13
,你就会找到它。也许你可以将其转换为二进制,然后对图像进行解码。如果你知道图像格式。(不,我没有。)
谷歌的搜索结果页面根本不是为机器人或抓取器设计的。事实上,谷歌不赞成你用刮刀来阅读他们的结果页面。如果他们确定你在他们的页面上使用刮刀,他们会阻止你。如果你想处理谷歌搜索结果,那么你应该使用谷歌搜索API。
另请参阅适用于C#的任何形式的Google Search API?。
还有一件事。谷歌正在不断改变其搜索结果页面的格式。即使的页面看起来相同,内部结构也可能大不相同。你会发现,你为抓取今天的搜索结果页面而写的代码可能会在下个月坏掉。我通过艰苦的方式学会了这一点。