我正在尝试通过Python上的纽约时报API(关于恐怖袭击的文章)创建一个文本文档的语料库。
我知道NYP API不提供全文文本,但提供了我可以从中抓取文章的URL。因此,我们的想法是从API中提取"web_url"参数,从而抓取全文。
我正在尝试使用Python上的NYT API库:
from nytimesarticle import articleAPI
api = articleAPI("*Your Key*")
articles = api.search( q = 'terrorist attack')
print(articles['response'],['docs'],['web_url'])
但是我不能提取"web_url"或文章。我得到的是这样的输出:
{'meta': {'time': 19, 'offset': 10, 'hits': 0}, 'docs': []} ['docs'] ['web_url']
似乎nytimesarticle
模块本身存在问题。例如:
>>> articles = api.search(q="trump+women+accuse", begin_date=20161001)
>>> print(articles)
{'response': {'docs': [], 'meta': {'offset': 0, 'hits': 0, 'time': 21}}, 'status': 'OK', 'copyright': 'Copyright (c) 2013 The New York Times Company. All Rights Reserved.'}
但是,如果我使用requests
(如在模块中使用)直接访问API,我得到我正在寻找的结果:
>>> import requests
>>> r = requests.get("http://api.nytimes.com/svc/search/v2/articlesearch.json?q=trump+women+accuse&begin_date=20161001&api-key=XXXXX")
>>> data = r.json()
>>> len(data["response"]["docs"])
10
表示返回了10篇文章(data
的完整值为16kb,因此我不会在这里全部包含)。对比api.search()
的响应,其中articles["response"]["docs"]
是一个空列表。
nytimesarticle.py
只有115行长,所以调试起来非常简单。打印发送到API的URL的值显示如下:
>>> articles = api.search(q="trump+women+accuse", begin_date=20161001)
https://api.nytimes.com/svc/search/v2/articlesearch.json?q=b'trump+women+accuse'&begin_date=20161001&api-key=XXXXX
# ^^ THIS
违规代码将每个字符串参数编码为UTF-8,这使其成为bytes
对象。这是不必要的,并且会破坏如上所示构建的URL。幸运的是,有一个拉请求修复了这个问题:
>>> articles = api.search(q="trump+women+accuse", begin_date=20161001)
http://api.nytimes.com/svc/search/v2/articlesearch.json?begin_date=20161001&q=trump+women+accuse&api-key=XXXXX
>>> len(articles["response"]["docs"])
10
这也允许使用其他字符串参数,如sort="newest"
,因为字节格式化之前会导致错误。
print语句中的逗号将打印的内容分开。
你会想要这样的东西
articles['response']['docs']['web_url']
但是'docs': []
既是一个数组又是空的,所以上面的行不起作用,所以你可以尝试
articles = articles['response']['docs']
for article in articles:
print(article['web_url'])