制作一个脚本,每天打一次Google并记录我们的SERP位置?

时间:2011-01-14 09:37:40

标签: .net serp

我们组织内部需要监控(每天)我们网站在Google第1页上显示的位置(有机和PPC)。也是关键竞争者出现的地方。对于某些关键词。

在短期内,一位同事通过手动点击Google并记下结果来做到这一点。是的。

我们可以编写脚本(例如使用C#)来执行此操作。

我知道Google Analytics会告诉我们很多,但它没有注意到竞争对手的位置,而且我认为它没有我们想要的其他数据。

问题是,是否存在这样做的基本工具(我猜是免费的)?如果我们自己编写,从哪里开始并且有明显的缺陷需要避免(例如Google可以检测并阻止自动请求吗?)

修改 对于那些建议使用Google API的答案 - Google Groups上的帖子似乎完全排除了这一点:

  
      
  1. 自定义搜索API要求您设置自定义搜索引擎(CSE)   必须设置为特定搜索   网站而不是整个网站。

  2.   
  3. Custom Search API TOS明确禁止您制作   自动查询,这将是关键   “定期和准确地”   测量站点的SERP。

  4.         

    Jeremy R. Geerdes

5 个答案:

答案 0 :(得分:2)

您可以使用Html Agility Pack开发一个简单的C#程序。它是一个非常好的开源库来操作HTML,它非常容易使用。

关于google阻止自动请求,如果您每天只检查一次,并且没有很多关键字需要检查,我认为您没有任何问题。

答案 1 :(得分:2)

或许查看Google搜索API可能会提示您如何直接访问搜索?

我自己没有尝试过,但它也可能是一个解决方案..请参阅search API

答案 2 :(得分:2)

您是否考虑使用Google Webmaster Tools中的统计信息?

他们会针对特定搜索词组以及其他有用功能提供有关您网站排名的详细报告。

不可否认,这些报告并未提供您的竞争对手的位置,因此使用Google Search API将是获取所需数据的最佳方式。

答案 3 :(得分:1)

Google实际上没有“人”交互的prohibit scraping搜索结果(参见5.3和here)。我不是在鼓吹你这样做。他们所关注的问题是,有太多人这样做可能会导致问题(你会寻找多少搜索条件?),以及可能会对排名本身进行游戏。

话虽如此,您可以使用API​​来执行搜索结果并使用html结果迭代结果,如下所示。或者,您可以尝试一些可用的服务来帮助您实现此目的:

http://www.googlerankings.com/

(注意:我与这个网站没有任何关系,这只是一个例子。)

我相信有很多SEO公司也会提供这项服务。我会建议在进行刮擦之前探索这些选项。

我继续推进了一个快速的CS课程,该课程将从Google搜索结果中提取基本信息。这个类使用上面提到的HTML Agility Pack,这是Microsoft为迭代网页而创建的一个非常漂亮的工具,允许您使用XPath在页面中查找您要查找的内容。在这种情况下,“// span // cite”会为您提供网址,因此本示例使用该网址。

要使用,请执行以下操作:

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();
    }

}

答案 4 :(得分:0)

如果您有Mac,那么您可以使用假。这太不可思议了 http://fakeapp.com/

如果你只有窗户,那我就自己写吧。最好的方法是编写jQuery来抓取你想要的东西。使用jQuery完成它不需要30分钟。您可以针对您的页面运行计划任务,并且您将获得所需的解决方案。