Beranda BlogPengikisan web Pengikisan web dengan Scrapy Python

Pengikisan web dengan Scrapy Python

oleh Kadek

Scrapy adalah kerangka web scraping paling populer dengan Python. Sebelumnya sudah ada review alat serupa. Berbeda dengan BeautifulSoup atau Selenium, Scrapy bukanlah perpustakaan. Keuntungan besarnya adalah alat ini sepenuhnya gratis.

Namun demikian, ini multifungsi dan dapat menyelesaikan sebagian besar tugas yang diperlukan saat menggores data, misalnya:

  1. Mendukung multi-threading.
  2. Dapat digunakan untuk berpindah dari satu tautan ke tautan lainnya.
  3. Cocok untuk ekstraksi data.
  4. Memungkinkan Anda melakukan validasi data.
  5. Menyimpan dalam format/database paling populer.

Scrapy menggunakan laba-laba, perayap mandiri dengan serangkaian instruksi khusus. Artinya, kode ini dapat dengan mudah diskalakan untuk proyek dengan ukuran berapa pun sambil menjaga kode tetap terstruktur dengan baik. Hal ini juga memungkinkan pengembang baru untuk memahami proses yang sedang berlangsung. Data yang tergores dapat disimpan dalam format CSV untuk diproses lebih lanjut oleh data scientist.

Cara menginstal Scrapy dengan Python

Sebelum mempelajari penggunaan praktis Scrapy, Anda harus menginstalnya. Ini dilakukan melalui baris perintah:

pip install scrapy

Untuk memastikan semuanya berjalan dengan baik, Anda dapat mengimpor Scrapy ke penerjemah menggunakan perintah:

>>> import scrapy

Dan jika tidak ada pesan error, maka semuanya berjalan dengan baik.


Impor Scrapy
Gunakan Impor Scrapy

Cara menggunakan XPath dengan Scrapy

Scrapy bekerja sama baiknya dengan penyeleksi XPath dan CSS. Namun, XPath memiliki sejumlah keunggulan, itulah sebabnya XPath lebih sering digunakan. Untuk menyederhanakan contoh, semua kode XPath dijalankan pada baris perintah. Untuk melakukan ini, buka shell Python khusus:

scrapy shell

Kemudian pilih situs yang akan dirayapi web dan gunakan perintah berikut:

fetch("http://example.com/")

contoh.com
scrapeexample.com

Hasil eksekusinya adalah sebagai berikut:

2022-07-20 14:50:33 (scrapy.core.engine) DEBUG: Crawled (200) <GET http://example.com/> (referer: None)

Hal ini wajar karena tidak ditentukan data mana yang perlu dirayapi. Di sekitar semua orang pada hari itu <html>… Untuk memilih data yang disimpan, cukup gunakan perintah berikut:

response.xpath("/html").extract()

Hasil eksekusi:

('<html>\N<head>\N <title>Contoh domain</title>\n\n <meta charset="utf-8">\N <meta http-equiv="Content-type" content= "text/html; charset=utf-8">\N <meta name="viewport" content="width=device-width, initial-scale=1">\N <style type="text/css">\ n body {\n background-color: #f0f0f2;\n margin: 0;\n padding: 0;\n font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans" , "Helvetica Neue", Helvetica, Arial, sans-serif;\n \n }\n div {\n width: 600px;\n margin: 5em auto;\n padding: 2em;\n background-color: #fdfdff ;\n border-radius: 0.5em;\n box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);\n }\na:link, a:visited {\n color: #38488f; \n text-decoration: none;\n }\n @media (max-width: 700px) {\n div {\n margin: 0 auto;\n width: auto;\n }\n }\n </style> \N</head>\n\n<body>\N<div>\N <h1>Contoh domain</h1>\N <p>Domain ini untuk digunakan dalam contoh ilustratif dalam dokumen. Anda dapat menggunakan domain ini dalam literatur tanpa koordinasi sebelumnya atau meminta izin.</p>\N <p><a href="https://www.iana.org/domains/example">Informasi lebih lanjut...</a></p>\N</div>\N</body>\N</html>')

Menggunakan XPath adalah standar dan tidak boleh berlebihan, tetapi sebagai contoh kami akan mencoba menggunakan konten dari

-Tag untuk dikembalikan:

