URLError с SPARQLWrapper в sparql.query (). Convert ()

Я пробую небольшой скрипт на Python, чтобы проверить свой запрос SPARQL. Однако следующий простой код не работает.

from SPARQLWrapper import SPARQLWrapper, JSON
import rdflib
#connect to the sparql point
sparql = SPARQLWrapper("http://localhost:3030/sparql")
#SPARQL request
sparql.setQuery("""
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX rme: <http://www.semanticweb.org/reminer/>

SELECT ?o
WHERE { ?s ?p ?o }
LIMIT 1
""")
sparql.setReturnFormat(JSON)
results = sparql.query().convert()

for result in results["results"]["bindings"]:
     print(result["o"]["value"])

Мой код надолго зависает на этапе преобразования, а затем выдает ошибку URLError. И когда я останавливаю скрипт, вижу следующее сообщение:

HTTPError                                 Traceback (most recent call last)
<ipython-input-6-2ab63307a418> in <module>()
     18 """)
     19 sparql.setReturnFormat(JSON)
---> 20 results = sparql.query().convert()
     21 
     22 for result in results["results"]["bindings"]:

/Users/francocy/anaconda/lib/python3.4/site-packages/SPARQLWrapper/Wrapper.py in query(self)
    533             @rtype: L{QueryResult} instance
    534         """
--> 535         return QueryResult(self._query())
    536 
    537     def queryAndConvert(self):

/Users/francocy/anaconda/lib/python3.4/site-packages/SPARQLWrapper/Wrapper.py in _query(self)
    513                 raise EndPointInternalError(e.read())
    514             else:
--> 515                 raise e
    516 
    517     def query(self):

/Users/francocy/anaconda/lib/python3.4/site-packages/SPARQLWrapper/Wrapper.py in _query(self)
    503 
    504         try:
--> 505             response = urlopener(request)
    506             return response, self.returnFormat
    507         except urllib.error.HTTPError as e:

/Users/francocy/anaconda/lib/python3.4/urllib/request.py in urlopen(url, data, timeout, cafile, capath, cadefault, context)
    159     else:
    160         opener = _opener
--> 161     return opener.open(url, data, timeout)
    162 
    163 def install_opener(opener):

/Users/francocy/anaconda/lib/python3.4/urllib/request.py in open(self, fullurl, data, timeout)
    467         for processor in self.process_response.get(protocol, []):
    468             meth = getattr(processor, meth_name)
--> 469             response = meth(req, response)
    470 
    471         return response

/Users/francocy/anaconda/lib/python3.4/urllib/request.py in http_response(self, request, response)
    577         if not (200 <= code < 300):
    578             response = self.parent.error(
--> 579                 'http', request, response, code, msg, hdrs)
    580 
    581         return response

/Users/francocy/anaconda/lib/python3.4/urllib/request.py in error(self, proto, *args)
    505         if http_err:
    506             args = (dict, 'default', 'http_error_default') + orig_args
--> 507             return self._call_chain(*args)
    508 
    509 # XXX probably also want an abstract factory that knows when it makes

/Users/francocy/anaconda/lib/python3.4/urllib/request.py in _call_chain(self, chain, kind, meth_name, *args)
    439         for handler in handlers:
    440             func = getattr(handler, meth_name)
--> 441             result = func(*args)
    442             if result is not None:
    443                 return result

/Users/francocy/anaconda/lib/python3.4/urllib/request.py in http_error_default(self, req, fp, code, msg, hdrs)
    585 class HTTPDefaultErrorHandler(BaseHandler):
    586     def http_error_default(self, req, fp, code, msg, hdrs):
--> 587         raise HTTPError(req.full_url, code, msg, hdrs, fp)
    588 
    589 class HTTPRedirectHandler(BaseHandler):

HTTPError: HTTP Error 403: Forbidden

У меня такая же ситуация и с 2.7, и с 3.4. РЕДАКТИРОВАТЬ: я изменил свое соединение с Wi-Fi на интрасеть. Мой сценарий хорошо работает с конечной точкой DBpedia Sparql, но при запросе на локальном сервере у меня возникает ошибка Http. Похоже, проблема с прокси или доступом к моему локальному серверу.

Заранее спасибо за помощь.


person Cyril    schedule 10.06.2015    source источник


Ответы (3)


