【问题标题】:Inconsistent search results using Google's Custom Search JSON API使用 Google 的自定义搜索 JSON API 的搜索结果不一致
【发布时间】:2020-12-14 20:17:05
【问题描述】:

我们正在使用 Google 的自定义搜索 JSON API 进行高等教育研究,我们实质上是在解析大量 URL 以查找有关各种组织对 COVID-19 的响应的信息。我们正在使用 Google 的 API 来查找热门搜索结果。但是,我们发现在 API 查询中使用不同的搜索参数时会出现不一致的结果。不一致是一个问题,因为我们正试图将查询磨练到一定的错误率(错误率是有多少 URL 提供了有效的研究信息)。我们正在寻找帮助解释 Google 的 API 工作原理的人,因为文档非常少。 我们的基本查询示例: 'https://www.googleapis.com/customsearch/v1?key=KEY&cx=SEARCHENGINE&q="学校名称" intext:(term1 | term2 | term3) -inurl:(unwanted1 | Wanted2 | Wanted3) inurl:(想要1 | 想要2 | 想要3)&start=1'

其中“学校名称”是高等教育机构的名称。 term1、term2 等,是我们要在搜索结果的正文中查找的具体变量。 intext 参数有助于避免某些文档中出现不可见的文本。例如,insidehighered.com 以隐形文本包含许多高等教育机构,但实际文章不适用。不需要的 1 等。是我们不希望包含在 URL 标题中的单词或短语。例如,我们要避免使用 PDF 文档,因此可以是“.pdf”。通缉1等。是我们希望在 URL 中出现的字词,例如“新闻”。我们使用“|”表示“或”,这使我们可以将一个查询用于多种类型的搜索,从而有助于最大限度地降低 API 使用成本。

到目前为止,我们发现了以下问题/不一致:

  1. "-" 和 "NOT" 否定词返回不同的结果。
  2. 参数的顺序很重要。例如,“inurl:(一些想要的搜索词)-inurl:(一些不需要的搜索词)”返回的结果与“-inurl:(一些不需要的搜索词)inurl:(一些想要的搜索词)”不同。
  3. 术语的嵌套也不一致。例如,“inurl:( (需要的术语 | 需要的术语) NOT(不需要的术语 | 不需要的术语))”返回的结果与“inurl:(需要的术语 | 需要的术语| NOT不需要的术语不是不需要的术语)”不同。
  4. 此外,API 有时会在两次不同时间使用相同的精确查询对某些查询返回不同的结果。查询似乎将返回 10 个结果,但会自发地混合来自下一页或其他地方的最后 1 或 2 个结果。例如,此查询:“https://www.googleapis.com/customsearch/v1?key=KEY&cx=SEARCHENGINE&q="Miami University-Hamilton" intext:(减少学费 | 冻结学费 | 减少学费 | 降低学费) inurl: (新闻|公告|文章|故事)-inurl:(注册商|招生|学费和费用|学费时间表|时间表|状态|办公室|就业机会|关于我们|关于|linkedin|事件|.uk|国税局 | .gov | 信息技术 | * | 维基 | 员工手册 | 学生手册 | 商店 | 年度 | youtube | pinterest | 商店 | 职位空缺 | 确实 | 亚马逊 | 联系 | 工作板 | 工作板 | 政策 | 常见问题-问题 | 常见问题 | 表格 | 小时 | 学术日历 | 日历 | 目录 | glassdoor | facebook | 百科全书)&start=31"(然后 start=41 进入下一页)将返回 "http://www.harbison.one /archive/z_1985_national_cc_directory.pdf”作为第 4 页的最后一项和第 5 页的第 1 项。当我们运行 GET 请求时,它有时会为第 4 页的最后一项返回不同的结果,但随后会为两个页面返回相同的重复 URL。

我们用于从每个页面中提取项目的代码是:

response = requests.get(query)
content = response.json()
hrefs = []

try:
    for i in content['items'][0:num]:
        hrefs.append(i['link'].lower())
  

except Exception as e:
    print(str(e))
    hrefs.append('a')


谢谢!

【问题讨论】:

  • 您是否尝试过使用一组较小的查询参数(即仅 q 参数)调用 API?我想知道是否可以合理地说,如果即使使用最少的参数仍然存在不一致,那么它们可能不是由使用 NLP 技术引起的(正如@katzenklavier 所提到的),而是由最近的新索引资源。相反,如果没有发现不一致,那么查询中使用了太多的参数可能是问题的原因。
  • @Labaguette 好点。当我们运行我们的程序时,我们只使用“q”参数来运行它——这产生了一致的结果。具有多个参数的策略减少了 90% 的必要搜索,但就像我们正在谈论的那样,它是不一致的。

标签: python google-api google-custom-search


【解决方案1】:

恐怕您很难找到满足您正在寻找的标准的这个问题的答案。

Google 为保护其商业机密(除其他外),对其搜索引擎算法的内部结构极为保密。 What we do know, from official sources, is the following:

  • Google 广泛使用自然语言处理 (NLP) 并将竭尽全力尝试梳理您查询的意图,即使这意味着忽略您实际搜索的内容;
  • 它喜欢包含您正在搜索的关键字的网页,但它也有复杂的保护措施来防止“关键字堆砌”,即有人在他们的网页中添加大量可能的搜索条件以试图吸引额外的流量对自己;
  • 它维护一个它信任的页面的内部列表,如果这些页面链接到内容(或者如果这些页面链接到链接到内容的页面,等等),它会对该内容进行更高的排名;
  • 它根据一组可用性标准对页面进行评分,并且不喜欢慢速页面和未针对不同设备进行优化的页面;
  • 最后,它会使用您的位置和过去的搜索历史来确定为您提供什么样的结果。

这里的第一点可能是最重要的。使用 API 进行搜索可能不会给予您的搜索任何特殊待遇,这对于 API 行为来说是不寻常的,但对于 Google 来说是意料之中的。为了用户体验,谷歌很乐意改变自己的规则,我强烈怀疑你的搜索最终会成为这种行为的受害者。此外,考虑到环境以及他们已经将涉及 COVID-19 搜索的特殊内容直接硬编码到引擎的行为中,这可能会使事情变得更加复杂。

我希望我有更好的消息告诉你,但你可能只需要让搜索引擎向你吐出的任何奇怪和不一致的东西都起作用。结果几乎肯定是不可重现的,并且由于上面列出的第五点,它们以后甚至可能无法由您自己重现。对不起。

【讨论】: