2014-04-24 20 views
5

Mam aplikację, która jest w zasadzie bazą danych obrazów przechowywanych na dysku lokalnym. Czasami muszę znaleźć wersję w wyższej rozdzielczości lub internetowe źródło obrazu, a Google reverse image search jest do tego idealny.Wyszukiwanie w odwrotnym obrazie Google przy użyciu żądania POST

Niestety, Google nie ma dla niego API, więc musiałem wymyślić sposób na zrobienie tego ręcznie. Teraz używam Selenium, ale to oczywiście ma dużo na głowie. Chciałbym użyć prostego rozwiązania przy użyciu urllib2 lub czegoś podobnego - wyślij żądanie POST, uzyskaj adres URL wyszukiwania, a następnie mogę po prostu przekazać ten URL do webbrowser.open(url), aby załadować go w mojej już otwartej przeglądarce systemowej.

Oto co używam teraz:

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() 
+0

Jeśli jesteś komercyjny, TinEye jest dobrym rozwiązaniem. Jeśli możesz je przesłać w dowolnym miejscu, przydatny będzie URL "www.google.com/searchbyimage? Image_url = IMAGE_URL". – Others

Odpowiedz

8

To jest łatwe do zrobienia, jeśli jesteś zadowolony zainstalować requests module. Przebieg pracy odwrotnego wyszukiwania obrazów składa się obecnie z pojedynczego żądania POST z treścią wieloczęściową do adresu URL do przesyłania, którego odpowiedzią jest przekierowanie do strony rzeczywistych wyników.

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) 

Oczywiście, pamiętaj, że Google może zdecydować o zmianie tego przepływu pracy w dowolnym momencie!

+1

Jeden dodatkowy, który został pominięty w tym przykładowym kodzie: 'import webbrowser' –

+0

' 'fetchUrl' zwrócony z powyższej odpowiedzi jest w rzeczywistości odciskiem palca obrazu generowanego przez dopasowanie rozmyte. – Tengerye

Powiązane problemy