Scrapy web scraping python & crawling untuk pemula

Di salah satu artikel saya sebelumnya, saya memperkenalkan taktik web scraping menggunakan Requests dan BeautifulSoup/website API. Pada artikel ini, saya ingin memperkenalkan kerangka kerja aplikasi yang lebih canggih untuk merayapi konten situs web dan mengekstraksi data terstruktur yang disebut Scrapy

Pro dan Kontra Scrapy

Dibandingkan dengan metode mengikis lainnya seperti sup cantik, Scrapy memiliki keunggulan sebagai berikut

  1. Kode lebih terukur dan fleksibel, lebih mudah diubah ke skala perayapan yang lebih besar atau melayani perubahan struktur situs web
  2. Scrapy memiliki struktur kode standar dan praktik terbaik untuk diikuti
  3. Scrapy memiliki kecepatan crawling yang lebih cepat

Kekurangan

  1. Scrapy memiliki kurva belajar yang sedikit lebih curam sebagai permulaan
  2. Anda tidak dapat melihat keluaran pada setiap langkah seperti solusi notebook Jupyter biasa (Namun, tersedia fungsi pengujian terminal)

Seperti yang Anda lihat, satu-satunya kelemahan utama dari solusi Scrapy adalah pembelajaran yang lebih curam, tetapi begitu Anda menerapkan solusinya, Anda dapat menerapkannya ke situs web scrapable lainnya dengan mudah.

Bagian mana dari situs web yang dapat dirayapi?

Kami tidak diizinkan merayapi semua situs web dengan bebas. Ini karena terlalu banyak lalu lintas ke situs web dapat menyebabkan kerusakan server dan perusahaan mungkin ingin melindungi datanya sendiri. Bagaimana kami tahu apakah kami dapat mengikis situs web ini? . txt setelah direktori utama untuk melihat informasi ini

robot. File txt untuk sgcarmart. com — https. // www. sgcarmart. com/robots. txt

Seperti yang bisa Anda lihat dari tangkapan layar di atas, untuk contoh sgcarmart. com, ada agen pengguna tertentu yang tidak diizinkan untuk mengikis sub-direktori mana pun dari situs web ini seperti 'Googlebot-Image'. Namun, jika Anda menggunakan 'Applebot' sebagai agen pengguna Anda, Anda dapat merayapi sub-direktori tertentu dengan batas waktu 5 (tidak diizinkan merayapi direktori yang dilarang tersebut). Jika Anda menggunakan grapeshot, Anda dapat merayapi sub-direktori itu tanpa batas waktu (kecepatan perayapan lebih cepat)

Langkah-langkah untuk web scraping menggunakan Scrapy

Dokumentasi/tutorial resmi Scrapy dapat ditemukan di https. //dokumen. scrapy. org/id/terbaru/

Langkah 1. Instal paket Scrapy

# install at terminal
pip install Scrapy

Atau Anda dapat merujuk ke panduan instalasi. https. //dokumen. scrapy. org/en/terbaru/intro/instal. html

Langkah 2. Buat proyek Scrapy

Di terminal, cari folder tempat Anda ingin menyimpan kode pengikisan, lalu ketik

scrapy startproject <project_name>
_

Here you should replace with your project name. Here I create a new project called ‘scraping_demo’

Proyek awal yang berantakan

Ini akan membuat folder dengan struktur yang ditunjukkan di bawah ini

struktur folder proyek Scrapy

Di sini sebagian besar file sudah dikonfigurasi sebelumnya dan Anda tidak perlu menyentuhnya. File pertama yang dapat Anda periksa adalah pengaturan. py

Kiri (pengaturan asli. py) — Benar (versi pengaturan saya yang dimodifikasi. py)

Seperti yang Anda lihat dari tangkapan layar di atas, pengaturan awalnya dibuat. py hanya akan mengikuti robots.py. aturan txt tanpa pengaturan atau agen pengguna apa pun. Anda dapat memodifikasinya dengan menentukan agen pengguna Anda dan menyetel download_delay (seperti yang ditentukan oleh aturan situs web)

File lain yang harus Anda modifikasi adalah membuat kode python scraper di folder spiders. Saat ini, hanya ada init. py di folder dan Anda dapat membuat beberapa file scraper di folder dan menggunakannya dalam skenario yang berbeda dan itu akan menjadi langkah 3 kami

