Taktik Scraping Web Python Tingkat Lanjut

Komentar: 0

Mengambil data dari sebuah situs web jauh lebih dari sekadar mengambil kontennya; ada banyak hal yang terlibat di dalamnya. Untuk menerobos batas, celah, dan blok canggih lainnya, banyak metode tambahan yang harus digunakan seperti pengikisan data Python.

Untuk artikel ini, kita akan mendefinisikan apa itu scraping Python, dan menjustifikasi mengapa scraping Python adalah alat yang optimal untuk tugas tersebut. Dan juga menguraikan taktik yang memanfaatkan kemampuan pengikisan data Python. Semua ini akan membantu dalam mengambil informasi bahkan dari situs yang paling aman sekalipun.

Mengapa Python Ideal untuk Web Scraping

Alat ini secara khusus dirancang untuk menjadi sumber daya yang sangat baik untuk mengambil data dari situs web. Terlepas dari kegunaannya, pustaka Python seperti Scrapy, Selenium, dan BeautifulSoup juga sangat kuat. Selain itu, ada komunitas baru yang aktif yang terus mengembangkan skrip dan memberikan dukungan kepada pengguna baru. Itulah mengapa Python digunakan untuk web scraping saat ini. Jadi, mari kita menyoroti strategi utama yang tersedia saat ini.

Taktik Mengikis dengan Python

Blok ini akan menunjukkan kepada pengguna cara mengikis situs web yang kompleks menggunakan teknik yang lebih canggih yang dibangun ke dalam Python. Pengguna akan belajar bagaimana caranya:

  • Hindari diblokir oleh proteksi bot - tangani CAPTCHA, honeypot, dan sidik jari TLS.
  • Bertindaklah sebagai pengguna yang sebenarnya agar tidak diblokir.
  • Mengontrol cookie dan sesi agar tetap terautentikasi saat mengakses halaman yang dibatasi.
  • Mengelola data yang diperoleh dari API dan menangani data yang dimuat secara asinkron.
  • Lindungi skrip dari modifikasi pada halaman dan perbaiki logika untuk sumber daya dinamis.

Pendekatan-pendekatan ini akan membantu membuat scraping data Python menjadi efektif sekaligus meminimalkan kemungkinan diblokir atau ditolak aksesnya dari server.

Sekarang, mari kita lanjutkan ke taktik tentang cara melakukan scraping di Python dengan cara yang efektif.

Taktik 1: Menangani CAPTCHA dan Tindakan Anti-Bot

Banyak sekali situs web yang menerapkan sistem keamanan CAPTCHA sebagai garis pertahanan terbaik untuk melindungi informasi mereka dari pengikisan data secara terencana dari Python. Sistem seperti itu dapat dikalahkan dengan berbagai cara, menggunakan layanan pengenalan otomatis, seperti 2Captcha atau Anti-Captcha, atau menggunakan pembelajaran mesin untuk mengidentifikasi gambar secara kognitif. Kemungkinan lain adalah mengurangi jumlah pertanyaan ke tingkat yang tidak diasosiasikan oleh pengadilan dengan ekspektasi pengumpulan informasi.

Taktik 2: Meniru Perilaku Manusia

Untuk membuat kueri tidak terlalu mengganggu, pengguna harus bertindak dengan cara yang lebih mendekati perilaku normal. Memperkenalkan waktu acak di antara tindakan, mengganti User-Agent, menggulir halaman, menggerakkan penunjuk mouse, mensimulasikan penulisan, dan banyak lagi. Penggunaan Selenium atau Playwright sebagai alat pengikis Python memberikan otomatisasi yang jauh lebih mirip manusia sehingga blok dapat dihindari.

  • Mengubah Agen Pengguna:
    
    import random
    import requests
    
    url = 'https://google.com'
    
    user_agents = [
       'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
       'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
       'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
    ]
    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',
       'dnt': '1',
       'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
       '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',
    }
    
    
    headers['user-agent'] = random.choice(user_agents)
    response = requests.get(url=url, headers=headers)
    
    
    
  • Pergerakan kursor:
    
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.common.action_chains import ActionChains
    
    options = webdriver.ChromeOptions()
    options.add_argument("--headless")  # Menjalankan browser tanpa antarmuka grafis
    driver = webdriver.Chrome(options=options)
    
    driver.get("https://google.com")
    
    # Menemukan elemen dengan XPath
    element = driver.find_element(By.XPATH, "//button[text()=Confirm]")
    
    # Gunakan ActionChains untuk memindahkan kursor
    actions = ActionChains(driver)
    actions.move_to_element(element).perform()
    
    # Tutup browser
    driver.quit()
    
    
    

