AppEngine Python urlfetch()失败,出现416错误,在浏览器中相同的查询成功



我正在清理几个月前运行的一个应用程序。我没有做任何改变。这是有问题的代码:

result = urlfetch.fetch(
url=url,
deadline=TWENTY_SECONDS)
if result.status_code != 200:  # pragma: no cover
logging.error('urlfetch failed.')
logging.error('result.status_code = %s' % result.status_code)
logging.error('url =')
logging.error(url)

这是输出:

WARNING  2015-04-20 01:13:46,473 urlfetch_stub.py:118] No ssl package found. urlfetch will not be able to validate SSL certificates.
ERROR    2015-04-20 01:13:46,932 adminhandlers.py:84] urlfetch failed. url =
ERROR    2015-04-20 01:13:46,933 adminhandlers.py:85] http://www.stubhub.com/listingCatalog/select/?q=%2Bevent_date%3A%5BNOW%20TO%20NOW%2B1DAY%5D%0D%0A%2BancestorGeoDescriptions:%22New%20York%20Metro%22%0D%0A%2BstubhubDocumentType%3Aevent&version=2.2&start=0&rows=1&wt=json&fl=name_primary+event_date_time_local+venue_name+act_primary+ancestorGenreDescriptions+description

当我使用不同的url时,例如,"http://www.google.com/",获取成功。

当我把输出的url字符串粘贴到Chrome时,我会得到这个响应,这就是我要找的:

{"responseHeader":{"status":0,"QTime":19,"params":{"fl":"name_primary event_date_time_local venue_name act_primary ancestorGenreDescriptions description","start":"0","q":"+event_date:[NOW TO NOW+1DAY]rn+ancestorGeoDescriptions:"New York Metro"rn+stubhubDocumentType:event +allowedViewingDomain:stubhub.com","wt":"json","version":"2.2","rows":"1"}},"response":{"numFound":26,"start":0,"docs":[{"act_primary":"Waka Flocka Flame","description":"Waka Flocka Flame Tickets (18+ Event)","event_date_time_local":"2015-04-20T20:00:00Z","name_primary":"Webster Hall","venue_name":"Webster Hall","ancestorGenreDescriptions":["All tickets","Concert tickets","Artists T - Z","Waka Flocka Flame Tickets"]}]}}

我希望我错过了一些简单的东西。有什么建议吗?


2015年5月30日更新

安泽尔4月23日的建议是正确的。我需要添加一个用户代理标头。AppEngine开发服务器提供的是

AppEngine-Google; (+http://code.google.com/appengine)

托管AppEngine提供的是

AppEngine-Google; (+http://code.google.com/appengine; appid: s~MY_APP_ID)

在MacOS上由纯Python(没有AppEngine)中的requests.get()提供的是

python-requests/2.2.1 CPython/2.7.6 Darwin/14.3.0

当我在Chrome用户代理头中切换时,纯Python中一切都很好。自从我上次尝试以来,Stubhub一定已经改变了这一点。我很好奇他们会要求为发出JSON的服务提供交互式用户代理,但我很高兴他们提供了这项服务。

不过,当我在AppEngine中添加该标头时,AppEngine会将其准备到自己的用户代理标头中。Stubhub随后拒绝了请求。

所以我已经取得了一些进展,但还没有解决我的问题。

FYI:

在AppEngine中,我提供这样的用户代理:

result = urlfetch.fetch(
url=url,
headers = {'user-agent': USER_AGENT_STRING}
)

这是一个有用的网站,用于确定您的代码或浏览器正在发送的用户代理字符串:

http://myhttp.info/

我还没有发表评论的权限,所以开始吧。

查看您将URL输入var"URL"的方式。它是否已经按照错误消息所说的进行了编码?我会尝试确保url是一个常规的、未编码的url,并测试它,也许库正在重新编码它,从而导致问题。如果你能给我们更多的周边代码,这可能有助于我们的诊断。

相关内容

最新更新