Tutorial passo-a-passo: Como extrair imagens usando Python

Guias, Como fazer, Raspagem, Set-05-20245 minutos de leitura

Nesta publicação do blogue, vamos guiá-lo através do processo de recolha de imagens de Web sites utilizando Python. Aprenderá a começar a utilizar bibliotecas populares, a lidar com potenciais armadilhas e até a explorar técnicas avançadas para levar as suas capacidades de recolha de imagens da Web para o próximo nível.

Noções básicas de raspagem de imagens com Python

Para começar a fazer scraping de imagens com Python, vai precisar de se familiarizar com algumas bibliotecas chave que facilitam esta tarefa. As escolhas mais populares são BeautifulSoup, Scrapy e Requests.

BeautifulSoup para extrair URLs de imagens

BeautifulSoup é uma biblioteca Python utilizada para analisar documentos HTML e XML. Cria uma árvore de análise a partir dos códigos-fonte da página que pode ser utilizada para extrair dados facilmente.

Eis um exemplo simples de como extrair URLs de imagens utilizando a BeautifulSoup:

Passo 1: Instalar BeautifulSoup e Requests:

 pip install bs4 requests

Passo 2: Extrair URLs de imagens:

 importar pedidos
 from bs4 import BeautifulSoup

 url = 'https://books.toscrape.com/'

 resposta = requests.get(url)

 soup = BeautifulSoup(response.text, 'html.parser')
 imagens = soup.find_all('img')

This code fetches the HTML content of the specified URL, parses it with BeautifulSoup, and then finds all the `<img>` tags, printing out their `src` attributes.

Descarregando imagens com Python

Depois de extrair os URLs das imagens, o próximo passo é fazer o download delas. A biblioteca Requests é perfeita para esta tarefa devido à sua simplicidade e facilidade de utilização.

Utilizar pedidos para descarregar imagens

Eis como pode descarregar imagens utilizando os Pedidos:

Transferir imagem do URL:

for ind, img in enumerate(images):
   img_data = requests.get(url+img['src']).content
   with open(f'image_{ind+1}.jpg', 'wb') as handler:
       handler.write(img_data)

Este script envia um pedido GET para o URL da imagem e escreve o conteúdo binário da imagem num ficheiro.

Tratamento de erros e excepções

É importante tratar os erros e as excepções para garantir que o seu script funciona sem problemas, mesmo quando surgem problemas. Aqui está uma versão melhorada do script anterior:

Tratamento de erros:

for ind, img in enumerate(images):
   try:
       img_data = requests.get(url+img['src']).content
       with open(f'image_{ind+1}.jpg', 'wb') as handler:
           handler.write(img_data)
   except Exception as e:
       print(f"An error occurred during the extraction of image \n Image Url: {img['src']} \n Error: {e}")

Este trecho de código inclui um bloco try-except para capturar quaisquer erros que possam ocorrer durante o processo de download.

Técnicas avançadas de exploração de imagens

Para tarefas de raspagem mais complexas, como raspar várias páginas ou sites inteiros, o Scrapy é uma biblioteca poderosa que pode lidar com esses cenários de forma eficiente.

Usando o Scrapy para tarefas complexas

Scrapy é uma estrutura de código aberto e colaborativa de rastreamento da Web para Python. Foi concebido para ser rápido e eficiente, tornando-o ideal para projectos de raspagem em grande escala.

Passo 1: Instalar o Scrapy:

 pip install scrapy

Passo 2: Criar um projeto Scrapy:

 scrapy startproject image_scraper
 cd image_scraper

Passo 3: Definir uma aranha:

Criar um ficheiro spider (`spiders/image_spider.py`) com o seguinte conteúdo:

import scrapy
class ImageSpider(scrapy.Spider):
   name = 'imagespider'
   start_urls = ['https://books.toscrape.com/']
   def parse(self, response):
       # Extract image URLs and convert them to absolute if necessary
       for img in response.css('img::attr(src)').getall():
           abs_img_url = response.urljoin(img)
           yield {'image_url': abs_img_url}
      
       # Find the link to the next page and create a request for it
       next_page = response.css('a.next::attr(href)').get()
       if next_page is not None:
           next_page_url = response.urljoin(next_page)
           yield response.follow(next_page_url, self.parse)

