(Saya tidak membenarkan apa-apa yang menyalahi undang-undang, ini adalah untuk tujuan pendidikan sahaja)
Scrapy ialah salah satu rangka kerja mengikis web terbaik dalam Python, ia mudah digunakan, pantas dan penuh dengan ciri.
Tetapi bagaimana jika anda mahu mengikis berbilang halaman secara rekursif? Seperti halaman produk.
Nah cara paling mudah ialah dengan menambahkan panggilan balik ringkas pada fungsi Permintaan.
Berikut ialah coretan kod dalam projek Scrapy yang merangkak tapak web dengan produk tersenarai seperti Amazon, eBay dan Etsy:
def parse(self, response): links = response.css('a.s-item__link::attr(href)').getall() for link in links: yield Request(url=link, callback=self.parse_item) next_page = response.css('a.pagination___next.icon-link::attr(href)').get() if next_page: print('Next page: %s' % next_page) yield Request(url=next_page, callback=self.parse) def parse_item(self, response): title = response.xpath('//h1[@class="x-item-title___mainTitle"]/span/text()').get() price = response.xpath('//span[@id="prcIsum"]/text()').get() yield {'title':title, 'price':price}
Pertama, ia mengambil pautan setiap item yang disenaraikan pada halaman produk menggunakan baris kod ini:
links = response.css('a.s-item__link::attr(href)').getall()
Ia kemudian menggelung melalui setiap satu pautan tersebut, menghantar permintaan untuk mendapatkan sumber halaman dan melakukan panggilan balik ke parse_item:
for link in links: yield Request(url=link,callback=self.parse_item)
Di dalam fungsi parse_item, ia merebut tajuk dan harga item:
def parse_item(self, response): title = response.xpath('//h1[@class="x-item-title__mainTitle"]/span/text()').get() price = response.xpath('//span[@id="prcIsum"]/text()').get() yield {'title':title, 'price':price}
Kod kami kemudian mengambil pautan ke halaman seterusnya, memintanya dengan panggilan balik kepada dirinya sendiri (iaitu fungsi parse) dan bermula sekali lagi:
next_page = response.css('a.pagination__next.icon-link::attr(href)').get() if next_page: print('Next page:%s' % next_page) yield Request(url=next_page,callback=self.parse)
Begitulah, semudah itu!
Mengikis halaman produk secara rekursif dengan Scrapy boleh dilaksanakan semudah menambah panggilan balik pada fungsi Permintaan.
Atas ialah kandungan terperinci Cara Mengikis Halaman Produk(Etsy, Amazon, Ebay) dalam Python Menggunakan Scrapy dan Minta Panggilan Balik. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!