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

Nao consigo localizar alguns objetos web scrapping

Eu tento localizar a tag da imagem, mas o bs4 nao encontra,diz que nao tem. Onde estou errando?


import os
from bs4 import BeautifulSoup
from urllib.request import Request,urlopen
from urllib.error import URLError,HTTPError
#recebendo dados a serem pesquisados
site = 'https://www.flickr.com/search/?text='
pesquisa = input('Digite o que voce procura: ')
pesquisa = site+pesquisa
print(pesquisa)
url = pesquisa
headers = {'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'}
try:
    req = Request(url, headers = headers)
    response = urlopen(req)
    html = response.read()
    print(response.read())
except HTTPError as e:
    print(e.status,e.reason)

except URLError as e:
    print(e.reason)
soup = BeautifulSoup(html,'html.parser')
print(soup.prettify())
teste = soup.find('div',{'class':'interaction-view'})
imagem = teste.find('div',{'class':'photo-list-photo-interaction'}).get_text()
print(imagem)
4 respostas
solução!

Olá Thiago,

O primeiro detalhe a considerar é que a div photo-list-photo-interaction é carregada por javascript, e um scraping simples com o urlopen não consegue acessar conteúdo carregado por javascript, para isso é necessário uma ferramenta mais poderosa como o selenium que simula um navegador completo.

Mas ainda podemos acessar a url das imagens adaptando um pouco o seu código (assumindo que a url seja seu objetivo), primeiro para você ver como o urlopen está "vendo" a página você pode desativar o javascript do seu navegador e abrir novamente a página do flickr. Olhando na página vemos que a url fica dentro do atributo style da div acima da interaction-view, assim eu consegui obter essa url modificando apenas o seu último bloco de código:

import re

# Acessa a tag acima da .interaction-view
div_img = soup.find('div',{'class':'interaction-view'}).parent

# Pega o conteúdo do atributo style
style = div_img['style']

# Busca apenas a url dentro de todo o texto do style
img_url = re.search("background-image.*[)]", style).group()
img_url = img_url.lstrip("background-image: url(").rstrip(")")

print(img_url)

Espero ter ajudado, qualquer dúvida é só falar!

Muito obrigado Lucas. Soh mais uma duvida, onde eu posso localizar que a div photo-list-photo-interaction é carregada por javascript?

Opa Thiago, nesse caso é mais por comparação mesmo, eu olho a página no navegador quando abre normalmente e depois eu olho após desativar o javascript e carregar a página novamente.

O ponto importante é que o javascript é executado apenas no navegador (normalmente), então ao acessar o site pelo urlopen não estamos passando por essa etapa, estamos trabalhando direto com os dados como foram enviados pelo servidor.

Entendi, muito obrigado Lucas!