Scrapy - Laba-laba
Deskripsi
Spider adalah kelas yang bertanggung jawab untuk menentukan cara mengikuti tautan melalui situs web dan mengekstrak informasi dari halaman.
Laba-laba default Scrapy adalah sebagai berikut -
scrapy.Spider
Itu adalah laba-laba yang harus diwarisi oleh setiap laba-laba lainnya. Ini memiliki kelas berikut -
class scrapy.spiders.Spider
Tabel berikut menunjukkan bidang kelas scrapy.Spider -
Sr Tidak | Bidang & Deskripsi |
---|---|
1 | name Itu adalah nama laba-laba Anda. |
2 | allowed_domains Ini adalah daftar domain tempat laba-laba merayap. |
3 | start_urls Ini adalah daftar URL, yang akan menjadi root untuk penjelajahan nanti, di mana laba-laba akan mulai merayapi. |
4 | custom_settings Ini adalah pengaturan, saat menjalankan spider, akan diganti dari konfigurasi lebar proyek. |
5 | crawler Ini adalah atribut yang tertaut ke objek Crawler yang diikat oleh instance spider. |
6 | settings Ini adalah pengaturan untuk menjalankan laba-laba. |
7 | logger Ini adalah logger Python yang digunakan untuk mengirim pesan log. |
8 | from_crawler(crawler,*args,**kwargs) Ini adalah metode kelas, yang menciptakan laba-laba Anda. Parameternya adalah -
|
9 | start_requests() Ketika tidak ada URL tertentu yang ditentukan dan spider dibuka untuk dihapus, Scrapy memanggil metode start_requests () . |
10 | make_requests_from_url(url) Ini adalah metode yang digunakan untuk mengubah url menjadi permintaan. |
11 | parse(response) Metode ini memproses respons dan mengembalikan data yang dihapus mengikuti lebih banyak URL. |
12 | log(message[,level,component]) Ini adalah metode yang mengirimkan pesan log melalui spiders logger. |
13 | closed(reason) Metode ini dipanggil saat laba-laba menutup. |
Argumen Laba-laba
Argumen spider digunakan untuk menentukan URL awal dan diteruskan menggunakan perintah crawl dengan -a opsi, ditampilkan sebagai berikut -
scrapy crawl first_scrapy -a group = accessories
Kode berikut menunjukkan bagaimana laba-laba menerima argumen -
import scrapy
class FirstSpider(scrapy.Spider):
name = "first"
def __init__(self, group = None, *args, **kwargs):
super(FirstSpider, self).__init__(*args, **kwargs)
self.start_urls = ["http://www.example.com/group/%s" % group]
Laba-laba Generik
Anda dapat menggunakan laba-laba umum untuk membuat subkelas dari laba-laba Anda. Tujuan mereka adalah mengikuti semua tautan di situs web berdasarkan aturan tertentu untuk mengekstrak data dari semua halaman.
Untuk contoh yang digunakan dalam spider berikut, anggaplah kita memiliki proyek dengan bidang berikut -
import scrapy
from scrapy.item import Item, Field
class First_scrapyItem(scrapy.Item):
product_title = Field()
product_link = Field()
product_description = Field()
CrawlSpider
CrawlSpider mendefinisikan sekumpulan aturan untuk mengikuti link dan menghapus lebih dari satu halaman. Ini memiliki kelas berikut -
class scrapy.spiders.CrawlSpider
Berikut adalah atribut dari kelas CrawlSpider -
aturan
Ini adalah daftar objek aturan yang menentukan bagaimana crawler mengikuti link.
Tabel berikut menunjukkan aturan kelas CrawlSpider -
Sr Tidak | Aturan & Deskripsi |
---|---|
1 | LinkExtractor Ini menentukan bagaimana spider mengikuti tautan dan mengekstrak data. |
2 | callback Ini akan dipanggil setelah setiap halaman dikikis. |
3 | follow Ini menentukan apakah akan melanjutkan tautan berikut atau tidak. |
parse_start_url (tanggapan)
Ini mengembalikan item atau objek permintaan dengan mengizinkan untuk mengurai respons awal.
Note - Pastikan Anda mengganti nama fungsi parse selain parse saat menulis aturan karena fungsi parse digunakan oleh CrawlSpider untuk mengimplementasikan logikanya.
Mari kita lihat contoh berikut, di mana spider mulai merayapi beranda demoexample.com, mengumpulkan semua halaman, tautan, dan parsing dengan metode parse_items -
import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
class DemoSpider(CrawlSpider):
name = "demo"
allowed_domains = ["www.demoexample.com"]
start_urls = ["http://www.demoexample.com"]
rules = (
Rule(LinkExtractor(allow =(), restrict_xpaths = ("//div[@class = 'next']",)),
callback = "parse_item", follow = True),
)
def parse_item(self, response):
item = DemoItem()
item["product_title"] = response.xpath("a/text()").extract()
item["product_link"] = response.xpath("a/@href").extract()
item["product_description"] = response.xpath("div[@class = 'desc']/text()").extract()
return items
XMLFeedSpider
Ini adalah kelas dasar untuk spider yang mengikis dari umpan XML dan melakukan iterasi pada node. Ini memiliki kelas berikut -
class scrapy.spiders.XMLFeedSpider
Tabel berikut menunjukkan atribut kelas yang digunakan untuk menyetel iterator dan nama tag -
Sr Tidak | Atribut & Deskripsi |
---|---|
1 | iterator Ini mendefinisikan iterator yang akan digunakan. Ini bisa berupa iternodes, html atau xml . Default-nya adalah iternode . |
2 | itertag Ini adalah string dengan nama node untuk diiterasi. |
3 | namespaces Ini didefinisikan oleh daftar tupel (awalan, uri) yang secara otomatis mendaftarkan ruang nama menggunakan metode register_namespace () . |
4 | adapt_response(response) Ia menerima respon dan memodifikasi tubuh respon segera setelah ia tiba dari middleware laba-laba, sebelum laba-laba mulai menguraikannya. |
5 | parse_node(response,selector) Ini menerima respons dan pemilih ketika dipanggil untuk setiap node yang cocok dengan nama tag yang diberikan. Note - Laba-laba Anda tidak akan berfungsi jika Anda tidak mengganti metode ini. |
6 | process_results(response,results) Ini mengembalikan daftar hasil dan respons yang dikembalikan oleh laba-laba. |
CSVFeedSpider
Ini melakukan iterasi melalui setiap barisnya, menerima file CSV sebagai respons, dan memanggil metode parse_row () . Ini memiliki kelas berikut -
class scrapy.spiders.CSVFeedSpider
Tabel berikut menunjukkan opsi yang dapat diatur terkait file CSV -
Sr Tidak | Opsi & Deskripsi |
---|---|
1 | delimiter Ini adalah string yang berisi pemisah koma (',') untuk setiap bidang. |
2 | quotechar Ini adalah string yang berisi tanda kutip ('"') untuk setiap bidang. |
3 | headers Ini adalah daftar pernyataan dari mana bidang dapat diekstraksi. |
4 | parse_row(response,row) Ini menerima respons dan setiap baris bersama dengan kunci untuk header. |
Contoh CSVFeedSpider
from scrapy.spiders import CSVFeedSpider
from demoproject.items import DemoItem
class DemoSpider(CSVFeedSpider):
name = "demo"
allowed_domains = ["www.demoexample.com"]
start_urls = ["http://www.demoexample.com/feed.csv"]
delimiter = ";"
quotechar = "'"
headers = ["product_title", "product_link", "product_description"]
def parse_row(self, response, row):
self.logger.info("This is row: %r", row)
item = DemoItem()
item["product_title"] = row["product_title"]
item["product_link"] = row["product_link"]
item["product_description"] = row["product_description"]
return item
SitemapSpider
SitemapSpider dengan bantuan Peta Situs merayapi situs web dengan mencari URL dari robots.txt. Ini memiliki kelas berikut -
class scrapy.spiders.SitemapSpider
Tabel berikut menunjukkan bidang SitemapSpider -
Sr Tidak | Bidang & Deskripsi |
---|---|
1 | sitemap_urls Daftar URL yang ingin Anda crawl yang mengarah ke peta situs. |
2 | sitemap_rules Ini adalah daftar tupel (regex, callback), di mana regex adalah ekspresi reguler, dan callback digunakan untuk memproses URL yang cocok dengan ekspresi reguler. |
3 | sitemap_follow Ini adalah daftar ekspresi reguler peta situs yang harus diikuti. |
4 | sitemap_alternate_links Menentukan link alternatif yang akan diikuti untuk satu url. |
Contoh SitemapSpider
SitemapSpider berikut memproses semua URL -
from scrapy.spiders import SitemapSpider
class DemoSpider(SitemapSpider):
urls = ["http://www.demoexample.com/sitemap.xml"]
def parse(self, response):
# You can scrap items here
SitemapSpider berikut memproses beberapa URL dengan callback -
from scrapy.spiders import SitemapSpider
class DemoSpider(SitemapSpider):
urls = ["http://www.demoexample.com/sitemap.xml"]
rules = [
("/item/", "parse_item"),
("/group/", "parse_group"),
]
def parse_item(self, response):
# you can scrap item here
def parse_group(self, response):
# you can scrap group here
Kode berikut menunjukkan peta situs di robots.txt yang memiliki url /sitemap_company -
from scrapy.spiders import SitemapSpider
class DemoSpider(SitemapSpider):
urls = ["http://www.demoexample.com/robots.txt"]
rules = [
("/company/", "parse_company"),
]
sitemap_follow = ["/sitemap_company"]
def parse_company(self, response):
# you can scrap company here
Anda bahkan dapat menggabungkan SitemapSpider dengan URL lain seperti yang ditunjukkan pada perintah berikut.
from scrapy.spiders import SitemapSpider
class DemoSpider(SitemapSpider):
urls = ["http://www.demoexample.com/robots.txt"]
rules = [
("/company/", "parse_company"),
]
other_urls = ["http://www.demoexample.com/contact-us"]
def start_requests(self):
requests = list(super(DemoSpider, self).start_requests())
requests += [scrapy.Request(x, self.parse_other) for x in self.other_urls]
return requests
def parse_company(self, response):
# you can scrap company here...
def parse_other(self, response):
# you can scrap other here...