Scrapy – Cào dữ liệu file Exel

Rate this post

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
...
4 2 votes
Article Rating
Subscribe
Thông báo cho tôi qua email khi
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Inline Feedbacks
View all comments