&gt;&gt;&gt; respon.xpath(&quot;//h1&quot;).extract() (&#039;<h1>Contoh domain</h1>')

Atau dapatkan saja teksnya:

>>> response.xpath("//h1/text()").extract()
('Example Domain')

Jadi, penggunaan XPath adalah alat pencarian elemen yang fleksibel dan mudah.

Pemilih scrapy dan CSS

Berbeda dengan XPath, penyeleksi kurang fleksibel dan tidak memungkinkan Anda bekerja dengan elemen induk, misalnya. Meskipun sangat jarang digunakan, kurangnya opsi seperti itu bisa membuat frustasi.

Secara umum, persyaratan pemilih CSS dilakukan dengan cara yang sama:

&gt;&gt;&gt;response.css(&quot;h1&quot;).ekstrak() (&#039;<h1>Contoh domain</h1>')

Pilihan antara menggunakan penyeleksi XPath dan CSS terserah semua orang, karena perbedaan antara menggunakan penyeleksi ini terutama adalah masalah kenyamanan bagi setiap pengguna.

Pengikisan situs web dengan Scrapy

Sekarang mari kita mulai membuat scraper sederhana menggunakan Scrapy. Untuk membuat scraper pertama, gunakan fungsi bawaan kerangka kerja. Mari gunakan perintah berikut:

scrapy startproject scrapy_example

Ini secara otomatis akan membuat proyek yang rumit. Namanya bisa apa saja. Jika semuanya berjalan dengan baik, baris perintah akan mengembalikan sesuatu yang serupa:

New Scrapy project 'scrapy_example', using template directory 'C:\Users\Admin\AppData\Local\Programs\Python\Python310\lib\site-packages\scrapy\templates\project', created in:
C:\Users\Admin\scrapy_example

You can start your first spider with:
	cd scrapy_example
	scrapy genspider example example.com

Perintah cd membawa Anda ke direktori proyek, dalam hal ini direktori scrapy_example. Anda dapat menggunakan perintah genspider untuk membuat scraper secara otomatis dengan pengaturan dasar. Mari masuk ke direktori proyek Scrapy dan buat scraper untuk mengumpulkan data dari situs web example.com:

cd scrapy_example
scrapy genspider titles_scrapy_example example.com

Jika semuanya baik-baik saja, yang berikut ini dikembalikan:

Created spider 'titles_scrapy_example' using template 'basic'

Buka scraper yang dibuat (file Python). Ini terlihat seperti ini:

import scrapy
class TitlesScrapyExampleSpider(scrapy.Spider):
name="scrapy_exampl"
allowed_domains = ('example.com')
start_urls = ('http://example.com/')
    def parse(self, response):
	pass</code class="language-python">

Mari kita ubah konten def parse(self, Response) sehingga scraper mengumpulkan semua tag h1 (menggunakan contoh XPath di atas):

    def parse(self, response):
	titles = response.xpath("//h1/text()").extract()
        yield {'titles': titles}

Dan terakhir, untuk memulai scraper, gunakan perintah:

scrapy crawl titles_scrapy_example

Hasil scraper ditampilkan di output terminal. Tentu saja, ini adalah contoh pengikis yang sangat sederhana, tetapi model yang lebih kompleks biasanya hanya berbeda pada detailnya. Oleh karena itu, mengetahui dasar-dasarnya dan membuat web scraper yang lengkap tidak akan menimbulkan kesulitan.

Saat membuat proyek, Scrapy juga membuat file settings.py dan file middleware.py tempat seseorang dapat menyimpan spider middleware dan juga pengaturan proxy, misalnya:

class ProxyMiddleware(object):
# overwrite process request
def process_request(self, request, spider):
# Set the location of the proxy
	request.meta('proxy') = http://YOUR_PROXY_IP:PORT

Jangan lupa untuk melakukan perubahan pada file settings.py:

DOWNLOADER_MIDDLEWARES = { 'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': 110, 'title_scrapy_example.middlewares.ProxyMiddleware': 100,}

Penggunaan proxy sangat penting untuk meningkatkan keamanan saat melakukan scraping dan menghindari pemblokiran. Selain itu, perlu diingat bahwa penggunaan proxy gratis tidak dapat diandalkan dan kecepatannya berkurang secara signifikan. Disarankan untuk menggunakan proxy pribadi.

Jika tidak ada keinginan atau peluang untuk mengonfigurasi dan menggunakan proxy secara mandiri, serta menghindari pemblokiran, ada API siap pakai yang bertindak sebagai perantara antara pengguna dan situs. Misalnya, scraper paling sederhana yang menggunakan layanan kami akan terlihat seperti ini:

import http.client
import json
conn = http.client.HTTPSConnection("api.scrape-it.cloud")
payload = json.dumps({
	"url": "https://example.com"
	})
headers = {
	'x-api-key': '<your api client>',
	'Content-Type': 'application/json'
	}
conn.request("POST", "/scrape", payload, headers)
res = conn.getresponse()
data = res.read()
print(data.decode("utf-8"))

Hal ini memungkinkan melewati pemblokiran IP, rendering JavaScript, penggunaan proxy perumahan dan pusat data, serta konfigurasi header HTTP khusus dan cookie khusus.

Sebelum Anda akhirnya memutuskan untuk menggunakan Scrapy dalam proyek, ada baiknya membandingkannya dengan pustaka scraping Python populer lainnya. Salah satunya adalah perpustakaan Sup Cantik. Ini cukup sederhana dan cocok bahkan untuk pemula.

Namun, tidak seperti Scrapy, ia kurang fleksibel dan skalabilitas. Selain itu, parser bawaannya cukup lambat.

Beautiful Soup dengan mudah mengekstrak data dari file HTML dan XML. Namun, perlu menggunakan perpustakaan tambahan untuk mengirim permintaan ke halaman web. Permintaan atau perpustakaan UrlLib cocok untuk ini. Untuk analisis lebih lanjut, html.parser atau Lxml mungkin bisa membantu.

Sebagai contoh, mari kita ambil semua nama barang yang disimpan di paragraf p dalam tag h3:

from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc, 'html.parser')
for title in soup.find_all('p'):
print(title.get('h3'))

Karena perpustakaan ini sangat populer di kalangan pemula, komunitas yang cukup aktif telah berkembang. Dengan cara ini Anda dapat dengan cepat menemukan jawaban atas pertanyaan apa pun.

Selain itu, Beautiful Soup memiliki dokumentasi yang lengkap dan detail sehingga sangat memudahkan pembelajaran. Penjelasan rinci tentang metode dan contoh penerapannya dapat ditemukan di sini.

selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.example.com")
elem = driver.find_element_by_name("h3")
driver.close()

Jadi mari kita lihat tabel perbandingannya:

Fitur khusus Tdk lengkap Sup yang enak
Pembelajaran yang mudah Sedang Tinggi
Kecepatan menggores Tinggi Rendah
Fleksibilitas dan skalabilitas Tinggi Rendah
Kelengkapan dokumentasi Sedang Tinggi
Konsumsi sumber daya PC Rendah Sedang

Meskipun alat tersebut harus dipilih tergantung pada tujuan, sasaran dan kemampuan, perlu dicatat bahwa BeautifulSoup lebih cocok untuk pemula atau proyek kecil. Sedangkan Scrapy sebaiknya digunakan oleh mereka yang sudah familiar dengan scraping dengan Python dan berencana membuat proyek yang fleksibel dan mudah diskalakan.

Baca juga tentang Python cURL

Tergores vs Selenium

Selenium adalah alat yang lebih canggih yang memungkinkan perayapan situs web tidak hanya dengan data statis tetapi juga dengan data dinamis. Itu berarti Selenium mendukung JavaScript berkat browser tanpa kepala.

Selenium awalnya dirancang untuk otomatisasi pengujian, jadi perpustakaan ini membantu mensimulasikan perilaku pengguna sebenarnya. Oleh karena itu, penggunaan perpustakaan ini juga membantu mengurangi risiko pemblokiran.

Keuntungan besar lainnya adalah Selenium dapat dengan mudah bekerja dengan permintaan AJAX dan PJAX. Selain itu, tidak seperti Scrapy, Selenium bekerja dengan baik di C#, Java, Python, Ruby, dan bahasa pemrograman lainnya.

Mari kita lihat contoh yang mirip dengan BeautifulSoup, hanya dengan Selenium dan browser tanpa kepala:

selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.example.com")
elem = driver.find_element_by_name("h3")
driver.close()

Kodenya tidak menjadi lebih rumit, tetapi perilaku pengguna sebenarnya dapat ditiru. Karena perpustakaan ini sangat populer, perpustakaan ini juga memiliki komunitas yang aktif dan dokumentasi yang baik.

Jadi mari kita bandingkan Selenium dan Scrapy untuk melihat kelebihan dan kekurangannya:

Fitur khusus Tdk lengkap selenium
Pembelajaran yang mudah Sedang Sedang
Kecepatan menggores Tinggi Sedang
Fleksibilitas dan skalabilitas Tinggi Sedang
Kelengkapan dokumentasi Sedang Tinggi
Konsumsi sumber daya PC Rendah Tinggi
Kemampuan untuk bekerja dengan Javascript TIDAK Ya

Oleh karena itu, lebih baik menggunakan Selenium untuk proyek kompleks yang memerlukan bekerja dengan data dinamis dan meniru perilaku pengguna sebenarnya. Pada saat yang sama, Scrapy lebih cocok untuk proyek yang fleksibel dan terukur yang mengutamakan konsumsi sumber daya PC yang rendah dan penguraian data dinamis tidak menjadi masalah.

Kesimpulan dan temuan

Salah satu keuntungan terbesar Scrapy adalah sangat mudah untuk memindahkan proyek yang sudah ada ke proyek lain. Oleh karena itu, Scrapy adalah pilihan terbaik untuk proyek besar atau kompleks.

Selain itu, jika proyek memerlukan proxy atau saluran data, menggunakan Scrapy adalah ide yang bagus. Selain itu, Scrapy menang dibandingkan dengan konsumsi sumber daya dan kecepatan eksekusi di antara semua perpustakaan Python.

Pos terkait

Tinggalkan Komentar