14 Stimmen

Google Rückwärtssuche nach Bildern mit POST-Anfrage verwenden

Ich habe eine App, die im Grunde eine Datenbank von Bildern ist, die auf meiner lokalen Festplatte gespeichert sind. Manchmal muss ich eine Version mit höherer Auflösung oder die Webquelle eines Bildes finden, und Googles umgekehrte Bildsuche ist ideal dafür.

Leider bietet Google keine API dafür an, also musste ich einen Weg finden, um es manuell zu machen. Im Moment benutze ich Selenium, aber das hat offensichtlich viele Overheads. Ich hätte gerne eine einfache Lösung mit urllib2 oder etwas Ähnlichem - einen POST-Request senden, die Such-URL zurückbekommen und dann kann ich einfach diese URL an webbrowser.open(url) übergeben, um sie in meinem bereits geöffneten Systembrowser zu laden.

Hier ist, was ich im Moment benutze:

gotUrl = QtCore.pyqtSignal(str)
filePath = "/mnt/Images/test.png"

browser = webdriver.Firefox()
browser.get('http://www.google.hr/imghp')

# Klicke auf das "Nach Bild suchen" Symbol
elem = browser.find_element_by_class_name('gsst_a')
elem.click()

# Wechsele von "Bild-URL einfügen" zu "Ein Bild hochladen"
browser.execute_script("google.qb.ti(true);return false")

# Setze den Pfad zur lokalen Datei und sende sie ab
elem = browser.find_element_by_id("qbfile")
elem.send_keys(filePath)

# Hole die resultierende URL und stelle sicher, dass sie auf Englisch angezeigt wird
browser.get(browser.current_url+"&hl=en")
try:
    # Wenn es mehrere Bildgrößen gibt, möchten wir die URL für die Seite "Alle Größen"
    elem = browser.find_element_by_link_text("Alle Größen")
    elem.click()
    gotUrl.emit(browser.current_url)
except:
    gotUrl.emit(browser.current_url)
browser.quit()

21voto

Uri Granta Punkte 1645

Dies ist einfach zu tun, wenn Sie bereit sind, das Requests-Modul zu installieren. Der Arbeitsablauf für die Rückwärtssuche nach Bildern besteht derzeit aus einer einzelnen POST-Anforderung mit einem mehrteiligen Körper an eine Upload-URL, deren Antwort eine Weiterleitung zur tatsächlichen Ergebnisseite ist.

import requests
import webbrowser

filePath = '/mnt/Images/test.png'
searchUrl = 'http://www.google.hr/searchbyimage/upload'
multipart = {'encoded_image': (filePath, open(filePath, 'rb')), 'image_content': ''}
response = requests.post(searchUrl, files=multipart, allow_redirects=False)
fetchUrl = response.headers['Location']
webbrowser.open(fetchUrl)

Natürlich sollten Sie bedenken, dass Google jederzeit beschließen könnte, diesen Arbeitsablauf zu ändern!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X