2012-02-16 2 views
6

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

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) 

Что я делаю неправильно?

Благодаря

+1

по крайней мере, вам нужно закрыть дескриптор файла –

+0

он сработал! спасибо – lorussian

+0

@silviolor: Я знаю, что это не поможет вашей проблеме, но почему бы не использовать встроенный модуль 'urllib2' python вместо' curl'. – RanRag

ответ

3

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

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

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

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

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

+0

спасибо, этот способ выглядит проще. – lorussian

+0

Обратите внимание: этот API больше не доступен. – prooffreader

3
+0

Здравствуйте, ваш скрипт, похоже, использует PIL. К сожалению, у меня, похоже, есть ОГРОМНЫЕ проблемы при установке PIL на этой машине. Так как мне просто нужны изображения, без каких-либо преобразований, есть ли способ уйти без него? –

+0

Я не уверен, как избежать PIL, но я настоятельно рекомендую MacPorts, если вы используете Mac для упрощения установки пакета и установки PIL для вас. – crizCraig

+0

Или лучше, Homebrew: http://brew.sh/ –

6

Это код в 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) 

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

+0

Возможно ли определить тип изображения на указанном URL-адресе Google? – erogol

+0

Я не смотрел на это некоторое время, но проверяю последний API Google. Я думаю, что ответ «да», вы можете уточнить свой поиск на «.png», «.jpg» и даже на векторный формат «.svg». –

0

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

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 

это все.

+0

это в 3.x, поэтому замените urllib.request на urllib2 в 2.x, очевидно. – riyoken

Смежные вопросы