Taktik 3: Menghindari Jebakan Honeypot

Situs web tertentu menyematkan elemen tambahan yang dirancang untuk pengguna biasa yang tidak terlihat, namun bot dapat secara tidak sengaja memicunya. Elemen-elemen ini termasuk formulir tersembunyi, mengklik dan mengirimkannya akan mengakibatkan situs melarang akses bot. Sebelum pengumpulan data, gunakan gaya dan atribut CSS seperti display: none atau opacity: 0 dan hindari penggunaan gaya tersebut.

Taktik 4: Mengelola Cookie dan Sesi

Jika permintaan dibuat tanpa cookie atau konfigurasi sesi yang benar, situs tertentu akan memblokir permintaan berulang yang dianggap terlalu sederhana. Untuk mengatasi masalah ini, gunakan request.Session(), gunakan cookie yang disimpan, dan bertindaklah sebagai pengguna asli. Mengubah header User-Agent juga perlu dilakukan karena bot akan dikenali oleh mereka.

Taktik 5: Menerapkan Backoff Eksponensial untuk Permintaan Ulang untuk Penggalian Data Python

Jika server gagal merespons atau mengembalikan kesalahan untuk sementara, jeda sebelum memasukkan upaya lebih lanjut untuk mengulangi perintah. Backoff eksponensial lebih disukai - ini mengacu pada peningkatan waktu tunggu setelah setiap upaya yang gagal. Misalnya, seseorang dapat meningkatkannya dengan 1 detik, 2 detik, lalu 4 detik, dll. Hal ini akan mengurangi kemungkinan diblokir sekaligus meminimalkan keterbatasan situs web dan mengurangi beban kerja pengikisan data dengan Python.


import time
import requests


def fetch_with_backoff(url, max_retries=5):
   retries = 0
   wait_time = 1  # Penundaan 1 detik

   while retries < max_retries:
       try:
           response = requests.get(url)

           # Jika permintaan berhasil, kembalikan hasilnya
           if response.status_code == 200:
               return response.text

           print(f"Error {response.status_code}. Retrying in {wait_time} sec.")

       except requests.exceptions.RequestException as e:
           print(f"Connection error: {e}. Retrying in {wait_time} sec.")

       # Tunggu sebelum mencoba kembali
       time.sleep(wait_time)

       # Meningkatkan penundaan
       wait_time *= 2
       retries += 1

   return None


url = "https://google.com"
html = fetch_with_backoff(url)


Taktik 6: Memanfaatkan Peramban Tanpa Kepala untuk Interaksi yang Kompleks

Beberapa situs web mungkin memuat konten secara bertahap, atau mungkin hanya berfungsi setelah menerima beberapa masukan dari pengguna. Dalam kasus seperti itu, pustaka seperti BeautifulSoup tidak mungkin membantu. Dalam kasus ini, web scraping dengan Selenium, Puppeteer, dan Playwright akan membantu. Mereka memungkinkan Anda untuk membuka halaman seperti pengguna normal, yang berarti mereka dapat mengklik tombol, mengetik teks, dan berinteraksi dengan elemen-elemen pada halaman.

Taktik 7: Penggalian Data Python dari Pemuatan Asinkron

