Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Extrair imagens do Google

Bom dia!

Estou tentando extrair imagens das minhas pesquisas no google. Quando extraio a url da imagem no python, ela vem desconfigurada e não consigo acessar ela.

Exemplo:

url = 'https://www.google.com/search?q=tsla34&oq=tsla34&aqs=chrome.0.69i59j0l5j69i61l2.1319j1j1&sourceid=chrome&ie=UTF-8'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36'}

req = Request(url, headers=headers)
response = urlopen(req)
html = response.read()
soup = BeautifulSoup(html, 'html.parser')

image = soup.find('g-img', class_="ivg-i PZPZlf").img
image.get('src')

o código me retorna:

'data:image/gif;base64,R0lGODlhAQABAIAAAP///////yH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=='

e o esperado era me retornar:

'data:image/png;base64,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'

Desde já agradeço!

2 respostas
solução!

Oi Júlio, como vai? Espero que esteja bem ^-^

O Google altera dinamicamente os nomes das classes do código e por esse motivo, apenas a biblioteca BeautifulSoup não é suficiente para que possamos fazer a extração dos dados específicos da página. Quanto ao retorno do código que você apresentou, ele se trata de uma simplificação do endereço esperado e esse endereço esperado nada mais é do que a própria imagem, porém, escrita em base64.

Mas e então? Como fazer esse scraping e pegarmos o endereço da imagem? Para isso podemos utilizar a biblioteca selenium, com ela iremos automatizar o processo de busca e utilizar um navegador real para simular a busca da pesquisa. Aqui, vale ressaltar uma diferença entre o selenium e o BeautifulSoup, a última é apenas um analisador de html, enquanto a selenium, além de analisar, também consegue nos fornecer recursos de automatização, como por exemplo: clique em determinado botão, mudar algum endereço, dentre outros.

Nesse problema em específico, precisamos acessar o código fonte da página de pesquisa, pois ele não muda, diferentemente daquele que é apresentado quando inspecionamos o elemento, onde o mesmo é re-renderizado. Caso queira ver esse código, basta clicar em Exibir código fonte da página:

image

Quando fazemos uma análise do código da página, é possível perceber que na tag que nos interessa (g-img) há um atributo denominado data-lpage que possui o endereço da imagem, veja:

image

E se clicarmos nesse endereço apresentado, iremos encontrar a própria imagem apresentada na pesquisa.

data-lpage="https://upload.wikimedia.org/wikipedia/commons/thumb/b/bd/Tesla_Motors.svg/372px-Tesla_Motors.svg.png"

Podemos utilizar isso ao nosso favor, pois, através do campo src que possui no endereço da imagem, por padrão, o Google irá encurtá-lo.

Pré requisitos para execução do código:

  • Utilizaremos o navegador Google Chrome, caso não o utilize, faça o download do mesmo neste link

  • Baixe o WebDriver responsável por auxiliar na automatização do procedimento, bem como abrir a página automaticamente e extrair o código fonte da página. Extraia o arquivo e o coloque na mesma pasta que estiver salvo o código

  • Instale a biblioteca Selenium através do seguinte comando: pip install selenium

Com o ambiente preparado, vamos ao código:

from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time

chrome_options = Options()
chrome_options.add_argument("--headless")

print('Aguarde, os dados estão sendo coletados...')

tempo_inicial = time.time()
driver = webdriver.Chrome(chrome_options=chrome_options)
driver.get('https://www.google.com/search?q=tesla')

html = driver.page_source

soup = BeautifulSoup(html,'html.parser')
img_tesla = soup.find('g-img', class_='ivg-i')
endereco_imagem = img_tesla.get('data-lpage')
tempo_final = time.time()
print(f'Endereço da imagem: {endereco_imagem}')
print(f'Tempo de coleta: {tempo_final-tempo_inicial:.2f} segundos')

Resultado:

image

No código acima, utilizamos a biblioteca selenium apenas para extração do código fonte estático da página, toda análise fora feita com a biblioteca apresentada no curso: BeautifulSoup. Um detalhe é que adicionei o cálculo do tempo que o código leva para fazer a extração.

Deixo como referência para consultas a documentação do selenium.

Espero que te ajude e qualquer dúvida estou por aqui.

Abraços e bons estudos!

Boa tarde Nádia! Tudo joia por aqui. Espero que você esteja bem também.

Uau... que explicação completa! Esclareceu tudo, muito obrigado!!

Abraços

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software