A extração de imagens do Yahoo Image Search é importante ao gerar conjuntos de dados de imagens. Este guia explica como extrair imagens do Yahoo Image Search usando Python, bem como a biblioteca Requests em combinação com lxml para técnicas de análise de HTML. Ele também aborda o uso de proxy para evitar ser pego pelos sistemas de deteção de bots do Yahoo.
Para extrair imagens do Yahoo Images, você precisará das seguintes bibliotecas Python:
Certifique-se de que tem todas as bibliotecas necessárias instaladas. Instale-as usando o pip:
pip install requests
pip install lxml
Ou utilizar um único comando:
pip install requests lxml
Primeiro, precisamos de importar as bibliotecas necessárias para o nosso scraper.
import requests
from lxml import html
Em seguida, faremos uma pesquisa no Yahoo Images.
Aqui vamos definir uma consulta de pesquisa como cachorros e enviar uma solicitação GET para a pesquisa do Yahoo Images com os cabeçalhos necessários. Os cabeçalhos da solicitação são importantes para imitar uma solicitação do navegador, o que ajuda a contornar alguns mecanismos básicos de deteção de bots.
# Definir cabeçalhos para imitar um pedido do browser
headers = {
"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"accept-language": "en-IN,en;q=0.9",
"cache-control": "max-age=0",
"dnt": "1",
"priority": "u=0, i",
"sec-ch-ua": '"Google Chrome";v="125", "Chromium";v="125", "Not.A/Brand";v="24"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Linux"',
"sec-fetch-dest": "document",
"sec-fetch-mode": "navigate",
"sec-fetch-site": "none",
"sec-fetch-user": "?1",
"upgrade-insecure-requests": "1",
"user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
}
# Definir a consulta de pesquisa
search_query = "puppies"
# Fazer um pedido GET para a página de pesquisa do Yahoo Images
response = requests.get(
url=f"https://images.search.yahoo.com/search/images?p={search_query}",
headers=headers
)
Depois de receber a resposta do Yahoo, precisamos analisar o HTML para extrair os URLs das imagens. Usamos o lxml para esse fim.
# Analisar a resposta HTML
parser = fromstring(response.text)
# Extrair URLs de imagens utilizando XPath
images_urls = parser.xpath("//li[contains(@id, 'resitem-')]/a//@src")
A função fromstring é utilizada para analisar o texto de resposta HTML. Xpath é usada para extrair URLs de imagens. A captura de tela abaixo mostra como o xpath foi obtido.
Com a lista de URLs de imagens, precisamos agora de fazer o download de cada imagem.
Aqui, vamos percorrer a lista images_urls para extrair tanto a contagem (índice) quanto a url (endereço). Cada imagem será então baixada enviando uma requisição GET para a respectiva url.
# Descarregar cada imagem e guardá-la num ficheiro
for count, url in enumerate(images_urls):
response = requests.get(url=url, headers=headers)
Finalmente, guardamos as imagens descarregadas no sistema de ficheiros local. Definimos uma função download_file que lida com o processo de salvar o arquivo.
Esta função recebe a contagem (para criar nomes de ficheiros únicos) e a resposta (que contém os dados da imagem). Determina a extensão do ficheiro a partir do cabeçalho Content-Type e guarda o ficheiro no diretório ./images/.
def download_file(count, response):
# Obter a extensão do ficheiro a partir do cabeçalho Content-Type
extension = response.headers.get("Content-Type").split("/")[1]
filename = "./images/" + str(count) + f".{extension}"
# Criar o diretório se este não existir
os.makedirs(os.path.dirname(filename), exist_ok=True)
# Escrever o conteúdo da resposta no ficheiro
with open(filename, "wb") as f:
f.write(response.content)
Ao chamar esta função dentro do ciclo, guardamos cada imagem descarregada:
for count, url in enumerate(images_urls):
response = requests.get(url=url, headers=headers)
download_file(count, response)
Ao extrair dados do Yahoo, é importante estar ciente dos mecanismos de deteção de bots do Yahoo. O Yahoo usa principalmente essas técnicas para identificar e bloquear bots automatizados:
Para evitar sermos bloqueados pelo mecanismo de deteção de bots do Yahoo, especialmente quando fazemos vários pedidos a partir do mesmo IP, utilizamos proxies para mascarar o nosso endereço IP.
Ao encaminhar os nossos pedidos através de diferentes proxies, podemos distribuir a nossa atividade de scraping por vários endereços IP, reduzindo assim a probabilidade de sermos detectados.
proxies = {
'http': 'http://USER:PASS@HOST:PORT',
'https': 'http://USER:PASS@HOST:PORT'
}
response = requests.get(url, headers=headers, proxies=proxies, verify=False)
Aqui está o script completo para extrair imagens dos resultados de pesquisa do Yahoo Images usando proxies:
import os
import requests
from lxml.html import fromstring
def download_file(count, response):
"""
Salva o conteúdo de uma resposta em um arquivo no diretório ./images/.
Args:
count (int): Um identificador único para o ficheiro.
response (requests.Response): A resposta HTTP que contém o conteúdo do ficheiro.
"""
# Obter a extensão do ficheiro a partir do cabeçalho Content-Type
extension = response.headers.get("Content-Type").split("/")[1]
filename = "./images/" + str(count) + f".{extension}"
# Criar o diretório se este não existir
os.makedirs(os.path.dirname(filename), exist_ok=True)
# Escrever o conteúdo da resposta no ficheiro
with open(filename, "wb") as f:
f.write(response.content)
def main():
"""
Função principal para procurar imagens e descarregá-las.
Esta função executa os seguintes passos:
1. Configura os cabeçalhos do pedido.
2. Procura por imagens de cachorros no Yahoo.
3. Analisa a resposta HTML para extrair os URLs das imagens.
4. Descarrega cada imagem e guarda-a no diretório ./images/.
"""
# Definir cabeçalhos para imitar um pedido do browser
headers = {
"accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"accept-language": "en-IN,en;q=0.9",
"cache-control": "max-age=0",
"dnt": "1",
"priority": "u=0, i",
"sec-ch-ua": '"Google Chrome";v="125", "Chromium";v="125", "Not.A/Brand";v="24"',
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": '"Linux"',
"sec-fetch-dest": "document",
"sec-fetch-mode": "navigate",
"sec-fetch-site": "none",
"sec-fetch-user": "?1",
"upgrade-insecure-requests": "1",
"user-agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36",
}
# Definir proxies para contornar a limitação de taxa
proxies = {"http": "http://USER:PASS@HOST:PORT", "https": "http://USER:PASS@HOST:PORT"}
# Definir a consulta de pesquisa
search_query = "puppies"
# Fazer um pedido GET para a página de pesquisa do Yahoo Images
response = requests.get(
url=f"https://images.search.yahoo.com/search/images?p={search_query}",
headers=headers,
proxies=proxies,
verify=False
)
# Analisar a resposta HTML
parser = fromstring(response.text)
# Extrair URLs de imagens utilizando XPath
images_urls = parser.xpath("//li[contains(@id, 'resitem-')]/a//@src")
# Descarregar cada imagem e guardá-la num ficheiro
for count, url in enumerate(images_urls):
response = requests.get(url=url, headers=headers, proxies=proxies, verify=False)
download_file(count, response)
if __name__ == "__main__":
main()
Extrair imagens do Yahoo Image Search utilizando Python é uma técnica poderosa para automatizar tarefas de recolha e análise de dados. Utilizando a biblioteca Requests para pedidos HTTP e a biblioteca lxml para análise de HTML, pode extrair eficazmente URLs de imagens e descarregar as imagens. A incorporação de proxies ajuda-o a evitar a deteção e a prevenir proibições de IP durante actividades de extração extensivas.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Comentários: 0