Ada beberapa halaman web yang tidak akan menggunakan JavaScript untuk menampilkan data sampai pengguna mengakses halaman web tersebut. Dengan ini, permintaan HTTP standar tidak akan mengambil semua informasi yang diperlukan. Selenium dapat digunakan untuk mengumpulkan informasi tersebut, atau permintaan jaringan dapat diteliti menggunakan DevTools peramban. Hal ini membantu dalam mendeteksi titik akhir API yang tersembunyi, yang nantinya dapat digunakan untuk pengambilan informasi dengan sedikit kerumitan.

Taktik 8: Mendeteksi dan Menghindari Sidik Jari TLS

Mayoritas situs web meneruskan permintaan otomatis ke server untuk diproses lebih lanjut. Sudah diketahui bahwa beberapa situs web memverifikasi sidik jari TLS sebagai cara untuk membedakan permintaan otomatis. Itu berarti server mempelajari berbagai atribut koneksi seperti perhatian TLS/SSL menggunakan teknologi, sandi, dan koneksi canggih lainnya. Mencapai hal itu dapat dilakukan dengan mencampurkan atribut koneksi dalam permintaan dengan menggunakan header dan proksi khusus.

  • Mengintegrasikan proksi:
    
    import requests
    
    url = 'username:password@your-proxy'
    
    proxy = 'your-proxy'
    proxies = {
       "http": f"http://{proxy}",
       "https": f"https://{proxy}",
    }
    response = requests.get(url=url, proxies=proxies)
    
    
    

Taktik 9: Memanfaatkan Titik Akhir API Jika Tersedia

Jika sebuah situs web menawarkan API publik, disarankan untuk menggunakannya daripada menggunakan scraping. Pendekatan ini lebih cepat, lebih dapat diandalkan, dan lebih kecil kemungkinannya untuk diblokir. Titik awal yang baik untuk menemukan titik akhir API adalah dengan memeriksa permintaan yang dibuat situs web, yang dapat dilihat di DevTools. Jika tidak ada API, Anda harus bekerja dengan kode HTML.

Taktik 10: Memantau Perubahan Struktur Situs Web

Situs web dapat memodifikasi kodenya, yang dapat menunda pengikisan. Sebagai penghitung, pertimbangkan hal berikut ini:

  • Beralih dari menggunakan selektor CSS ke XPath;
  • Gunakan pengujian otomatis untuk memantau struktur halaman secara berkala;
  • Buat kode cerdas yang dapat menangani perubahan yang mungkin terjadi. Salah satu caranya adalah dengan mencari elemen berdasarkan isinya, bukan berdasarkan jalur yang sudah ditentukan.

Taktik 11: Memastikan Kepatuhan terhadap Persyaratan Layanan Situs Web

Dalam beberapa kasus, scraping web dengan Python dari situs web dapat melanggar persyaratan penggunaan atau bahkan dianggap ilegal di yurisdiksi tertentu. Sangat penting untuk memeriksa robots.txt dan persyaratan layanan di samping kebijakan situs sebelum melakukan scraping data. Sebaiknya gunakan API publik jika tersedia. Selain itu, tetapkan batas jumlah permintaan untuk meminimalkan beban pada server.

Pengikisan Data Python: Kesimpulan

Scraping web tingkat lanjut dengan Python memiliki keuntungan tersendiri, tetapi melakukannya dengan cara yang benar juga sama pentingnya. Kami telah membahas aspek-aspek penting dari proses tersebut terkait dengan melewati CAPTCHA, mensimulasikan tindakan pengguna, mengelola cookie dan sesi, berurusan dengan honeypot, dan memeriksa data dalam aplikasi web asinkron.

Selain itu, ingatlah aspek moral dan perjanjian yang relevan dari situs yang digunakan. Manfaatkan titik akhir API jika tersedia, dan jika penguraian HTML tidak dapat dihindari, ikuti semua panduan untuk mengurangi kemungkinan diblokir dan mengalami komplikasi hukum.

Dengan menggunakan metode tutorial web scraping dengan Python ini, potensi risiko dapat dikurangi secara signifikan, sementara kemanjuran dapat ditingkatkan secara maksimal.

Komentar:

0 komentar