我目前正在做一个项目,目标是确定各种话题在gis.stackchange上的受欢迎程度.我正在使用Python与堆栈交换API进行交互.我的问题是,我在配置API查询以匹配使用搜索栏的基本搜索将返回的内容(显示包含术语(X)的帖子)时遇到了问题.我目前正在使用/搜索/高级...Q="Term"方法,然而,对于可能有大约100-200篇帖子的搜索词,我得到的结果是空的.我已经阅读了很多API文档,但似乎无法配置API查询来匹配站点搜索所产生的结果.

编辑:例如,如果我搜索"Bayesian",我在gis.stackchange上会得到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()

推荐答案

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

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

搜索符合给定条件的any 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'

Python相关问答推荐

使用regex分析具有特定字符的字符串(如果它们存在)

如果索引不存在,pandas系列将通过索引获取值,并填充值

根据给定日期的状态过滤查询集

三个给定的坐标可以是矩形的点吗

线性模型PanelOLS和statmodels OLS之间的区别

大Pandas 胚胎中产生组合

海运图:调整行和列标签

将输入管道传输到正在运行的Python脚本中

Polars:用氨纶的其他部分替换氨纶的部分

将9个3x3矩阵按特定顺序排列成9x9矩阵

Pandas DataFrame中行之间的差异

计算每个IP的平均值

python中字符串的条件替换

如何在图中标记平均点?

多处理队列在与Forking http.server一起使用时随机跳过项目

合并与拼接并举

基于另一列的GROUP-BY聚合将列添加到Polars LazyFrame

Discord.py -

一个telegram 机器人应该发送一个测验如何做?""

Regex用于匹配Python中逗号分隔的AWS区域