Trong bài viết này, chúng ta sẽ tìm hiểu về kỹ thuật web scraping sử dụng module Scrapy có sẵn trong Python.
Web Scraping là gì?
Web scraping được dùng để lấy dữ liệu từ một trang web nhờ sự trợ giúp của một crawler/scanner. Web scraping rất tiện lợi để trích xuất dữ liệu từ trang web không cung cấp chức năng API. Trong Python, web scraping có thể thực hiện nhờ các module như Beautiful Soup, Scrapy và lxml.
Ở đây chúng ta sẽ thảo luận về web scraping sử dụng module Scrapy.
Để làm điều đó, trước tiên chúng ta cần cài đặt Scrapy.
Gõ trong terminal hoặc command prompt:
>>> pip install Scrapy
Vì Scrapy là một framework, chúng ta cần chạy lệnh khởi tạo:
>>> scrapy startproject tutpts
Ở đây chúng ta tạo một web crawler/spider để lấy dữ liệu từ một trang web.
Để xây dựng crawler, chúng ta tạo một script riêng tên tutptscraw.py. Ở đây chúng ta khai báo một class để trích xuất nội dung. Chúng ta đặt tên cho web crawler và sử dụng .requests để lấy dữ liệu từ URL cho trước.
Các hàm generator được sử dụng để yield dữ liệu lấy được.
Ví dụ
import scrapy
class ExtractUrls(scrapy.Spider):
name = "fetch"
# Hàm generator
def start_requests(self):
# Nhập URL
urls = ['https://www.tutorialspoint.com/index.htm/']
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
Ở đây tất cả dữ liệu được đóng gói trong thẻ anchor được lấy bằng hàm request. Vì Scrapy là một mini framework, chúng ta chạy tất cả các chức năng trong Scrapy shell.
Để kích hoạt scrap shell, chúng ta dùng các lệnh sau:
scrapy shell https://www.tutorialspoint.com/index.htm/
Bây giờ chúng ta lấy dữ liệu từ thẻ anchor bằng selectors, tức là CSS hoặc xpaths:
response.css('a')
links = response.css('a').extract()
Để lấy tất cả các link có trên trang web, chúng ta tạo phương thức parse. Scrapy nội bộ bỏ qua các URL đã truy cập trước đó, giảm thời gian render khi hiển thị kết quả.
import scrapy
class ExtractUrls(scrapy.Spider):
name = "fetch"
# Hàm generator
def start_requests(self):
# Nhập URL
urls = ['https://www.tutorialspoint.com/index.htm/']
for url in urls:
yield scrapy.Request(url=url, callback=self.parse)
# Hàm Parse
def parse(self, response):
title = response.css('title::text').extract_first()
# Lấy thẻ anchor
links = response.css('a::attr(href)').extract()
for link in links:
yield {
'title': title,
'links': link
}
if 'tutorialspoint' in link:
yield scrapy.Request(url=link, callback=self.parse)
Kết luận
Trong hướng dẫn này, chúng ta đã tìm hiểu về triển khai web crawler sử dụng module Scrapy trong Python.