Scrapy - Tautan Mengikuti
Deskripsi
Dalam bab ini, kita akan mempelajari cara mengekstrak link dari halaman yang kita minati, mengikuti dan mengekstrak data dari halaman tersebut. Untuk ini, kita perlu melakukan perubahan berikut pada kode sebelumnya yang ditunjukkan sebagai berikut -
import scrapy
from tutorial.items import DmozItem
class MyprojectSpider(scrapy.Spider):
name = "project"
allowed_domains = ["dmoz.org"]
start_urls = [
"http://www.dmoz.org/Computers/Programming/Languages/Python/",
]
def parse(self, response):
for href in response.css("ul.directory.dir-col > li > a::attr('href')"):
url = response.urljoin(href.extract())
yield scrapy.Request(url, callback = self.parse_dir_contents)
def parse_dir_contents(self, response):
for sel in response.xpath('//ul/li'):
item = DmozItem()
item['title'] = sel.xpath('a/text()').extract()
item['link'] = sel.xpath('a/@href').extract()
item['desc'] = sel.xpath('text()').extract()
yield item
Kode di atas berisi metode berikut -
parse() - Ini akan mengekstrak tautan yang kami minati.
response.urljoin - Metode parse () akan menggunakan metode ini untuk membuat url baru dan memberikan permintaan baru, yang akan dikirim nanti ke callback.
parse_dir_contents() - Ini adalah panggilan balik yang sebenarnya akan mengikis data yang diinginkan.
Di sini, Scrapy menggunakan mekanisme panggilan balik untuk mengikuti tautan. Dengan menggunakan mekanisme ini, crawler yang lebih besar dapat dirancang dan dapat mengikuti link yang diminati untuk mengambil data yang diinginkan dari halaman yang berbeda. Metode biasa adalah metode panggilan balik, yang akan mengekstrak item, mencari tautan untuk mengikuti halaman berikutnya, dan kemudian memberikan permintaan untuk panggilan balik yang sama.
Contoh berikut menghasilkan loop, yang akan mengikuti link ke halaman berikutnya.
def parse_articles_follow_next_page(self, response):
for article in response.xpath("//article"):
item = ArticleItem()
... extract article data here
yield item
next_page = response.css("ul.navigation > li.next-page > a::attr('href')")
if next_page:
url = response.urljoin(next_page[0].extract())
yield scrapy.Request(url, self.parse_articles_follow_next_page)