【问题标题】:How do I submit a Stack Exchange API query that returns the same results as the basic Stack Overflow search?如何提交返回与基本 Stack Overflow 搜索相同结果的 Stack Exchange API 查询?
【发布时间】:2023-01-21 12:10:17
【问题描述】:

我目前正在从事一个项目,目标是确定 gis.stackexchange 上各种主题的受欢迎程度。我正在使用 Python 与堆栈交换 API 进行交互。我的问题是我无法配置 API 查询以匹配使用搜索栏的基本搜索将返回的内容(显示包含术语 (x) 的帖子)。我目前正在使用 /search/advanced... q="term" 方法,但是对于可能有大约 100-200 个帖子的搜索词,我得到的结果是空的。我已经阅读了很多 API 文档,但似乎无法配置 API 查询以匹配站点搜索的结果。

编辑:例如,如果我搜索“Bayesian”,我在 gis.stackexchange 上得到 42 个结果,但是当我在 API 请求中设置 q=Bayesian 时,我得到一个空的返回值。

如果有帮助,我已经在下面包含了我的程序。谢谢!

#Interfacing_with_SO_API
import requests as rq
import json
import time

keywordinput = input('Enter your search term. If two words seperate by - : ')


baseurl = ('https://api.stackexchange.com/2.3/search/advanced?page=')

endurl = ('&pagesize=100&order=desc&sort=votes&q=' + keywordinput + '&site=gis.stackexchange&filter=!-nt6H9O0imT9xRAnV1gwrp1ZOq7FBaU7CRaGpVkODaQgDIfSY8tJXb')



urltot = ('https://api.stackexchange.com/2.3/search/advanced?page=1&pagesize=100&order=desc&sort=votes&q=' + keywordinput + '&site=gis.stackexchange&filter=!-nt6H9O0imT9xRAnV1gwrp1ZOq7FBaU7CRaGpVkODaQgDIfSY8tJXb')
response = rq.get(urltot)

page = range(1,400)

if response.status_code == 400:
    print('Initial Response Code 400: Stopping')
    exit()
elif response.status_code == 200:
    print('Initial Response Code 200: Continuing')

datarr = []
for n in page:
    response = rq.get(baseurl + str(n) + endurl)
    print(baseurl + str(n) + endurl)
    time.sleep(2)
    if response.status_code == 400 or response.json()['has_more'] == False or n >400:
        print('No more pages')
        break
    elif response.json()['has_more'] == True:
        for data in response.json()['items']:
            if data['view_count'] >= 0:
                datarr.append(data)
                print(data['view_count'])
                print(data['answer_count'])
                print(data['score'])

#convert datarr to csv and save to file
with open(input('Search Term Name (filename): ') + '.csv', 'w') as f:
    for data in datarr:
        f.write(str(data['view_count']) + ',' + str(data['answer_count']) + ','+ str(data['score']) + '\n')
exit()

【问题讨论】:

  • 您能否举一个查询关键字未返回您期望的示例?

标签: python stackexchange-api


【解决方案1】:

如果您在 GIS StackExchange 站点上查看搜索 bayesian 的结果,您将获得 42 个结果,因为 StackExchange 站点搜索返回包含该术语的问题和答案。

然而,标准/search and /search/advanced API endpoints only search questions,根据文档(强调我的):

在网站上搜索任何问题符合给定标准

讨论

在站点中搜索符合给定条件的任何问题。

相反,您想要使用的是 /search/excerpts 端点,它将返回问题和答案。

shell 中的快速演示显示它返回相同数量的项目:

curl -s --compressed "https://api.stackexchange.com/2.3/search/excerpts?page=1&pagesize=100&site=gis&q=bayesian" | jq '.["items"] | length'

42

还有一个最小的 Python 程序来做同样的事情:

#!/usr/bin/env python3

# file: test_so_search.py

import requests

if __name__ == "__main__":
    api_url = "https://api.stackexchange.com/2.3/search/excerpts"

    search_term = "bayesian"
    qs = {
        "page": 1,
        "pagesize": 100,
        "order": "desc",
        "sort": "votes",
        "site": "gis",
        "q": search_term
    }

    rsp = requests.get(api_url, qs)

    data = rsp.json()

    print(f"Got {len(data['items'])} results for '{search_term}'")

并输出:

> python test_so_search.py
Got 42 results for 'bayesian'

【讨论】:

  • 感谢您的答复。不幸的是,/search/excerpts 中的项目似乎没有返回 view_count 项目。我需要那个项目,所以我不确定我将如何解决这个问题。
  • @JayRad 如果您想要问题查看计数,您可以提取所有摘录,然后使用Questions API 并传入问题 ID(一次最多 100 个)以获得完整填充的问题数据。您可以区分问题和答案,因为答案有 answer_id 字段,但问题没有。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
  • 2011-03-10
  • 1970-01-01
  • 1970-01-01
  • 2021-02-14
  • 1970-01-01
相关资源
最近更新 更多