Langkah 3. Buat kode scraper di bawah folder spiders

Langkah ini adalah langkah utama bagi Anda untuk menulis scraper. Anda harus terlebih dahulu membuat file py di bawah folder spiders. Setelah itu, Anda dapat merujuk ke contoh di bawah ini (dari situs web utama Scrapy) untuk struktur kode dasar

Contoh kode scrapy — dimodifikasi dari contoh dari https. //dokumen. scrapy. org/en/terbaru/intro/tutorial. html

Di file py baru yang Anda buat, Anda perlu menentukan kelas scraper dan kemudian menentukan nama scraper Scrapy. Ini karena Anda dapat membuat banyak pengikis di folder laba-laba. Saat Anda menjalankan pengikis, Anda harus menggunakan nama untuk membedakan, jadi Anda perlu memastikan bahwa nama di pengikis berbeda berbeda

Setelah itu, struktur dasar memerlukan dua fungsi 'start_requests' dan 'parse'. 'start_requests' mirip dengan peran pustaka permintaan di Python dan akan menaikkan permintaan ke URL situs web yang Anda tetapkan. Harap perhatikan dua hal, di sini Anda tidak mengembalikan fungsi melainkan menghasilkan yang berarti Anda melanjutkan dengan langkah ini. Pada fungsi request, Anda perlu menentukan URL dan juga fungsi callback yaitu untuk mengubah informasi website menjadi konten terstruktur dan kembali ke fungsi ini

Fungsi parse yang terakhir mirip dengan peran BeautifulSoup yaitu untuk mengurai konten website. Anda dapat mengurai konten dengan CSS atau XPath. Anda dapat merujuk ke informasi lebih lanjut tentang pemilih di https. //dokumen. scrapy. org/en/terbaru/topik/pemilih. html. Di sini Anda dapat langsung menampilkan data atau membiarkannya nanti untuk ditampilkan menggunakan baris perintah

You can test the scraper selector by using the scrapy shell function. Firstly, you should locate to your project folder in terminal and put ‘scrapy shell ’.

Setelah itu, jika status berhasil, Anda dapat menggunakan objek respons untuk menguji parse Anda seperti 'response. xpath('//judul/teks()'). get()’ apakah mendapatkan hasil yang benar seperti yang Anda harapkan. Anda dapat merujuk ke detail lebih lanjut di https. //dokumen. scrapy. org/en/terbaru/topik/shell. html

Langkah Terakhir (Akhirnya). Jalankan Scrapy Scraper di terminal

The last step is simple, just locate your project folder in the terminal and write ‘scrapy crawl ’. The step may take quite some time if you are scraping a large number of pages and the scraping speed is also largely determined by the timeout you defined in the settings.py file.

Studi kasus. Merayapi informasi mobil Singapura

Sumber data

Kami menggunakan sgcarmart. com sebagai sumber data untuk dirayapi. Seperti yang telah saya tunjukkan sebelumnya, sgCarMart memungkinkan beberapa agen pengguna merayapi beberapa bagian situs web

Pernyataan masalah

Kami ingin menemukan mobil bekas apa yang dijual di platform saat ini. Berapa harga, judul, dan beberapa informasi lainnya?

Larutan

  1. Pertama kita akan mengatur folder proyek dengan menggunakan perintah 'scrapy startproject sgcarmart'
  2. Kami melihat pengaturannya. py dan ubah user_agent dan download_delay sesuai dengan robots. txt

pengaturan. py untuk sgcarmart

3. Mari buka halaman web dan lihat bagaimana kita bisa merayapi

sgcarmart. com semua mobil yang tersedia

Di atas adalah halaman daftar sgcarmart untuk semua mobil bekas yang tersedia. Sebelum memeriksa halaman, kita bisa mendapatkan beberapa informasi berguna

  • URL akan memberi tahu Anda apa kriteria pemfilteran mobil dan juga halaman mana yang dirayapi. Misalnya, BRSR berarti indeks halaman saat ini dan RPG berarti jumlah daftar mobil di halaman ini, kami dapat meningkatkan BRSR secara iteratif sebanyak 20 di sini untuk meng-crawl semua halaman. Anda bisa mendapatkan ini setelah beberapa penjelajahan di berbagai halaman
  • Ada 14k daftar mobil dan 730 halaman untuk dirayapi dan itu berarti kami akan mengambil semua 730 halaman URL secara iteratif berdasarkan nilai BRSR
