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

时间:2015-04-20 01:46:08

标签: python google-app-engine urlfetch

几个月前我正在推出一款可以使用的应用程序。我没有做任何改变。这是有问题的代码:

    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

当我使用其他网址时,例如“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]\r\n+ancestorGeoDescriptions:\"New York Metro\"\r\n+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日更新

Anzel对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拒绝了请求。

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

供参考:

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

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

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

http://myhttp.info/

1 个答案:

答案 0 :(得分:0)

我还没有发表评论的帖子,所以这里就是。

查看将URL输入var'url'的方式。是否已编码为错误消息?我会尝试确保url是一个常规的,非编码的,并测试,也许库再次重新编码它,导致问题。如果你能给我们更多的周围代码,这可能有助于我们的诊断。