2014-12-22 5 views
6

Wie kann ich Bing nach Bildern mit Schlüsselwörtern suchen?Suche Bing über Azure API mit Python

import urllib2 
import json 

credentialGoogle = '' # Google credentials from: https://console.developers.google.com/ 
searchString = 'Xbox%20One' 
top = 20 
offset = 0 
while offset < top: 
    url = 'https://ajax.googleapis.com/ajax/services/search/images?' + \ 
      'v=1.0&q=%s&start=%d&userip=%s' % (searchString, offset, credentialGoogle) 

    request = urllib2.Request(url) 
    response = urllib2.urlopen(request) 
    results = json.load(response) 

    # process results 

    offset += 4  # since Google API only returns 4 search results at a time 

Was wäre das Äquivalent für Bing: mit

Ich bin in der Lage Google zu suchen? Vermutlich würde es beginnen mit:

keyBing = ''  # Bing key from: https://datamarket.azure.com/account/keys 
credentialBing = '' # same as key? 
searchString = '%27Xbox+One%27' 
top = 20 
offset = 0 

url = 'https://api.datamarket.azure.com/Bing/Search/Image?' + \ 
     'Query=%s&$top=%d&$skip=%d&$format=json' % (searchString, top, offset) 

aber wie sind die Anmeldeinformationen eingerichtet?

+2

finden http://www.guguncube.com/2771/python-using-the-bing-search-api –

+0

@Camron_Godbout das war hilfreich. – jensph

+0

Für die Google API: "Diese API ist nicht mehr verfügbar." –

Antwort

4

Das würde Bing entsprechen:

keyBing = ''  # get Bing key from: https://datamarket.azure.com/account/keys 
credentialBing = 'Basic ' + (':%s' % keyBing).encode('base64')[:-1] # the "-1" is to remove the trailing "\n" which encode adds 
searchString = '%27Xbox+One%27' 
top = 20 
offset = 0 

url = 'https://api.datamarket.azure.com/Bing/Search/Image?' + \ 
     'Query=%s&$top=%d&$skip=%d&$format=json' % (searchString, top, offset) 

request = urllib2.Request(url) 
request.add_header('Authorization', credentialBing) 
requestOpener = urllib2.build_opener() 
response = requestOpener.open(request) 

results = json.load(response) 

# process results 

Lösung dank: http://www.guguncube.com/2771/python-using-the-bing-search-api

+1

Anscheinend hat sich das URL-Muster etwas geändert ... Ich habe immer einen 403 bekommen, bis ich '/ v1' drin habe: z. 'https: //api.datamarket.azure.com/Bing/SearchWeb/v1/Web? Query = ...' Dies ist nicht in der Dokumentation, sondern im Dataset Explorer, z. https://datamarket.azure.com/dataset/8818F55E-2FE5-4CE3-A617-0B8BA8419F65 Beachten Sie außerdem, dass Sie sich nicht nur für Azure Marketplace anmelden müssen, sondern sich auch für den entsprechenden Datendienst anmelden müssen, z. Suchen oder SuchenWeb. – LarsH

+0

guguncube verwendet '[: -1]' nach der base64-Kodierung des Bing-Schlüssels, um eine nachlaufende Newline zu entfernen. Ich musste das auch tun (obwohl ich '.rstrip()'). Warum hast du '[:]'? Macht das nicht einfach eine Kopie der Zeichenkette? – LarsH

+1

Ich erinnere mich nicht, warum ich die -1 entfernte, aber zu der Zeit, als ich das oben verwendete es funktionierte ... Danke für die URL-Aktualisierung. – jensph

2

In Python 3.0 oder höher, das wie folgt aussieht: meine Web-Suchfunktion

from urllib.parse import quote_plus 
import json 
import requests 

def bing_search(query): 
    # Your base API URL; change "Image" to "Web" for web results. 
    url = "https://api.datamarket.azure.com/Bing/Search/v1/Image" 

    # Query parameters. Don't try using urlencode here. 
    # Don't ask why, but Bing needs the "$" in front of its parameters. 
    # The '$top' parameter limits the number of search results. 
    url += "?$format=json&$top=10&Query=%27{}%27".format(quote_plus(query)) 

    # You can get your primary account key at https://datamarket.azure.com/account 
    r = requests.get(url, auth=("","YOUR_AZURE_API_PRIMARY_ACCOUNT_KEY")) 
    resp = json.loads(r.text) 
    return(resp) 
ist

Dieses basiert weg here.

2

Es gibt ein Python-Paket mit dem Namen PyBingSearch dafür (ok ich gebe es zu, ich schrieb einen Teil des Pakets).

installieren:

pip install py-bing-search 

In Python 2 * *:..

from py_bing_search import PyBingImageSearch 
bing_image = PyBingImageSearch('Your-Api-Key-Here', "x-box console") 
first_fifty_results = bing_image.search(limit=50, format='json') #1-50 
print (first_fifty_results[0].media_url) 

Sie werden den API-Schlüssel von Bing erhalten müssen (oben freizugeben/Monat bis 5k). Das Paket ermöglicht die Suche nach Web, Bild, Video und Nachrichten.

arbeitet jetzt für Python3 * als auch, einfach installieren mit:.

pip3 install py-bing-search 

Es gibt jetzt eine neue Microsoft Cognitive Service, die über die alte API nimmt. Das neue Python-Paket, das Ihnen dabei helfen kann, ist PyMsCognitive.

+0

@Tristen Tao das Modul scheint gut, aber wenn ich versuche und die Zeile ausführen, die 'first_fifity_result' erklärt, bekomme ich eine Fehlermeldung mit der Meldung 'Anfrage mit Code 401, error msg: Der von Ihnen angegebene Autorisierungstyp wird nicht unterstützt. Nur Basic und OAuth werden unterstützt. – Jstuff

+0

@Jstuff können Sie einen Fehlerbericht auf der GitHub-Seite senden. Bitte geben Sie Ihre Modul-Version + Python-Version, den genauen Code (ohne Ihre Auth offensichtlich) und ich werde einen Blick werfen :) –

+0

@Tristen Tao Jede Chance, die wir hier diskutieren können? Ich bin bei der Arbeit und kann mich nicht in Github einloggen. Ich benutze Python 3.5 und versuche einfach, das Beispiel in https://github.com/tristestao/py-bing-search zu verwenden, um Web-Suchergebnisse zurückzugeben und den oben erwähnten Fehler in der oben erwähnten Zeile zu erhalten. – Jstuff

1

Die Bing-Äquivalent für Python 3:

import http.client, urllib.request, urllib.parse, urllib.error, base64 
headers = { 
    # Request headers 
    'Ocp-Apim-Subscription-Key': '{subscription key}', 
} 

params = urllib.parse.urlencode({ 
    # Request parameters 
    'q': 'bill gates', 
    'count': '10', 
    'offset': '0', 
    'mkt': 'en-us', 
    'safesearch': 'Moderate', 
}) 

try: 
    conn = http.client.HTTPSConnection('api.cognitive.microsoft.com') 
    conn.request("GET", "/bing/v5.0/search?%s" % params, "{body}", headers) 
    response = conn.getresponse() 
    data = response.read() 
    print(data) 
    conn.close() 
except Exception as e: 
    print("[Errno {0}] {1}".format(e.errno, e.strerror)) 

Abonnement Schlüssel kann here