def generate_urls(self):
urls = []
#730 pages to crawl
for i in range(0, 731):
urls.append(f'https://www.sgcarmart.com/used_cars/listing.php?AVL=2&BRSR={i * 20}&RPG=20&VEH=0')
return urls
#making requests to all 730 page url
def start_requests(self):
for url in self.generate_urls():
yield scrapy.Request(url=url, callback=self.parse)
  • Setiap daftar mobil memiliki beberapa informasi di halaman utama seperti harga atau penyusutan, tetapi kami perlu mengklik setiap daftar mobil secara berulang untuk detail lebih lanjut

periksa halaman untuk setiap url daftar

Jika Anda memeriksa halaman, Anda dapat melihat bahwa setiap URL disimpan dalam atribut href dari tanda kurung kuat. Mari gunakan metode Scrapy shell untuk menguji apakah kita bisa mendapatkan elemen yang benar

Pertama kita akan masukan ke terminal di bawah, ingat untuk menambahkan '' di luar URL yang ingin Anda uji

scrapy shell 'https://www.sgcarmart.com/used_cars/listing.php?BRSR=40&RPG=20&AVL=2&VEH=0'

halaman sukses setelah scrapy shell

Kalian bisa lihat halaman diatas jika kalian berhasil dan kalian bisa lihat statusnya 200. Setelah itu, Anda bisa mencoba menggunakan CSS atau XPath untuk mendapatkan informasi yang Anda inginkan. Dalam kasus saya, saya ingin mendapatkan semua URL yang dibutuhkan

hasil setelah menerapkan pemilih CSS

Anda dapat melihat dari tangkapan layar di atas bahwa setelah Anda menerapkan CSS, Anda bisa mendapatkan semua URL. Ada beberapa data kebisingan karena daftar iklan atau URL kedaluwarsa tetapi Anda dapat menghapusnya menggunakan pernyataan if sederhana

#parse all main page information and go to each car detail page
def parse(self, response):
# follow links to car listings
for href in response.css('strong a::attr(href)'):
# filter out the advertisement links
if 'info.php' in href.extract():
url = response.urljoin(href.extract())
yield scrapy.Request(url, callback=self.parse_car)
_

halaman detail mobil

Jika Anda membuka halaman detail mobil apa pun, Anda dapat melihat bahwa semua informasi disimpan dalam format tabel dan Anda dapat menggunakan metode scrapy shell yang sama dan menguji serta mendapatkan elemen data yang benar. Di sini saya menggunakan kamus untuk menyimpan semua bidang data yang diperlukan dan menampilkan seluruh kamus secara bersamaan

#parse each car detail page information and retrieve all necessary information
def parse_car(self, response):
result = dict()
result['title'] = response.css('#toMap a::text').extract()[0].strip()
result['price'] = response.css('.font_red a strong::text').extract()
result['depreciation']= response.css('#carInfo tr')[1].css('td')[1].css('::text')[0].extract().strip()
result['mileage']=response.css('#carInfo tr')[2].css('td')[0].css('div.eachInfo')[0].css('div.row_info::text').extract()[0].strip()
result['road_tax']=response.css('#carInfo tr')[2].css('td')[0].css('div.eachInfo')[1].css('div.row_info::text').extract()[0].strip()
result['dereg_value']=response.css('#carInfo tr')[2].css('td')[0].css('div.eachInfo')[2].css('div.row_info::text').extract()[0].strip()
result['coe']=response.css('#carInfo tr')[2].css('td')[0].css('div.eachInfo')[3].css('div.row_info::text').extract()[0].strip()
result['engine_cap']=response.css('#carInfo tr')[2].css('td')[0].css('div.eachInfo')[4].css('div.row_info::text').extract()[0].strip()
result['curb_weight']=response.css('#carInfo tr')[2].css('td')[0].css('div.eachInfo')[5].css('div.row_info::text').extract()[0].strip()
if len(response.css('#carInfo tr')[2].css('td')[0].css('div.eachInfo'))>6:
result['vehicle_type']=response.css('#carInfo tr')[2].css('td')[0].css('div.eachInfo')[6].css('div.row_info a::text').extract()[0].strip()
else:
result['vehicle_type']=response.css('#carInfo tr')[3].css('td a::text').extract()[0].strip()
result['url'] = response.url
yield result

