Python: правильный URL-адрес для загрузки изображений из Google Image Search

Я пытаюсь получить изображения из поиска изображений Google для определенного запроса. Но на странице, которую я загружаю, нет изображений, и она перенаправляет меня на исходную страницу Google. Вот мой код:

AGENT_ID   = "Mozilla/5.0 (X11; Linux x86_64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1"

GOOGLE_URL = "https://www.google.com/images?source=hp&q={0}"

_myGooglePage = ""

def scrape(self, theQuery) :
    self._myGooglePage = subprocess.check_output(["curl", "-L", "-A", self.AGENT_ID, self.GOOGLE_URL.format(urllib.quote(theQuery))], stderr=subprocess.STDOUT)
    print self.GOOGLE_URL.format(urllib.quote(theQuery))
    print self._myGooglePage
    f = open('./../../googleimages.html', 'w')
    f.write(self._myGooglePage)

Что я делаю не так?

Спасибо


person slwr    schedule 16.02.2012    source источник
comment
по крайней мере, вы должны закрыть дескриптор файла   -  person Roman Bodnarchuk    schedule 17.02.2012
comment
@silviolor: я знаю, что это не поможет вашей проблеме, но почему бы не использовать встроенный в Python модуль urllib2 вместо curl.   -  person RanRag    schedule 17.02.2012


Ответы (5)


Я дам вам подсказку ... начните здесь:

https://ajax.googleapis.com/ajax/services/search/images?v=1.0&q=JULIE%20NEWMAR

Где JULIE и NEWMAR — ваши условия поиска.

Это вернет данные json, которые вам нужны... вам нужно будет проанализировать их, используя json.load или simplejson.load, чтобы вернуть dict... а затем углубитесь в него, чтобы сначала найти responseData, а затем список results, который содержит отдельные элементы, url которых вы хотите загрузить.

Хотя я никоим образом не предлагаю выполнять автоматический парсинг Google, поскольку их (устарело ) API для этого конкретно не говорит.

person michaelfilms    schedule 17.02.2012
comment
Обратите внимание, этот API больше не доступен. - person prooffreader; 29.02.2016

Это код на Python, который я использую для поиска и загрузки изображений из Google, надеюсь, он поможет:

import os
import sys
import time
from urllib import FancyURLopener
import urllib2
import simplejson

# Define search term
searchTerm = "hello world"

# Replace spaces ' ' in search term for '%20' in order to comply with request
searchTerm = searchTerm.replace(' ','%20')


# Start FancyURLopener with defined version 
class MyOpener(FancyURLopener): 
    version = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11'
myopener = MyOpener()

# Set count to 0
count= 0

for i in range(0,10):
    # Notice that the start changes for each iteration in order to request a new set of images for each loop
    url = ('https://ajax.googleapis.com/ajax/services/search/images?' + 'v=1.0&q='+searchTerm+'&start='+str(i*4)+'&userip=MyIP')
    print url
    request = urllib2.Request(url, None, {'Referer': 'testing'})
    response = urllib2.urlopen(request)

    # Get results using JSON
    results = simplejson.load(response)
    data = results['responseData']
    dataInfo = data['results']

    # Iterate for each result and get unescaped url
    for myUrl in dataInfo:
        count = count + 1
        print myUrl['unescapedUrl']

        myopener.retrieve(myUrl['unescapedUrl'],str(count)+'.jpg')

    # Sleep for one second to prevent IP blocking from Google
    time.sleep(1)

Вы также можете найти очень полезную информацию здесь.

person Jaime Ivan Cervantes    schedule 24.11.2012
comment
Можно ли определить тип изображения по данному URL-адресу в Google - person erogol; 09.08.2014
comment
Я не смотрел на это какое-то время, но проверял последнюю версию Google API. Я думаю, что да, вы можете уточнить свой поиск до .png, .jpg и даже до векторного формата .svg. - person Jaime Ivan Cervantes; 09.08.2014

Вот небольшой скрипт, который я написал, и он выполняет всю работу.

person crizCraig    schedule 27.05.2012
comment
Здравствуйте, ваш скрипт, кажется, использует PIL. К сожалению, у меня ОГРОМНЫЕ проблемы с установкой PIL на эту машину. Поскольку мне просто нужны изображения, без какого-либо преобразования, есть ли способ обойтись без этого? - person Pietro Speroni; 08.07.2012
comment
Я не знаю, как избежать PIL, но я настоятельно рекомендую MacPorts, если вы используете Mac, чтобы упростить установку пакетов и установить PIL для вас. - person crizCraig; 10.07.2012

я просто присоединяюсь, чтобы ответить на это, хотя это старо. есть гораздо более простой способ сделать это.

def google_image(x):
        search = x.split()
        search = '%20'.join(map(str, search))
        url = 'http://ajax.googleapis.com/ajax/services/search/images?v=1.0&q=%s&safe=off' % search
        search_results = urllib.request.urlopen(url)
        js = json.loads(search_results.read().decode())
        results = js['responseData']['results']
        for i in results: rest = i['unescapedUrl']
        return rest

это все.

person riyoken    schedule 11.09.2013
comment
это в 3.x, поэтому, очевидно, замените urllib.request на urllib2 в 2.x. - person riyoken; 11.09.2013

Один из лучших способов — использовать icrawler. Проверьте ниже ответ. Это работает для меня.

https://stackoverflow.com/a/51204611/4198099

person Ravi    schedule 06.07.2018