Google фактически запрещает очищать своих результатов поиска без "человеческого" взаимодействия (см. 5.3, и здесь ). Я не защищаю тебя. Они утверждают, что из-за того, что слишком много людей занимаются этим, могут возникнуть проблемы (сколько поисковых терминов вы бы искали?), А также, возможно, игровые рейтинги сами.
Сказав это, вы, возможно, могли бы использовать API, чтобы сделать результат поиска и перебрать результаты, как я указал ниже, используя результат html. Или вы можете воспользоваться некоторыми услугами, которые помогут вам сделать это:
http://www.googlerankings.com/
(Примечание: я никоим образом не связан с этим сайтом, это только пример.)
Я уверен, что есть много SEO-компаний, которые также предоставляют эту услугу. Я бы порекомендовал изучить эти варианты, прежде чем приступить к поиску.
Я собрал быстрый класс CS, который извлек бы основную информацию из результатов поиска Google. В этом классе используется упомянутый HTML Agility Pack, довольно изящный инструмент, созданный Microsoft для итерации по веб-страницам, который позволяет использовать XPath для поиска того, что вы ищете на странице. В этом случае "// span // cite" дает вам URL, поэтому в этом примере используется.
Чтобы использовать, сделайте следующее:
GoogleRankScrape.Do(
"google scraping",
"C:\\rankings\\",
"//span//cite",
new string[] {"stackoverflow.com","wikipedia.org","okeydoke.org"},
100
);
Это можно поместить в консольное приложение CS, а затем использовать планировщик Windows для запуска консольного приложения. Есть много других способов, которыми это могло бы пойти; это только пример.
Код GoogleRankScrape следующий:
using System;
using System.IO;
using System.Text;
using HtmlAgilityPack;
class GoogleRankScrape
{
public static void Do(string query, string dest, string path, string[] matches, int depth)
{
Directory.SetCurrentDirectory(@dest);
string url = "http://www.google.com/search?q=" + query + "&num=" + depth;
string rp = "rankings.txt";
DateTime dt = DateTime.Now;
string dtf = String.Format("{0:u}", dt);
string dtfr = String.Format("{0:f}", dt);
dtf = dtf.Replace("-", "");
dtf = dtf.Replace(" ", "");
dtf = dtf.Replace(":", "");
string wp = "page" + dtf + ".html";
string op = "output" + dtf + ".txt";
FileInfo r = new FileInfo(rp);
if (!File.Exists("rankings.txt"))
{
StreamWriter rsw = r.CreateText();
rsw.Close();
}
StreamWriter rs = new StreamWriter(r.Name, true);
rs.WriteLine("Date: " + dtfr);
rs.WriteLine("Date: " + dtf);
rs.WriteLine("Depth: " + depth);
rs.WriteLine("Query: " + query);
HtmlWeb hw = new HtmlWeb();
HtmlDocument d = hw.Load(url);
d.Save(wp);
FileInfo o = new FileInfo(op);
StreamWriter os = o.CreateText();
HtmlDocument HD = new HtmlDocument();
HD.Load(wp);
string check = "";
string checkblock = "";
var SpanCite = HD.DocumentNode.SelectNodes(path);
if (SpanCite != null)
{
int rank = 1;
foreach (HtmlNode HN in SpanCite)
{
String line = "";
if (HN.InnerText.ToString().IndexOf("/") > 0)
{
line = HN.InnerText.ToString().Substring(0, HN.InnerText.ToString().IndexOf("/"));
}
else if (HN.InnerText.ToString().IndexOf(" ") > 0)
{
line = HN.InnerText.ToString().Substring(0, HN.InnerText.ToString().IndexOf(" "));
}
else
{
line = HN.InnerText.ToString();
}
os.WriteLine(line);
os.WriteLine(rs.NewLine);
for (int i = 0; i < matches.Length; i++)
{
checkblock = "[" + matches[i] + "]";
if (line.Contains(matches[i]) && !check.Contains(matches[i]))
{
rs.WriteLine("Rank: " + rank.ToString() + ", " + matches[i]);
check += checkblock;
}
}
rank++;
}
for (int i = 0; i < matches.Length; i++)
{
checkblock = "[" + matches[i] + "]";
if (!check.Contains(matches[i]))
{
rs.WriteLine("Rank: not ranked" + ", " + matches[i]);
}
}
}
os.Close();
rs.WriteLine("==========");
rs.Close();
}
}