Для пользователей, приезжающих сюда в 2019 году, в случае ошибок при доступе к конечной точке sparql Wikidata Wikidata применяет строгую политику User-Agent, см. Этот архив (спасибо Pere) чат проекта Викиданных, в котором говорится, что приложения, отправляющие информативные заголовки, указывают на корректные сценарии, не связанные с ботами, также см. политика пользователя-агента Викимедиа.

Согласно документации, мы можем установить пользовательский агент, использующий переменную экземпляра agent. HTTP-заголовок пользовательского агента описан в веб-документации MDN.. Наконец, вы можете инициализировать объект класса как,

sparql = SPARQLWrapper("https://query.wikidata.org/sparql", agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11")

Надеюсь это поможет!

person Shrestha Ghosh    schedule 04.07.2019
comment
Тема чата Викиданных заархивирована на wikidata.org/wiki/ Викиданные: Project_chat / Архив / 2019 / - person Pere; 13.02.2020

Если вы попытаетесь выполнить какой-либо запрос SPARQL на своем локальном сервере fuseki через скрипт python, вы можете столкнуться с проблемой прокси-сервера. Чтобы решить эту проблему, вы можете использовать свойство автоопределения urllib.

from SPARQLWrapper import SPARQLWrapper, JSON, XML
#import urllib.request module. Don't forget for Python 3.4 the urllib has been split into several different modules.
import urllib.request

#if the arg is empty in ProxyHandler, urllib will find itself your proxy config.
proxy_support = urllib.request.ProxyHandler({})
opener = urllib.request.build_opener(proxy_support)
urllib.request.install_opener(opener)

#connect to the sparql point
sparql = SPARQLWrapper("http://localhost:3030/yourOwnDb/sparql")
#SPARQL request
sparql.setQuery("""
    PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
    PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
    PREFIX owl: <http://www.w3.org/2002/07/owl#>
    PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

    SELECT ?o ?p
    WHERE { ?s ?p ?o }
    LIMIT 1
""")
sparql.setReturnFormat(JSON)
results = sparql.query().convert()

for result in results["results"]["bindings"]:
    print(result["o"]["value"])
person Cyril    schedule 10.06.2015
comment
Да, я знаю, но это задержка. Я этого ждала. Спасибо. - person Cyril; 12.06.2015

Как сообщает ошибка:

Превышено время ожидания операции

Похоже, что когда вы запускали код, dbpedia.org был недоступен через ваше соединение.

Запустив свой код сейчас, он сразу же вернет мне следующее:

http://www.openlinksw.com/schemas/virtrdf#QuadMapFormat

Так что на производстве вы, вероятно, захотите поймать этот URLError и как-нибудь с этим справиться.


Обновление после редактирования вопроса:

В настоящее время SPARQLWrapper полагается на urllib2 для выполнения своих запросов, поэтому, если вы находитесь за прокси-сервером, вы можете использовать ProxyHandler urllib2, например здесь < / а>:

proxy = urllib2.ProxyHandler({'http': '192.168.x.x'})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
# and then:
results = sparql.query().convert()
person Jörn Hees    schedule 10.06.2015
comment
Я меняю способ подключения к Интернету. Я переключаю свое соединение с Wi-Fi на интранет. Теперь это работа. Но теперь у меня все еще проблема с доступом к моему серверу localhost. Я получаю запрещенную ошибку HTTP 403. Я не знаю, какие ИТ-услуги я выполнял на своем компьютере. - person Cyril; 10.06.2015
comment
Что ж, единственный, кто может узнать, это вы ... спросите своего ИТ-отдела, какова ваша настройка (например, IP-адрес вашего прокси) - person Jörn Hees; 10.06.2015
comment
Спасибо за ответ, Йорн Хис. Я попытался использовать ProxyHandler с моим http-адресом прокси, но проблема не решена. У меня такая же ошибка. См. Мой код: from urllib.request import * proxy = ProxyHandler({'http': 'www-cache.***.com:3**8'}) opener = build_opener(proxy) install_opener(opener) #connect to the sparql point sparql = SPARQLWrapper("http://localhost:3030/db/sparql") - person Cyril; 10.06.2015
comment
Спасибо за ответ, Йорн Хис. Я был закрыт. Теперь это работает. Я не использую ваш скрипт, но адаптирую его к Python 3.4. Я использовал свойство автоопределения urllib. Смотрите код: proxy_support = urllib.request.ProxyHandler({}) opener = urllib.request.build_opener(proxy_support) urllib.request.install_opener(opener) - person Cyril; 10.06.2015