2016-07-02 1 views
3

Salut Stackoverflow CommunautéBing Congitive API de recherche Web avec Python 3

Je tente d'accéder à la nouvelle API Bing Search cognitive via un script Python 3. Je suis en mesure de trouver des menaces sur l'utilisation de Bing Search 2.0 (depuis dépréciée) mais n'a pas été en mesure d'identifier un exemple pour la nouvelle API avec Python 3. J'ai utilisé le code suivant:

import urllib.parse 
import urllib.request 
import json 
import base64 


def bing_search(query): 
    key = 'mysubscription_key' 
    query = urllib.parse.quote(query) 

    #Create credentials for authentication 
    user_agent = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; FDM; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 1.1.4322)' 
    encoded = base64.b64encode(bytes(':%s' % key, 'utf-8')) 
    credentials = encoded[:-1] # the "-1" is to remove the trailing "\n" which encode adds 
    print(credentials) 
    auth = 'Basic %s' % credentials 
    print(auth) 
    url = 'https://api.cognitive.microsoft.com/bing/v5.0/search?q=' + query + '&mkt=en-us' 
    print(url) 

    #Create the API request 
    urlrequest = urllib.request.urlopen(url)  # in Python3 urllib.request(...) becomes urllib.request.open(...) 
    urlrequest.add_header('Authentication', auth) 
    urlrequest.add_header('User Agent', user_agent) 
    request_opener = urllib.request.build_opener() 

    # Handle the response 
    response = request_opener.open(urlrequest) 
    results = json.load(response) 

    result_list = results['webPages']['values'] 
    print(result_list) 

bing_search('good news') 

Malheureusement, je reçois la suite à l'erreur 'Accès refusé'. Quelqu'un pourrait-il me pointer dans la bonne direction?

C:\Users\Admin\AppData\Local\Programs\Python\Python35-32\python.exe C:/Users/Admin/PycharmProjects/momely/placementarchitect/bingtest.py 
b'OmZhNTlmNTBlMmFmMjQyZjhhYmE5MTZlNmZkYThhMDM' 
Basic b'OmZhNTlmNTBlMmFmMjQyZjhhYmE5MTZlNmZkYThhMDM' 
https://api.cognitive.microsoft.com/bing/v5.0/search?q=good%20news&mkt=en-us 
Traceback (most recent call last): 
    File "C:/Users/Admin/PycharmProjects/momely/placementarchitect/bingtest.py", line 34, in <module> 
    bing_search('good news') 
    File "C:/Users/Admin/PycharmProjects/momely/placementarchitect/bingtest.py", line 22, in bing_search 
    urlrequest = urllib.request.urlopen(url)  # in Python3 urllib.request(...) becomes urllib.request.open(...) 
    File "C:\Users\Admin\AppData\Local\Programs\Python\Python35-32\lib\urllib\request.py", line 162, in urlopen 
    return opener.open(url, data, timeout) 
    File "C:\Users\Admin\AppData\Local\Programs\Python\Python35-32\lib\urllib\request.py", line 471, in open 
    response = meth(req, response) 
    File "C:\Users\Admin\AppData\Local\Programs\Python\Python35-32\lib\urllib\request.py", line 581, in http_response 
    'http', request, response, code, msg, hdrs) 
    File "C:\Users\Admin\AppData\Local\Programs\Python\Python35-32\lib\urllib\request.py", line 509, in error 
    return self._call_chain(*args) 
    File "C:\Users\Admin\AppData\Local\Programs\Python\Python35-32\lib\urllib\request.py", line 443, in _call_chain 
    result = func(*args) 
    File "C:\Users\Admin\AppData\Local\Programs\Python\Python35-32\lib\urllib\request.py", line 589, in http_error_default 
    raise HTTPError(req.full_url, code, msg, hdrs, fp) 
urllib.error.HTTPError: HTTP Error 401: Access Denied 

Merci de bien vouloir M.

Répondre

10

L'authentification est pas par auth de base, mais par en-tête personnalisé Ocp-Apim-Subscription-Key:

Subscription key which provides access to this API.

qui se trouve dans votre subscriptions

Voir complet détails à https://www.microsoft.com/cognitive-services/en-us/bing-web-search-api

En supposant

la variable key détient la clé d'abonnement, ce que vous devez faire est tout simplement urlrequest.add_header('Ocp-Apim-Subscription-Key', key)

Comme suggestion mineure, votre code peut être grandement simplifiée en utilisant python-requests. Un exemple minimal peut être:

import requests 

def bing_search(query): 
    url = 'https://api.cognitive.microsoft.com/bing/v5.0/search' 
    # query string parameters 
    payload = {'q': query} 
    # custom headers 
    headers = {'Ocp-Apim-Subscription-Key': 'xxxxxxxxxxxxx'} 
    # make GET request 
    r = requests.get(url, params=payload, headers=headers) 
    # get JSON response 
    return r.json() 

j = bing_search('good news') 
print(j.get('webPages', {}).get('value', {})) 
+0

vous woozyking remercie. Malheureusement, je reçois toujours la même erreur: urllib.error.HTTPError: Erreur HTTP 401: Accès refusé – Z101

+0

Qu'avez-vous changé exactement? – woozyking

+0

Merci beaucoup les demandes alternatives ont bien fonctionné. Vraiment apprécié. – Z101

0

Vous devez également vérifier le package py-ms-cognitive pour Python. C'est un wrapper pour l'API Cognitive Services, supportant actuellement la recherche web. Je cherche aussi des commentaires/collaborateur, ne hésitez pas à laisser un problème, faire PR etc.

Pour installer:

pip install py-ms-cognitive 

Pour utiliser:

from py_ms_cognitive import PyMsCognitiveWebSearch 
web_bing = PyMsCognitiveWebSearch('api_key', "xbox") 
first_fity_results = web_bing.search(limit=50) 
second_fity_results = web_bing.search(limit=50) 
print second_fifty_results[0].url