Daftar Isi
Apa itu pengikisan web?
Pengikisan web adalah metode otomatis yang digunakan untuk mengekstraksi data publik dalam jumlah besar dari situs web. Ia menggunakan perangkat lunak untuk menavigasi situs web, mengambil informasi yang diinginkan dan menyimpannya untuk analisis atau pengeditan lebih lanjut.
Pada dasarnya, web scraping meniru tindakan pengguna manusia saat menjelajahi situs web, tetapi dengan kecepatan yang jauh lebih cepat dan efisien. Proses ini biasanya melibatkan pengaksesan kode HTML halaman web, menganalisisnya untuk menemukan data yang relevan, lalu mengekstraksi dan mengatur data tersebut ke dalam format terstruktur seperti spreadsheet atau database.
Pengikisan web telah menjadi sangat berharga di berbagai bidang termasuk ilmu data, riset pasar, dan intelijen bisnis. Dengan mengotomatiskan proses pengumpulan data dari sumber online, perusahaan dapat dengan cepat dan efisien mengumpulkan informasi dalam jumlah besar, memungkinkan mereka mengambil keputusan yang tepat dan mendapatkan wawasan kompetitif.
Namun, penting untuk dicatat bahwa pertimbangan legalitas dan etika seputar web scraping bervariasi tergantung pada ketentuan penggunaan situs dan jenis data yang dikumpulkan - dan masih banyak lagi. Oleh karena itu, pengguna web scraping harus berhati-hati dan mematuhi praktik terbaik untuk memastikan kepatuhan terhadap standar hukum dan etika.
Pengumpulan data dengan REST API
Sebagai pengembang perangkat lunak, kita terbiasa berurusan dengan struktur data yang terstruktur dengan baik atau setidaknya semi-terstruktur.
Ketika data perlu dipertukarkan antar aplikasi, kami menggunakan format serialisasi seperti XML, JSON atau format serupa. Ini sangat berguna untuk bertukar data melalui HTTP.
Berbagai macam alat didasarkan pada API (Application Programming Interfaces), yang didasarkan pada HTTP. Banyak perusahaan menawarkan pelanggannya akses ke sistem mereka melalui REST (Representational State Transfer) API.
Dengan Python, kita dapat mengakses REST API menggunakan modul bawaan dari perpustakaan standar.
import urllib.request
import json
def get_weather_with_urllib(API_KEY, city):
url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={API_KEY}"
response = urllib.request.urlopen(url)
return json.loads(response.read())
Kode di atas membuka koneksi HTTP api.openweathermap.org
dan kemudian melakukan operasi GET pada sumber daya API di /data/2.5/weather
dengan urllib.request
Modul. Hasilnya adalah objek seperti file yang dapat dibaca dan diurai menggunakan modul JSON.
Meskipun ini terlihat cukup sederhana, menangani permintaan yang lebih kompleks, kode status, berbagai kata kerja HTTP, penanganan sesi, dan hal-hal lain dapat menyebabkan kode panjang.
Pustaka pihak ketiga yang umum digunakan untuk mengelola permintaan HTTP dengan Python adalah Requests oleh Kenneth Reitz, seorang programmer Python yang terkenal di komunitas karena berbagai kontribusi dan paket perangkat lunaknya.
Anda dapat menginstal Permintaan dengan menggunakan pip pada baris perintah Anda:
python -m pip install requests
Dengan permintaan, skrip kecil kami akan terlihat seperti ini:
import requests
def get_weather_with_requests(API_KEY, city):
url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={API_KEY}"
response = requests.get(url)
return response.json()
Perhatikan bahwa satu-satunya perbedaan di sini adalah yang kami gunakan response.json
alih-alih json.loads(response.read())
untuk menganalisis jawabannya. Bersabarlah dengan saya. Kita akan melihat lebih banyak contoh di mana modul persyaratan menonjol.
REST API
Sebagai pengembang perangkat lunak, kita terbiasa berurusan dengan struktur data yang terstruktur dengan baik atau setidaknya semi-terstruktur. Ketika data perlu dipertukarkan antar aplikasi, kami menggunakan format serialisasi seperti XML, JSON atau format serupa.
Untungnya, ada banyak API tersedia yang menyediakan beragam kumpulan data berbeda.
Pada prinsipnya, kita telah melihat di pendahuluan cara mengakses REST API dengan Python.
Panduan mini ini berfokus pada web scraping, yang berarti sebagian besar kami tidak memiliki akses ke data terstruktur. Sebagai gantinya, kita perlu mengekstrak data dari kode HTML sebuah situs web.
Sup yang enak
Misalnya, toko eCommerce dengan ratusan produk.
Data seringkali tidak dapat diakses dalam format terstruktur dan dapat dibaca mesin* (*Itu hanya separuh cerita: HTML, misalnya, masih merupakan format yang dapat dibaca mesin). Hal ini mungkin terjadi karena operator situs web tidak melihat pentingnya menyediakan data secara terstruktur - atau karena operator tidak ingin data dirayapi oleh robot. Kita akan melihat bagaimana menangani kasus terakhir pada bab terakhir.
BeautifulSoup adalah pustaka Python yang memudahkan mengekstrak informasi dari halaman web. Itu berada di atas parser HTML atau XML dan menyediakan idiom Pythonic untuk mengulangi, mencari, dan memodifikasi pohon parse.
Ini sering digunakan bersama dengan perpustakaan permintaan yang digunakan untuk mengunduh konten halaman web. beautifulsoup
kemudian digunakan untuk mengurai konten HTML.
Berikut adalah contoh bagaimana Anda dapat menggunakannya beautifulsoup
Telusuri situs web:
import requests
from bs4 import BeautifulSoup
url = "https://books.toscrape.com"
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
book_titles = (a("title") for a in soup.select("h3 a"))
Tdk lengkap
Scrapy adalah kerangka web scraping yang kuat dan fleksibel yang ditulis dengan Python. Anggap saja sebagai kombinasi Permintaan dan BeautifulSoup, tetapi dengan lebih banyak fitur.
Misalnya, Scrapy dapat menangani penomoran halaman dengan mengikuti tautan dan mengekstrak data dari JSON dan XML. Ini juga menyediakan cara untuk menyimpan data yang diekstraksi dalam database dan menjalankan pekerjaan scraping secara paralel.
Dengan Scrapy, Anda membuat kelas “Spider” yang mendefinisikan bagaimana situs web di-scrap. Kelas Spider berisi logika untuk mengekstraksi data dari situs web dan melacak tautan ke halaman lain.
Sebelum kita masuk ke detailnya, berikut adalah contoh singkat kelas Spider untuk Scrapy:
import scrapy
class BooksSpider(scrapy.Spider):
name = "books"
start_urls = ("http://books.toscrape.com")
def parse(self, response):
for article in response.css('article.product_pod'):
yield {
'title': article.css("h3 > a::attr(title)").extract_first(),
'price': article.css(".price_color::text").extract_first()
}
Dalam contoh ini, kami mendefinisikan kelas laba-laba bernama BooksSpider yang merayapi situs web http://books.toscrape.com
. Metode Parse dipanggil dengan respon dari URL awal. Ini mengekstrak judul dan harga setiap buku di halaman dan membuat kamus dengan data yang diekstraksi.
Untuk menjalankan spider, Anda dapat menyimpan kode dalam file bernama Books_spider.py dan menjalankannya dengan itu scrapy runspider
Memerintah:
scrapy runspider books_spider.py
Di entri berikutnya dari panduan mini ini, kita akan mendalami Scrapy lebih dalam dan menjelajahi fitur-fiturnya lebih jauh.
Hambatan Umum dalam Pengikisan Web
Bagian ini membahas kendala umum yang dihadapi saat melakukan scraping situs web. Topik yang dibahas adalah:
- penomoran halaman
- JavaScript / Rendering Sisi Klien
- Deteksi bot
- Pertemuan dan pendaftaran
1. Berurusan dengan penomoran halaman
Penomoran halaman adalah kendala umum saat menggores situs web. Ini memecah sejumlah besar data menjadi bagian-bagian yang lebih kecil dan lebih mudah dikelola dengan membaginya menjadi beberapa halaman, masing-masing berisi subset dari total data. Penomoran halaman sering kali digunakan untuk meningkatkan pengalaman pengguna dengan mengurangi jumlah data yang ditampilkan pada satu halaman dan membuat konten lebih mudah dinavigasi.
Saat mengikis situs web dengan penomoran halaman, Anda perlu mempertimbangkan bagaimana Anda akan menavigasi halaman untuk mengakses semua data yang ingin Anda kikis.
Seperti inilah tampilannya beautifulsoup
dan pertanyaan:
import requests
from bs4 import BeautifulSoup
url = "https://books.toscrape.com"
def get_entries(url):
entries = ()
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
# Find all h3.a tags and extract the title attribute from the a tag
entries += (a("title") for a in soup.select("h3 a"))
# Find the next page link
next_page = soup.select_one("li.next a")
if next_page:
next_page_url = requests.compat.urljoin(url, next_page("href"))
entries += get_entries(next_page_url)
return entries
get_entries(url)
Perhatikan bahwa kita harus mengurus penggabungan URL secara manual. Hal ini karena href
atribut dari a
Tag hanya berisi jalur relatif ke halaman berikutnya. Kita perlu menautkannya dengan URL dasar untuk mendapatkan URL lengkap.
Dengan Scrapy kita bisa menggunakannya response.follow
Metode untuk mengikuti tautan. Metode ini menggunakan URL dan fungsi panggilan balik sebagai argumen. Fungsi panggilan balik dipanggil dengan respons URL baru.
Seperti inilah penampakan laba-laba yang suka berkelahi:
import scrapy
class BooksSpider(scrapy.Spider):
name = "books"
allowed_domains = ("books.toscrape.com")
start_urls = ("http://books.toscrape.com")
def parse(self, response):
self.log(f"I just visited {response.url}")
for article in response.css('article.product_pod'):
yield {
'title': article.css("h3 > a::attr(title)").extract_first(),
'price': article.css(".price_color::text").extract_first()
}
next_page_url = response.css("li.next > a::attr(href)").get()
if next_page_url:
yield response.follow(url=next_page_url, callback=self.parse)
2. Render sisi klien
Jika situs web menggunakan JavaScript untuk merender kontennya, mungkin akan sulit mengekstrak datanya. Alasannya adalah konten tersebut tidak ada dalam kode sumber HTML yang dikembalikan dari server. Sebaliknya, konten dihasilkan oleh kode JavaScript yang berjalan di browser.
Karena skrip Python Anda biasanya tidak menjalankan JavaScript, Anda tidak bisa begitu saja meminta dan menggunakan beautifulsoup
untuk mengikis data. Anda harus menggunakan alat yang dapat menjalankan JavaScript, seperti B.Penulis drama.
Playwright adalah perpustakaan Node.js yang menyediakan API tingkat tinggi untuk otomatisasi browser. Ini memungkinkan Anda berinteraksi dengan halaman web dengan cara yang mensimulasikan interaksi pengguna nyata dengan browser. Ini membuatnya ideal untuk menyalin situs web yang menggunakan JavaScript untuk merender konten.
Kita bisa menggunakan penulis naskah drama dalam laba-laba yang suka berkelahi. Berikut adalah contoh bagaimana Anda dapat menggunakan Playwright untuk mengikis situs web dengan rendering sisi klien:
import scrapy
from playwright.sync_api import sync_playwright
class QuotesSpider(scrapy.Spider):
name = 'quotes'
start_urls = ('http://quotes.toscrape.com/js')
def parse(self, response):
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto(response.url)
quotes = page.query_selector_all('.quote')
for quote in quotes:
yield {
'text': quote.query_selector('.text').inner_text(),
'author': quote.query_selector('.author').inner_text(),
'tags': (tag.inner_text() for tag in quote.query_selector_all('.tag'))
}
browser.close()
3. Deteksi bot
Beberapa situs web mungkin membatasi akses ke bot. Hal ini dapat dilakukan dengan memeriksa header User-Agent dari permintaan HTTP. Header Agen-Pengguna adalah string yang mengidentifikasi browser dan sistem operasi klien. Jika header Agen-Pengguna tidak disetel atau disetel ke nilai yang tidak dikenali oleh server, server dapat memblokir permintaan tersebut.
Namun, ada cara yang lebih canggih untuk mendeteksi bot. Misalnya, server dapat memeriksa tingkat permintaan klien. Jika klien mengirimkan terlalu banyak permintaan dalam waktu singkat, server mungkin memblokir klien. Alamat IP Anda juga dapat masuk daftar hitam jika Anda mengirim terlalu banyak permintaan.
Saat menjelajahi Internet, Anda mungkin menemukan CAPTCHA dari waktu ke waktu.
Tantangan tersebut dimaksudkan untuk membedakan antara manusia dan bot. Mereka sering digunakan untuk mencegah bot merayapi situs web. Jika Anda menemukan CAPTCHA saat menyalin situs web, Anda dapat melewatinya menggunakan layanan pemecah CAPTCHA.
Terkait: Cara melewati CAPTCHA saat menggores Amazon.
4. Pertemuan dan pendaftaran
Beberapa situs web mengharuskan pengguna untuk login sebelum mengakses halaman tertentu. Ini adalah kendala umum saat melakukan scraping situs web. Namun, untuk menghindari entri pertama ini lebih besar dari yang diperlukan, kami akan menjelaskan cara menangani permintaan sesi dan login saat menyalin situs web di bagian kedua dari panduan mini kami.