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.
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.
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:
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.
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.
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.
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)
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()
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.
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.
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)
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.
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.
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.
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)
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.
Situs web dapat memodifikasi kodenya, yang dapat menunda pengikisan. Sebagai penghitung, pertimbangkan hal berikut ini:
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.
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