使用 Google 的自定义搜索 JSON API 的搜索结果不一致

nxl*_*l10 5 python google-api google-custom-search

我们正在使用 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 |不需要的2 |不需要的3) inurl:(wanted1 | Wanted2 | 想要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:(想要的术语|想要的术语|不是不需要的术语不是不需要的术语)”返回的结果不同
  4. 此外,API 有时会在两次不同时间使用相同的确切查询对某些查询返回不同的结果。查询似乎会返回 10 个结果,但会自发地混入下一页或其他地方的最后 1 或 2 个结果。例如,这个查询:"https://www.googleapis.com/customsearch/v1?key=KEY&cx=SEARCHENGINE&q="Miami University-Hamilton" intext:(减少学费|冻结学费|减少学费|降低学费) inurl: (新闻 | 公告 | 文章 | 故事) -inurl:(注册商 | 招生 | 学费和费用 | 学费表 | 日程 | 州 | 办公室 | 就业机会 | 关于我们 | 关于 |linkedin | 事件 | .uk |税务局 | 。政府| 信息技术| 维基百科 | 维基 | 员工手册| 学生手册| 店铺 | 年度| 优酷 | 个人兴趣 | 商店| 开口| 确实| 亚马逊 | 联系 | 工作板| 工作板| 政策 | 常见问题 | 常见问题 | 表格 | 小时 | 学术日历| 日历 | 目录 | 玻璃门| 脸书 | encyclopedia)&start=31”(然后下一页的start=41)将返回“http://www.harbison.one/archive/z_1985_national_cc_directory.pdf”作为第4页的最后一项和第1项在第 5 页。当我们运行 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')


Run Code Online (Sandbox Code Playgroud)

谢谢!

kat*_*ier 4

恐怕您不太可能找到满足您正在寻找的标准的这个问题的答案。

为了保护其商业秘密(除其他外),谷歌对其搜索引擎算法的内部结构极为保密。我们从官方渠道了解到的信息如下

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

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

我希望我有更好的消息给你,但你可能不得不在你的工作中做出搜索引擎吐出的任何奇怪和不一致的东西。结果几乎肯定是不可重现的,并且由于上面列出的第五点,它们甚至可能无法由您自己重现。对不起。