我正试图从“纽约时报”档案搜索NLP任务中搜索文章的全文(在此处搜索:http://query.nytimes.com/search/sitesearch/)。我可以合法访问所有文章,如果我手动搜索档案,我可以查看它们。
但是,当我使用urllib2,机械化或请求从搜索结果页面中提取HTML时,他们不会拉动代码的相关部分(指向文章的链接,点击次数),这样我就可以抓住文章。我没有收到错误消息,在inspect元素中清晰可见的相关部分在拉出的HTML中根本就丢失了。
由于某些文章只能由订阅者访问,因此我发现这可能是问题,我通过Mechanize提供了我的用户凭据请求,但这对拉动的代码没有任何影响。
有一个NYT API,但它不能访问文章的全文,所以对我来说这对我来说没用。
我认为NYT故意将页面刮得很难,但我有合法权利查看所有这些文章,所以我们将非常感谢任何有助于我解决他们所提出的障碍的策略方面的帮助。我是网络新手,我不知道从哪里开始解决这个问题。
我尝试使用以下所有内容拉取HTML,并且每次都得到相同的不完整结果:
url = 'http://query.nytimes.com/search/sitesearch/#/India+%22united+states%22/from19810101to20150228/allresults/1/allauthors/relevance/Opinion/'
#trying urllib
import urllib
opener = urllib.FancyURLopener()
print opener.open(url).read()
#trying urllib2
import urllib2
request = urllib2.Request(url)
response = urllib2.urlopen(request)
print response.read()
#trying requests
import requests
print requests.get(url).text
#trying mechanize (impersonating browser)
import mechanize
import cookielib
br = mechanize.Browser()
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)
br.set_handle_equiv(True)
br.set_handle_gzip(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
r = br.open(url)
print r.read()
答案 0 :(得分:1)
为什么不使用像Scrapy这样的框架?这将为您提供大量的电源。例如,您将能够检索您感兴趣的页面的那些部分并丢弃其余部分。我在这里写了一个处理Scrapy和ajax页面的小例子:http://www.6020peaks.com/2014/12/how-to-scrape-hidden-web-data-with-python/ 也许它可以帮助您了解Scrapy的工作原理。
答案 1 :(得分:0)
您可以尝试使用像kimonolabs.com这样的工具来抓取文章。如果您在使用身份验证时遇到问题,那么和服就有一个内置框架,允许您输入和存储您的凭据,因此这可能有助于您在NYT API的其他方面受到限制。我使用和服制作了这个NYT API,如果你制作一个和服帐户,你可以克隆和使用:https://www.kimonolabs.com/apis/c8i366xe
以下是有关如何在登录后制作API的帮助中心文章:https://help.kimonolabs.com/hc/en-us/articles/203275010-Fetch-data-from-behind-a-log-in-auth-API-
本文将向您介绍如何浏览链接以获取详细的页面信息:https://help.kimonolabs.com/hc/en-us/articles/203438300-Source-URLs-to-crawl-from-another-kimono-API