Trong phần này chúng ta sẽ tìm hiểu cách cáo dữ liệu trên file Excel.
Thực chất mà nói thì để lấy dữ liệu từ file Excel thì chúng ta không cần dùng đến Scrapy, vì ngay chính bản thân Python đã có thư viện riêng để trích xuất dữ liệu từ dạng file này, đó là gói csv
.
Bây giờ chúng ta tạo một Spider với tên là sheetReader
:
$ scrapy genspider sheetReader example.com Created spider 'sheetReader' using template 'basic' in module: ex.spiders.sheetReader
Chúng ta tạo thêm 1 file CSV có tên human.csv
như sau:
Chúng ta sửa nội dung file sheetReader.py
như sau:
# -*- coding: utf-8 -*- import scrapy import csv class SheetreaderSpider(scrapy.Spider): name = 'sheetReader' allowed_domains = ['example.com'] start_urls = ['http://example.com/'] def parse(self, response): with open('./spiders/human.csv', 'rU') as f: reader = csv.DictReader(f) for line in reader: print( line["Firstname"], line["Lastname"], "\t - ", line["Address"], ",", line["City"], line["Zipcode"])
Đoạn code không thể đơn giản hơn! Chúng ta dùng hàm open()
để tạo đối tượng File. Sau đó tạo đối tượng csv.DictReader()
và truyền vào tham số là đối tượng File
vừa tạo, vậy là chúng ta đã có thể lặp tất cả các dòng có trong file csv, mỗi dòng này thì DictReader
sẽ trả về một đối tượng JSON nên chúng ta có thể trích xuất data bằng cách đưa key vào, key ở đây tất nhiên là các ô ở dòng đâu tiên trong file.
Một lưu ý là chúng ta vẫn phải có biến start_urls
với ít nhất 1 URL bên trong, vì nếu không có biến này thì Scrapy sẽ không gọi phương thức parse()
.
Chạy và chúng ta được kết quả sau:
$ scrapy crawl sheetReader ... John Doe - 120 jefferson st. , Riverside 08075 Jack McGinnis - 220 hobo Av. , Phila 09119 John "Da Man" Recipi - 120 jefferson St. , Riverside 08075 Stephen Tyler - 7452 Terrace "At the Plaza" road, SomeTown 91234 Blankman - SomeTown 00298 Joan "the bone", Anne Jet - 9th at Terrace plc, Desert City 00123
Chúng ta có thể cải tiến đoạn code trên bằng cách truyền tên file giống như tham số thay vì hard-code bên trong file Python. Chúng ta sửa lại file như sau:
# -*- coding: utf-8 -*- import scrapy import csv class SheetreaderSpider(scrapy.Spider): name = 'sheetReader' allowed_domains = ['example.com'] start_urls = ['http://example.com/'] def parse(self, response): with open(getattr(self, 'file', './spiders/human.csv', 'rU')) as f: reader = csv.DictReader(f) for line in reader: print( line["Firstname"], line["Lastname"], "\t - ", line["Address"], ",", line["City"], line["Zipcode"])
Chúng ta dùng thêm phương thức getattr()
để lấy các tham số được truyền vào từ console. Ở đay tham số có tên là file, và nếu tham số này không được truyền vào thì chúng ta dùng file ./spiders/human.csv
làm file mặc định để chạy.
Để truyền tên file khi chạy thì chúng ta chỉ cần dùng tham số -a
như sau:
$ scrapy crawl sheetReader -a file=hooman.csv ...