Búsqueda de imágenes inversas en Google mediante solicitud POST

Tengo una aplicación que es básicamente una base de datos de imágenes almacenadas en mi disco local. A veces necesito encontrar una versión de mayor resolución o la fuente web de una imagen, y la búsqueda de imagen inversa de Google es ideal para eso.

Desafortunadamente, Google no tiene una API para eso, así que tuve que encontrar la manera de hacerlo manualmente. Ahora mismo estoy usando Selenium, pero eso obviamente tiene muchos gastos generales. Me gustaría una solución simple que use urllib2 o algo similar: enviar una solicitud POST, recuperar la URL de búsqueda y luego puedo pasar esa URL a webbrowser.open(url) para cargarla en mi navegador de sistema ya abierto.

Esto es lo que estoy usando en este momento:

 gotUrl = QtCore.pyqtSignal(str) filePath = "/mnt/Images/test.png" browser = webdriver.Firefox() browser.get('http://www.google.hr/imghp') # Click "Search by image" icon elem = browser.find_element_by_class_name('gsst_a') elem.click() # Switch from "Paste image URL" to "Upload an image" browser.execute_script("google.qb.ti(true);return false") # Set the path of the local file and submit elem = browser.find_element_by_id("qbfile") elem.send_keys(filePath) # Get the resulting URL and make sure it's displayed in English browser.get(browser.current_url+"&hl=en") try: # If there are multiple image sizes, we want the URL for the "All sizes" page elem = browser.find_element_by_link_text("All sizes") elem.click() gotUrl.emit(browser.current_url) except: gotUrl.emit(browser.current_url) browser.quit() 

Esto es fácil de hacer si está dispuesto a instalar el módulo de solicitudes . El flujo de trabajo de búsqueda de imagen inversa actualmente consiste en una única solicitud POST con un cuerpo de varias partes a una URL de carga, cuya respuesta es una redirección a la página de resultados real.

 import requests 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) 

Por supuesto, ¡recuerde que Google puede decidir cambiar este flujo de trabajo en cualquier momento!