我对 Python 还很陌生,我正在尝试运行一段代码来检查《卫报》报纸中提及某个关键字的文章数量。
这是我已经在《纽约时报》上做过的事情,但是当我尝试将相同的代码应用于《卫报》时,它说第 8 行(下面的行)失败了:
hits = json_res["response"]["meta"]["hits"]
这是我遇到问题的整段代码(我之前已经定义了guardian_api_key):
#Checking number of articles on a topic in The Guardian
import requests
def number_of_articles(api_key,keyword,begin_date="19800101",end_date="20240101"):
url_query = f"http://content.guardianapis.com/#/search?q={keyword}&begin_date={begin_date}&end_date={end_date}&api-key={api_key}"
print (url_query)
res = requests.get(url_query)
json_res = res.json()
hits = json_res["response"]["meta"]["hits"]
return hits
print(number_of_articles(api_key=guardian_api_key,keyword="vote"))
我很想得到一些帮助,以便我能了解发生了什么事!如果我的问题不清楚或者我可以尝试什么,请告诉我。
您的 Gurdians URL 中有拼写错误,请将其更改为
f"http://content.guardianapis.com/#/search?
到
f"https://content.guardianapis.com/search?
与《泰晤士报》相反,搜索找到的文章数量存储在
res["response"]["total"]
如果您愿意接受建议,我会更加模块化地编写您的代码,从而允许您向系统添加更多 API。
import requests
class BaseParser:
def __init__(self, key):
self.key = key
self.base_url= ""
def query(self, params: dict) -> dict:
query = self.base_url
for key,val in params.items():
query += f"&{key}={val}"
return requests.get(query).json()
class GuardianParser(BaseParser):
def __init__(self, key):
super().__init__(key)
self.base_url= f"https://content.guardianapis.com/search?api-key={self.key}"
def number_of_articles(self, params: dict) -> int:
res = self.query(params)
return len(res["response"]["total"])
class TimesParser(BaseParser):
def __init__(self, key):
super().__init__(key)
self.base_url= f"the api url from the times"
def number_of_articles(self, params: dict):
res = self.query(params)
return res["response"]["meta"]["hits"]
search_dict = {
"keyword":"vote",
"begin_date":19800101,
"end_date":20240101
}
gparser = GuardianParser(gkey)
gart = gparser.number_of_articles(search_dict)
tparser = TimesParser(tkey)
tart = gparser.number_of_articles(search_dict)
print(f"Guardian number of articles: {gart}")
print(f"The Times number of articles: {tart}")
此外,我还会添加一些错误处理(例如 API 密钥过期、请求错误、API 无法访问等)。不过,这超出了问题的范围。