Dự án python phế liệu
Chào mọi người, mấy hôm nay mình có tìm hiểu được 1 chút về Scrapy nên muốn viết vài dòng để xem mình đã học được những gì và làm 1 bản demo nho nhỏ Giả sử giới thiệu này đang có nhiều tiền muốn nhập Macbook về bán lấy hời, và giờ muốn nghiên cứu những cửa hàng khác họ bán những con Macbook nào và giá bóng rổ làm sao thì chả nhẽ mình phải lên trang web của họ rồi xem trực tiếp từng cái . Không phải đâu, mình muốn xem những dữ liệu đó theo dạng thống kê báo cáo cho chuyên nghiệp thay vì phải click từng sản phẩm để xem thủ công, vừa đau mắt vừa vừa thời gian. Phải nghĩ ngay tới việc sử dụng Scrapy sẽ giúp mình thu thập dữ liệu của các em Macbook về và xuất ra định dạng json, csv,… trực quan hơn và dễ thao tác để thống kê báo cáo hơn Giờ thì cùng mình tìm hiểu và thực hiện demo 1 chút, và ở demo này mình sẽ thu thập dữ liệu cơ bản của mấy em Macbook trên thegioididong xem sao nhé 1. Tạo dự án phế liệuTrước tiên, vì scrapy là 1 framework của python nên chúng ta cần cài đặt python, scrapy cái đã. Vui lòng làm theo các bước trên trang chủ của scrapy để tiến hành cài đặt nhé Tiếp theo, mình sẽ tạo dự án phế liệu với tên là 1 2 scrapy startproject demo_ scrapy
Hướng dẫn dự án mà chúng ta vừa tạo có cấu trúc như sau 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 demo_scrapy/ phế liệu. cfg # tệp cấu hình triển khai
demo_scrapy/ # mô-đun Python của dự án, bạn' __init__. py
mặt hàng. py # tệp định nghĩa hạng mục dự án
phần mềm trung gian. py # tệp phần mềm trung gian của dự án
đường ống. py # tệp quy trình dự án
cài đặt. py # tệp cài đặt dự án
nhện/ # thư mục nơi bạn sẽ __init__. py 2. Tạo con nhện Sau khi đã tạo xong dự án thì giờ chúng ta cần tạo 1 con spider để tiến hành thu thập dữ liệu bằng câu lệnh sau 1 2 scrapy genspider macbook_tgdd www. thegioididong. com/máy tính xách tay-apple-macbook
Lệnh trên đã tạo ra 1 con nhện 1 2 3 4 5 6 7 8 9 10 nhập phế liệu
class MackbookTgddSpider(scrapy. Con nhện). tên = 'macbook_tgdd' allowed_domains = ['www. thegioididong. com'] start_urls = ['https. //www. thegioididong. com/laptop-apple-macbook/']
def parse(self, response): vượt qua
Như bạn đã thấy
Đầu tiên, chúng ta cần xác định trước dữ liệu mà chúng ta muốn là gì. Ở đây mình cần thống kê thị trường Macbook được bán tại thegioididong nên mình sẽ thu thập tên sản phẩm, giá gốc, giá bán và lượng bình chọn trung bình của từng em Macbook. Sau khi đã lên ý tưởng về những mục muốn thu thập thông tin thì công việc tiếp theo là xác định những mục đó trong tệp 1 2 3 4 5 6 7 8 nhập phế liệu
class DemoScrapyItem(scrapy. Mục). product_name = scrapy. Trường() price_sale =phế liệu. Trường() giá = phế liệu. Trường() rate_average = scrapy. Trường()
Giờ thì bắt tay vào việc chính thôi, để thu thập dữ liệu đúng mục mình cần thì các bạn phải chọn đúng đối tượng đó trên DOM. Có thể sử dụng Css selector hay Xpath đều được, tuy nhiên mỗi cái đều có ưu nhược điểm riêng nên các bạn tự tham khảo để sử dụng cho phù hợp nhé Ở bản demo này, mình sẽ sử dụng bộ chọn Css để chọn những mục mà mình muốn lấy, bật kiểm tra và sao chép bộ chọn của những mục đó như sau Thực hiện lần lượt với các mục tiếp theo, sau một mã khôi phục, tệp 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 nhập phế liệu từ demo_scrapy. mục nhập DemoScrapyItem
class MacbookTgddSpider(scrapy. Con nhện). tên = 'macbook_tgdd' allowed_domains = ['www. thegioididong. com'] start_urls = ['https. //www. thegioididong. com/laptop-apple-macbook/']
def parse(self, response): # Yêu cầu tới từng sản phẩm có trong danh sách Macbook dựa trên href cho item_url trong phản hồi.css("li. mục > một. attr(href)"). giải nén(). sản lượng phế liệu. Yêu cầu(phản hồi. urljoin(item_url), . callback=self.parse_macbook) # Nếu có product thì sẽ gọi hàm parse_macbook
# nếu có sản phẩm tiếp theo thì tiếp tục thu thập dữ liệu trang_tiếp theo = phản hồi. css("li. tiếp theo > một. attr(href)"). extract_first() if trang_tiếp theo. sản lượng phế liệu. Yêu cầu(phản hồi. liên kết url(trang_tiếp theo), . callback=self.phân tích cú pháp)
def parse_macbook(self, response): item = DemoScrapyItem()
mặt hàng['product_name'] = response.css( 'div. hàng đầu > h1. văn bản'). extract_first() # Tên macbook
hết hàng = phản hồi. css('span. trạng thái sản phẩm. văn bản'). extract_first() # Tình trạng còn hàng hay không if hết hàng. mặt hàng['price'] = response.css( 'strong. giá bán. văn bản'). extract_first() khác. mặt hàng['price'] = response.css( 'sang một bên. price_sale > div. khu vực_giá. không áp dụng > mạnh mẽ. văn bản'). extract_first()
discount_online = phản hồi. css('div. hộp-trực tuyến. notapply'). extract_first() # Kiểm tra xem có giảm giá khi mua trực tuyến hay không if discount_online: item['price_sale'] = response.css( 'sang một bên. price_sale > div. hộp-trực tuyến. notapply > div > mạnh mẽ. văn bản'). extract_first() khác. item['price_sale'] = response.css( 'span. giá của anh ấy. văn bản'). extract_first()
mặt hàng['rate_average'] = response.css('div. toprt > div. crt > div. attr(data-gpa)'). extract_first()
sản lượng mặt hàng
Mình sẽ giải thích 1 chút đoạn mã phía trên
Giờ thì có thể thu hút dữ liệu của Macbook trên thegioididong về, Scrapy hỗ trợ xuất dữ liệu sang các định dạng khác nhau như JSON, CSV và XML. Tại mình quen nhìn JSON rồi nên ở đây mình sẽ xuất ra JSON. v 1 2 scrapy thu thập dữ liệu macbook_tgdd -o macbook_tgdd.json
Kết quả là mình bị lỗi 403. Do các trang web thường có cơ chế chặn bot thu thập dữ liệu của họ. Phải xử lý ngay lỗi này bằng cách cấu hình thêm 1 2 3 4 5 6 7 8 9 DEFAULT_REQUEST_HEADERS = { # 'Chấp nhận'. 'văn bản/html,ứng dụng/xhtml+xml,ứng dụng/xml;q=0. 9,*/*;q=0. số 8', # 'Ngôn ngữ chấp nhận'. 'en',
'Tác nhân người dùng'. 'Mozilla/5. 0 (X11; Linux x86_64; rv. 48. 0) Tắc kè/20100101 Firefox/48. 0', }
FEED_EXPORT_ENCODING = 'utf-8'
Ok, giờ thì chạy lại lệnh thu thập thông tin trên xem thu được gì Please check thủ công lại một chút so với web thegioididong xem mình đã crawl đúng hay chưa. v, sau khi check thì thấy một số Như vậy là mình đã thu thập được 1 số thông tin giúp ích cho việc nghiên cứu thị trường để kinh doanh Macbook của mình rồi, tuy nhiên đây chỉ là 1 bản demo cơ bản và số lượng Macbook được bán tại thegioididong vẫn còn ít bạn nên xem . v Lưu ý một chút là bài viết của mình chỉ có thể thu thập dữ liệu được trong thời điểm mình viết bài, các bạn cần theo dõi cập nhật giao diện từ thegioididong xem họ có thay đổi HTML hay không để chỉnh lại bộ chọn cho phù hợp, tránh trường Cảm ơn các bạn đã chiến thắng thời gian đọc bài viết của mình, nếu có gì còn thiếu sót, đóng góp ý, các bạn có thể để lại bình luận bên dưới bài viết để nghiên cứu và cải thiện. (cây cung) |