10

I'm interested in automatizing reverse image search. Yandex in particular is great for busting catfishes, even better than Google Images. So, consider this Python code:

import requests
import webbrowser

try:
    filePath = "C:\\path\\whateverThisIs.png"
    searchUrl = 'https://yandex.ru/images/'
    multipart = {'encoded_image': (filePath, open(filePath, 'rb')), 'image_content': ''}
    response = requests.post(searchUrl, files=multipart, allow_redirects=False)
    #fetchUrl = response.headers['Location']
    print(response)
    print(dir(response))
    print(response.content)
    input()
except Exception as e:
    print(e)
    print(e.with_traceback)
    input()```

The script fails with KeyError, 'location' is not found. I know the code works cause if you substitute searchUrl with http://www.google.hr/searchbyimage/upload then the script returns the correct url. So, in short the expected outcome would be a url with an image search. In actuality we get a KeyError where that url was supposed to be stored. Evidently, Yandex doesn't work in exactly the same way, maybe the url is off (although I tried a heap ton of variations) or the reason may be completely different.

Regardless of that, help in solving this problem is much appreciated!

Ryabchenko Alexander
  • 10,057
  • 7
  • 56
  • 88
Platon Makovsky
  • 275
  • 3
  • 13
  • 3
    You need to replicate the http requests that your browser does. Use your browsers' Network Monitor to see what requests are made. As you pointed out, it doesn't work exactly like Google. It makes a POST request to a URL with many parameters, like `https://yandex.com/images/search?serpid=ntjh1wqE0ZzVt [...]` which returns json. Of particular interest is the key `["blocks"][0]["params"]["url"]`, the value of which you add to the base URL, resulting in something like https://yandex.com/images/search?cbir_id=2358551%2FL-Qlx_crb_0dGQ9f6t-ksw&rpt=imageview. That's ultimately the URL you want. – GordonAitchJay May 26 '20 at 10:53
  • Did you try a `HEAD` or `OPTIONS` request to see what's going on at their backend (please share the response headers for these if you can), or also did try `'https://yandex.ru/images'` instead of `'https://yandex.ru/images/'`? –  Jun 01 '20 at 03:49

2 Answers2

15

You can get url with an image search by using this code. Tested on ubuntu 18.04, with python 3.7 and requests 2.23.0

import json

import requests

file_path = "C:\\path\\whateverThisIs.png"
search_url = 'https://yandex.ru/images/search'
files = {'upfile': ('blob', open(file_path, 'rb'), 'image/jpeg')}
params = {'rpt': 'imageview', 'format': 'json', 'request': '{"blocks":[{"block":"b-page_type_search-by-image__link"}]}'}
response = requests.post(search_url, params=params, files=files)
query_string = json.loads(response.content)['blocks'][0]['params']['url']
img_search_url = search_url + '?' + query_string
print(img_search_url)
ark-key
  • 286
  • 1
  • 5
  • Works on Windows 7, with Python 3.6.8 and requests 2.18.4 – Rufat Jun 01 '20 at 17:56
  • 1
    Is failing on Win10, Python 3.6.6, requests 2.24:c:\Python36>python yi_search.py Traceback (most recent call last): File "yi_search.py", line 10, in query_string = json.loads(response.content)['blocks'][0]['params']['url'] KeyError: 'blocks' – Dave Jun 26 '20 at 16:38
  • Would you be so kind to explain me what this 'request': '{"blocks....." payload is for. By the way, your codes works perfectly on OSx Catalina, Python 3.7, requests 2.27.1 – Ivan Calderon Feb 22 '22 at 20:25
  • @IvanCalderon That bit of code specifies which "blocks" should be returned in the payload. If you observe the traffic of Yandex itself, several blocks are requested. But in the case of this answer, only the _search by image link_ block is requested. – Sampson Jul 02 '22 at 23:00
1

There are no API for developers. You can try reverse inginer queries from your browser, but you will have to deal with anty robot protect.

Another way to speed up process (but still manual)

  1. As described here https://yandex.com/support/images/loaded-image.html install Yandex.Browser where you have hot key for image search
  2. Host/make your site with all source images foe search queries
  3. Open your site in Yandex.Browser use "right mouse click"+"serch image at yandex"
  4. Copy what you need from page with results
Ryabchenko Alexander
  • 10,057
  • 7
  • 56
  • 88