4. Setelah kita memahami struktur dan elemen halaman, mari bersenang-senang membuat kode scraper

Kode untuk sgcarmart. py di bawah folder laba-laba

5. Terakhir, di terminal kita cari folder proyek lalu ketik

scrapy crawl new_car -t csv -O ./output/result.csv
_

Di sini kami ingin menyimpan semua hasil ke dalam CSV di bawah folder keluaran di bawah direktori yang sama. '-t csv' berarti kita ingin mengubah hasilnya menjadi format CSV, -O akan menimpa file yang ada sementara -o hanya akan menambahkan data ke bawah. Anda juga dapat menentukan format file keluaran dalam kode scraper secara langsung

Ini akan memakan waktu cukup lama untuk dijalankan jika Anda merayapi semua halaman. Di sini saya hanya menguji coba perayapan 2 halaman dan itu akan menghasilkan file CSV terstruktur seperti di bawah ini

hasil. csv — hasil perayapan Rekomendasi dan kesimpulan akhir

Artikel ini bertujuan untuk memperkenalkan Scrapy sebagai salah satu praktik terbaik untuk perayapan web. Format kode perayapan biasanya cukup standar tetapi yang lebih penting adalah kita harus memahami struktur situs web sebelum memulai pengkodean. Strukturnya mencakup informasi seperti URL mana yang akan dirayapi, bidang data apa yang akan dirayapi, apakah ada perubahan tata letak situs web pada halaman yang berbeda, dll.

Dalam kasus perubahan elemen situs web, Anda perlu menggunakan pernyataan case when atau walk-around lainnya untuk memastikan hasil akhir terstruktur dan akurat. Selain itu, sebagian besar bidang data masih perlu melalui putaran pembersihan data lainnya sebelum Anda benar-benar dapat menggunakannya seperti Anda perlu mengonversi pajak jalan $959/tahun ke nilai numerik 959

Banyak terima kasih kepada teman saya Timothy Ye dan Liu Zheng atas bantuan kodenya

Jika Anda baru mengenal web scraping dan ingin mempelajari lebih lanjut tentang pemilih CSS atau pemilih XPath, Anda dapat belajar dari beberapa kursus online seperti datacamp atau langsung merujuk ke tautan w3school di bawah ini

https. // www. w3schools. com/cssref/css_selectors. asp

https. // www. w3schools. com/xml/xpath_intro. asp

Jika Anda tertarik menggunakan BeautifulSoup atau API langsung (jika tersedia) untuk web scraping, Anda juga dapat merujuk ke artikel saya yang lain di bawah ini. Terima kasih telah membaca dan semoga harimu menyenangkan

Bagaimana cara mengikis situs web menggunakan Python Scrapy?

Mari kita bicara tentang penginstalan, membuat spider, lalu mengujinya. .
Langkah 1. Menciptakan lingkungan virtual. .
Langkah 2. Memasang modul Scrapy. .
Langkah 3. Membuat proyek Scrapy. .
Langkah 4. Membuat Laba-laba. .
Langkah 5. Mengambil data dari halaman yang diberikan

Apakah Scrapy lebih baik daripada BeautifulSoup?

Scrapy adalah alat pengikis web yang lebih tangguh, lengkap fitur, lebih dapat diperluas, dan lebih terpelihara . Scrapy memungkinkan Anda merayapi, mengekstrak, dan menyimpan situs web lengkap. BeautilfulSoup di sisi lain hanya memungkinkan Anda mengurai HTML dan mengekstrak informasi yang Anda cari.

Apakah Scrapy gratis?

Scrapy (/ˈskreɪpaɪ/ SKRAY-peye) adalah framework perayapan web sumber terbuka dan gratis yang ditulis dengan Python dan dikembangkan di Cambuslang. Awalnya dirancang untuk pengikisan web, ini juga dapat digunakan untuk mengekstrak data menggunakan API atau sebagai perayap web tujuan umum.

Apakah Scrapy lebih cepat dari selenium?

Selenium adalah alat otomatisasi yang luar biasa dan Scrapy sejauh ini merupakan kerangka kerja pengikisan web yang paling kuat. Saat kami mempertimbangkan web scraping, dalam hal kecepatan dan efisiensi, Scrapy adalah pilihan yang lebih baik . Saat berurusan dengan situs web berbasis JavaScript di mana kita perlu membuat permintaan AJAX/PJAX, Selenium dapat bekerja lebih baik.