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.
Untuk mengikis gambar dari Yahoo Images, Anda memerlukan pustaka Python berikut ini:
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
Pertama, kita perlu mengimpor pustaka yang diperlukan untuk scraper kita.
import requests
from lxml import html
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
)
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.
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)
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)
Saat mengikis data dari Yahoo, penting untuk mengetahui mekanisme pendeteksian bot Yahoo. Yahoo terutama menggunakan teknik ini untuk mengidentifikasi dan memblokir bot otomatis:
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)
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