Cara mengikis gambar dari Yahoo Images menggunakan Python

Komentar: 0

Mengikis gambar dari Yahoo Image Search merupakan hal yang penting ketika menghasilkan kumpulan data gambar. Panduan ini menjelaskan cara mengikis gambar dari Yahoo Image Search menggunakan Python serta pustaka Request yang dikombinasikan dengan lxml untuk teknik penguraian HTML. Panduan ini juga membahas tentang penggunaan proxy untuk menghindari tertangkap oleh sistem deteksi bot Yahoo.

Alat dan pustaka yang diperlukan

Untuk mengikis gambar dari Yahoo Images, Anda memerlukan pustaka Python berikut ini:

  • Requests: Untuk membuat permintaan HTTP.
  • lxml: Untuk mengurai HTML.
  • Proxies: Untuk menghindari larangan IP selama pengikisan ekstensif.

Menginstal perpustakaan pihak ketiga

Pastikan Anda telah menginstal semua pustaka yang diperlukan. Instal dengan menggunakan pip:

pip install requests
pip install lxml

Atau gunakan satu perintah:

pip install requests lxml

Panduan langkah demi langkah untuk melakukan scraping dengan Python

Pertama, kita perlu mengimpor pustaka yang diperlukan untuk scraper kita.

import requests
from lxml import html

Melakukan pencarian Yahoo Images

Selanjutnya, kita akan melakukan pencarian di Yahoo Images.

Di sini kita akan mendefinisikan kueri penelusuran sebagai anak anjing dan mengirimkan permintaan GET ke penelusuran Gambar Yahoo dengan tajuk yang diperlukan. Header permintaan penting untuk meniru permintaan peramban, yang membantu melewati beberapa mekanisme deteksi bot dasar.

# Tentukan tajuk untuk meniru permintaan 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",
}

# Tentukan kueri penelusuran
search_query = "puppies"

# Membuat permintaan GET ke halaman pencarian Gambar Yahoo
response = requests.get(
    url=f"https://images.search.yahoo.com/search/images?p={search_query}",
    headers=headers
)

Mengurai URL gambar dengan lxml

Setelah menerima jawaban dari Yahoo, kita perlu mengurai HTML untuk mengekstrak URL gambar. Kami menggunakan lxml untuk tujuan ini.

# Mengurai respons HTML
parser = fromstring(response.text)

# Mengekstrak URL gambar menggunakan XPath
images_urls = parser.xpath("//li[contains(@id, 'resitem-')]/a//@src")

Fungsi fromstring digunakan untuk mengurai teks respons HTML. Xpath digunakan untuk mengekstrak URL gambar. Tangkapan layar di bawah ini menunjukkan bagaimana xpath diperoleh.

yaho.png

Unduh gambar

Dengan daftar URL gambar, sekarang kita perlu mengunduh setiap gambar.

Di sini, kita akan mengulang daftar images_urls untuk mengekstrak jumlah (indeks) dan url (alamat). Setiap gambar kemudian akan diunduh dengan mengirimkan permintaan GET ke url yang bersangkutan.

# Unduh setiap gambar dan simpan ke sebuah file
for count, url in enumerate(images_urls):
    response = requests.get(url=url, headers=headers)

Menyimpan gambar

Terakhir, kita menyimpan gambar yang telah diunduh ke sistem berkas lokal. Kita mendefinisikan sebuah fungsi download_file yang menangani proses penyimpanan file.

Fungsi ini mengambil hitungan (untuk membuat nama file yang unik) dan respons (berisi data gambar). Fungsi ini menentukan ekstensi file dari header Jenis Konten dan menyimpan file dalam direktori ./images/.

def download_file(count, response):
    # Dapatkan ekstensi file dari header Jenis Konten
    extension = response.headers.get("Content-Type").split("/")[1]
    filename = "./images/" + str(count) + f".{extension}"

    # Buat direktori jika belum ada
    os.makedirs(os.path.dirname(filename), exist_ok=True)

    # Tulis konten tanggapan ke file
    with open(filename, "wb") as f:
        f.write(response.content)

Dengan memanggil fungsi ini di dalam loop, kita menyimpan setiap gambar yang diunduh:

