Разрешает ли Википедия получение URL-адресов через Google App Engine? - PullRequest
4 голосов
/ 25 сентября 2011

Я пишу веб-приложение на Python, и в нем я планирую использовать Википедию. При попытке получить код для получения URL-адреса мне удалось получить как Google, так и Facebook (через службы Google App Engine), но когда я попытался получить wikipedia.org, я получил исключение. Кто-нибудь может подтвердить, что Википедия не принимает такие типы запросов страниц? Как Википедия может отличить меня от пользователя?

Фрагмент кода (это Python!):

    import os
import urllib2
from google.appengine.ext.webapp import template


class MainHandler(webapp.RequestHandler):
    def get(self):
        url = "http://wikipedia.org"
        try:
          result = urllib2.urlopen(url)
        except urllib2.URLError, e:
          result = 'ahh the sky is falling'
        template_values= {
            'test':result,
        }
        path = os.path.join(os.path.dirname(__file__), 'index.html')
        self.response.out.write(template.render(path, template_values))

Ответы [ 2 ]

5 голосов
/ 26 сентября 2011

urllib2 пользовательский агент по умолчанию забанен в википедии, что приводит к HTTP-ответу 403.
Вам следует изменить пользовательский агент приложения следующим образом:

#Option 1
import urllib2
opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'MyUserAgent')]
res= opener.open('http://whatsmyuseragent.com/')
page = res.read()

#Option 2
import urllib2
req = urllib2.Request('http://whatsmyuseragent.com/')
req.add_header('User-agent', 'MyUserAgent')
urllib2.urlopen(req)

#Option 3
req = urllib2.Request("http://whatsmyuseragent.com/", 
                       headers={"User-agent": "MyUserAgent"})
urllib2.urlopen(req)

Бонусная ссылка:
Высокий уровень Клиенты Wikipedia Python http://www.mediawiki.org/wiki/API:Client_code#Python

1 голос
/ 27 сентября 2011

Вы можете установить свой пользовательский агент на любую строку, которую вы хотите; он будет изменен App Engine для добавления строки AppEngine-Google; (+http://code.google.com/appengine; appid: yourapp). В urllib2 вы можете установить заголовок user-agent следующим образом:

req = urllib2.Request("http://en.wikipedia.org/", headers={"User-Agent": "Foo"})
response = urllib2.urlopen(req)
...