Esta simples aranha Scrapy começa no URL fornecido, extrai todos os URLs de imagens e segue as hiperligações da página seguinte para continuar a recolha.

Melhorar os seus projectos de exploração de imagens

Para melhorar ainda mais os seus projectos de raspagem, considere a utilização de APIs para aceder a imagens de alta qualidade e automatizar as suas tarefas para maior eficiência.

Utilização de APIs para Image Scraping

As APIs proporcionam uma forma fiável e legal de aceder a imagens. Muitos sítios Web oferecem APIs que permitem pesquisar e descarregar imagens de forma programática. Um desses sítios é a API Unsplash.

Exemplo com a API Unsplash:

import requests
# Replace 'YOUR_ACCESS_KEY' with your actual Unsplash Access Key
api_url = "https://api.unsplash.com/photos/random"
headers = {"Authorization": "Client-ID YOUR_ACCESS_KEY"}
params = {"query": "nature"}
try:
   response = requests.get(api_url, headers=headers, params=params)
   response.raise_for_status()  # This will raise an exception for HTTP errors
   data = response.json()
   image_url = data['urls']['full']
   print(image_url)
except requests.exceptions.HTTPError as err:
   print(f"HTTP error occurred: {err}")
except Exception as err:
   print(f"An error occurred: {err}")

Este script utiliza a API Unsplash para ir buscar uma imagem aleatória da natureza.

Automatização de tarefas de recolha de imagens

A automatização poupa tempo e assegura que as suas tarefas de recolha de dados são executadas sem problemas e sem intervenção manual. Ferramentas como cron jobs em sistemas Unix ou Task Scheduler no Windows podem programar os seus scripts para serem executados em intervalos regulares.

Tarefas Cron em sistemas Unix - Crontab:

O Crontab é um utilitário poderoso nos sistemas operativos do tipo Unix para agendar tarefas, conhecidas como"cron jobs", para serem executadas automaticamente a horas específicas. Vamos ver como podemos agendar uma tarefa usando o Crontab.

Compreender a sintaxe do Crontab:

Um ficheiro crontab consiste em linhas de comando, em que cada linha representa um trabalho separado. A sintaxe é a seguinte:

MIN HORA DOM SEG DOW CMD
  • MIN: Campo dos minutos (0 a 59)
  • HOUR: Campo de horas (0 a 23)
  • DOM: Dia do mês (1 a 31)
  • MON: Campo do mês (1 a 12)
  • DOW: Dia da semana (0 a 7, em que 0 e 7 representam o domingo)
  • CMD: O comando a executar (neste caso, será o executável do seu script python)

Aqui está um exemplo de execução de um script python diariamente às 8:00PM

0 20 * * * * /usr/bin/python3/path/to/Image_Scraper.py

Utilizar o Programador de Tarefas (Windows):

  • Abra o Programador de Tarefas (utilize a barra de pesquisa no Windows e procure "Programador de Tarefas")
  • Clique em"Criar tarefa básica"
  • Forneça um nome e uma descrição e clique em"Seguinte"
  • Selecione a granularidade ou o intervalo de que necessita para executar esta tarefa e clique em"Next"(Seguinte)
  • Certifique-se de quea opção "Iniciar um programa" está selecionada e clique em"Seguinte"
  • Forneça o caminho para o seu script python clicando em"Browse"(Procurar). Opcionalmente, se tiver de fornecer quaisquer argumentos para o seu script python, pode fazê-lo adicionando-os nos campos"Add arguments" (Adicionar argumentos) e clicando em"Next"(Seguinte)
  • Como último passo, basta clicar em"Finish" (Concluir) e, assim, esta tarefa está pronta para ser executada no intervalo especificado.

Conclusão

Nesta postagem do blog, exploramos como extrair imagens de sites usando Python. Cobrimos o básico com BeautifulSoup e Requests, técnicas avançadas com Scrapy e práticas éticas de raspagem. Além disso, discutimos como aprimorar seus projetos de raspagem usando APIs e ferramentas de automação como o Agendador de tarefas do Windows.

A recolha de imagens é uma competência poderosa que pode melhorar as suas capacidades de aquisição de dados e abrir novas possibilidades para os seus projectos.

Boa raspagem!