for count, url in enumerate(images_urls):
    response = requests.get(url=url, headers=headers)
    download_file(count, response)

Mekanisme deteksi bot Yahoo

Saat mengikis data dari Yahoo, penting untuk mengetahui mekanisme pendeteksian bot Yahoo. Yahoo terutama menggunakan teknik ini untuk mengidentifikasi dan memblokir bot otomatis:

  • Pembatasan Laju IP: Yahoo memantau laju permintaan yang berasal dari satu alamat IP. Permintaan yang berlebihan dari satu IP dapat menyebabkan pemblokiran sementara atau permanen.
  • CAPTCHA: Yahoo dapat menerapkan CAPTCHA kepada pengguna untuk memverifikasi bahwa mereka adalah manusia.

Menggunakan proxy untuk menghindari deteksi

Untuk menghindari pemblokiran oleh mekanisme deteksi bot Yahoo, terutama ketika membuat beberapa permintaan dari IP yang sama, kami menggunakan proksi untuk menutupi alamat IP kami.

Dengan merutekan permintaan kami melalui proxy yang berbeda, kami dapat mendistribusikan aktivitas scraping kami ke beberapa alamat IP, sehingga mengurangi kemungkinan terdeteksi.

proxies = {
    'http': 'http://USER:PASS@HOST:PORT',
    'https': 'http://USER:PASS@HOST:PORT'
}
response = requests.get(url, headers=headers, proxies=proxies, verify=False)

Kode lengkap

Berikut ini adalah skrip lengkap untuk mengambil gambar dari hasil pencarian Yahoo Images menggunakan proxy:

import os
import requests
from lxml.html import fromstring


def download_file(count, response):
    """
    Menyimpan konten respons ke file di direktori ./images/.

    Args:
        count (int): Pengenal unik untuk file tersebut.
        response (requests.Response): Respons HTTP yang berisi konten file.

    """
    # Dapatkan ekstensi file dari header Jenis Konten
    extension = response.headers.get("Content-Type").split("/")[1]
    filename = "./images/" + str(count) + f".{extension}"

    # Buat direktori jika belum ada
    os.makedirs(os.path.dirname(filename), exist_ok=True)

    # Tulis konten tanggapan ke file
    with open(filename, "wb") as f:
        f.write(response.content)


def main():
    """
    Fungsi utama untuk mencari gambar dan mengunduhnya.

    Fungsi ini melakukan langkah-langkah berikut ini:
    1. Menyiapkan tajuk permintaan.
    2. Mencari gambar anak anjing di Yahoo.
    3. Mengurai respons HTML untuk mengekstrak URL gambar.
    4. Mengunduh setiap gambar dan menyimpannya ke direktori ./images/.

    """
    # Tentukan tajuk untuk meniru permintaan 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",
    }

    # Tentukan proksi untuk melewati pembatasan laju
    proxies = {"http": "http://USER:PASS@HOST:PORT", "https": "http://USER:PASS@HOST:PORT"}

    # Tentukan kueri penelusuran
    search_query = "puppies"

    # Membuat permintaan GET ke halaman pencarian Gambar Yahoo
    response = requests.get(
        url=f"https://images.search.yahoo.com/search/images?p={search_query}",
        headers=headers,
        proxies=proxies,
        verify=False
    )

    # Mengurai respons HTML
    parser = fromstring(response.text)

    # Mengekstrak URL gambar menggunakan XPath
    images_urls = parser.xpath("//li[contains(@id, 'resitem-')]/a//@src")

    # Unduh setiap gambar dan simpan ke sebuah file
    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()

Mengikis gambar dari Yahoo Image Search menggunakan Python adalah teknik yang ampuh untuk mengotomatiskan tugas pengumpulan dan analisis data. Dengan memanfaatkan pustaka Request untuk permintaan HTTP dan pustaka lxml untuk penguraian HTML, Anda dapat mengekstrak URL gambar secara efisien dan mengunduh gambar. Memasukkan proksi membantu Anda menghindari deteksi dan mencegah larangan IP selama aktivitas pengikisan yang ekstensif.

Komentar:

0 komentar