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

StackOverflow https://stackoverflow.com/questions/4689671

  •  11-10-2019
  •  | 
  •  

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

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

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

我知道分析会告诉我们很多信息,但它没有指出竞争对手的位置,而且我认为它没有我们想要的其他数据。

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

编辑:对于那些建议使用 Google API 的答案 - 这篇文章位于 谷歌网上论坛 似乎完全排除了这一点:

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

  2. 自定义搜索API TOS明确禁止您进行自动查询,这是“定期,准确”测量站点SERP的关键。

杰里米·R。格尔德斯

有帮助吗?

解决方案

谷歌确实做到了 禁止刮擦 没有“人”交互的搜索结果(参见 5.3 和 这里)。我并不是提倡你这样做。他们表示担心的是,太多人这样做可能会导致问题(您会寻找多少个搜索词?),并且可能会影响排名本身。

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

http://www.googlerankings.com/

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

我确信有很多 SEO 公司也会提供此服务。我建议在开始抓取之前探索这些选项。

我继续组织了一个快速的计算机科学课程,该课程将从谷歌搜索结果中提取基本信息。此类使用前面提到的 HTML Agility Pack,这是 Microsoft 创建的一个非常漂亮的工具,用于迭代网页,允许您使用 XPath 来查找页面中要查找的内容。在本例中,“//span//cite”为您提供 URL,因此本示例使用该 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();
    }

}

其他提示

您可以使用一个简单的C#程序使用 HTML敏捷包. 。这是一个非常好的开源库来操纵HTML,并且非常易于使用。

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

也许查看Google搜索API可能会给您暗示如何直接访问搜索?

我自己没有尝试过,但也可能是解决方案。 搜索API.

您是否考虑使用来自 Google网站管理员工具?

他们提供有关给定搜索短语的网站排名的详细报告,以及其他有用的功能。

诚然,这些报告无法提供您的竞争对手职位,因此使用Google搜索API将是获取所需数据的最佳方法。

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

如果您只有窗户,我会自己写。最好的方法是编写jQuery来抢夺您想要的东西。使用jQuery不需要30分钟。您可以在页面上运行计划的任务,您将拥有所需的解决方案。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top