我正在尝试使用邮政编码获取当地电影院的放映时间。我之前在Windows窗体应用程序中通过使用htmlagilitypack抓取HTML来完成此操作。
我现在正在为孩子们和我自己开发一个应用程序,我知道刮掉时装时间是谷歌不赞成的,他们可能会阻止你的IP(在测试期间这实际上发生在我身上)。
刮擦页面不再可行,因为我没有很好的方法用分隔符提取数据
我已经转移到了一个Windows应用商店和谷歌自定义搜索API。我对此的问题如下所示,
Google.com // parm Cinema Listings BT48 //返回请输入showtime的有效位置
const string apiKey = "removed";
const string searchEngineId = "removed";
const string search = "cinema listing near bt48";
Google.Apis.Customsearch.v1.CustomsearchService svc = new Google.Apis.Customsearch.v1.CustomsearchService(new Google.Apis.Services.BaseClientService.Initializer() { ApiKey = apiKey});
Google.Apis.Customsearch.v1.CseResource.ListRequest listRequest = svc.Cse.List(search);
listRequest.Cx = searchEngineId;
Google.Apis.Customsearch.v1.Data.Search gSearch = listRequest.Execute();
//Google.Apis.Customsearch.v1.Data.Result
foreach(Google.Apis.Customsearch.v1.Data.Result result in gSearch.Items)
{
var p = 0;
}
有谁知道我如何传递参数来获得结果,或者我是否能以正确的方式解决这个问题?
**已解决** 因此,在阅读谷歌文档后,我可以看到,如果没有每年支付100美元的功能,我无法获取页面信息。
由于我是一个糟糕的软件开发人员,我找到了一种方法来刮擦页面。
如果你阅读这篇文章可能你也面临同样的问题即时分享我的解决方案。 :)
private async void GetShowtimes() {
// Load string
HtmlWeb web = new HtmlWeb();
HtmlDocument htmldocument = await web.LoadFromWebAsync("http://google.com/movies?near=bt48");
// Get theater collection
var theaterCollection = htmldocument.DocumentNode.DescendantNodes().Where(x => x.GetAttributeValue("class","") == "theater").ToList();
// Loop each theater and extact theater details and showing movie details
foreach (HtmlNode theater in theaterCollection )
{
string theaterName = theater.ChildNodes[0].ChildNodes[0].InnerText;
string theaterAddress = theater.ChildNodes[0].ChildNodes[1].InnerText;
HtmlDocument htmldocument2 = new HtmlDocument();
htmldocument2.LoadHtml(theater.InnerHtml);
var movieNodes = htmldocument2.DocumentNode.DescendantNodes().Where(x => x.GetAttributeValue("class", "") == "movie").ToList();
foreach (HtmlNode movie in movieNodes)
{
string name = movie.ChildNodes[0].InnerText ;
string info = movie.ChildNodes[1].InnerText;
string times = movie.ChildNodes[2].InnerText.Replace(" ","");
times = times.Replace("<!-- -->", "");
// Do something with your movies here
}
}
}