Trị liệu - Các liên kết sau
Sự miêu tả
Trong chương này, chúng ta sẽ nghiên cứu cách trích xuất liên kết của các trang mà chúng ta quan tâm, theo dõi chúng và trích xuất dữ liệu từ trang đó. Đối với điều này, chúng tôi cần thực hiện các thay đổi sau trong mã trước đó của chúng tôi được hiển thị như sau:
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
Đoạn mã trên chứa các phương thức sau:
parse() - Nó sẽ trích xuất các liên kết mà chúng ta quan tâm.
response.urljoin - Phương thức parse () sẽ sử dụng phương thức này để xây dựng một url mới và cung cấp một yêu cầu mới, yêu cầu này sẽ được gửi sau đó để gọi lại.
parse_dir_contents() - Đây là một lệnh gọi lại sẽ thực sự thu thập dữ liệu quan tâm.
Ở đây, Scrapy sử dụng cơ chế gọi lại để đi theo các liên kết. Bằng cách sử dụng cơ chế này, trình thu thập thông tin lớn hơn có thể được thiết kế và có thể theo các liên kết quan tâm để thu thập dữ liệu mong muốn từ các trang khác nhau. Phương thức thông thường sẽ là phương thức gọi lại, sẽ trích xuất các mục, tìm kiếm các liên kết để theo dõi trang tiếp theo và sau đó cung cấp một yêu cầu cho cùng một cuộc gọi lại.
Ví dụ sau đây tạo ra một vòng lặp, vòng lặp này sẽ theo các liên kết đến trang tiếp theo.
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)