我有一个应用程序,基本上是存储在本地驱动器上的图像数据库。有时,我需要找到更高分辨率的版本或图像的Web来源,而Google的反向图像搜索非常适合此操作。
不幸的是,Google没有它的API,因此我不得不想出一种手动完成此操作的方法。现在我正在使用Selenium,但是显然有很多开销。我想要一个使用urllib2或类似方法的简单解决方案- 发送POST请求,找回搜索URL,然后我可以传递该URL以便webbrowser.open(url)将其加载到已经打开的系统浏览器中。
webbrowser.open(url)
这是我现在正在使用的:
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()
如果您愿意安装请求模块,这很容易做到。反向图像搜索工作流程当前由单个POST请求组成,该请求具有对上载URL的多部分主体,对此的响应是重定向到实际结果页面。
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)
当然,请记住,Google可能会决定随时更改此工作流程!