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ệu

Trướ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à tutorial bằng câu lệnh sau

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 MacbookTgddSpider trong thư mục con nhện như sau

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

  • Con spider này có tên là macbook_tgdd sẽ được sử dụng để chạy cmd khi thu thập dữ liệu
  • start_urls. đây là địa chỉ bắt đầu cho spider, có thể là một danh sách các url tương ứng với tên miền trong allowed_domains. Ở bản demo này mình sẽ bắt đầu ở link các sản phẩm Macbook
  • parse[]. Chính là chức năng mình sẽ viết code để điều khiển spider đi thu thập dữ liệu mà mình muốn lấy về từ url phía trên
3. Dữ liệu select select to crawl

Đầ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 items.py như sau

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 spiders/macbook_tgdd.py của mình sẽ như sau

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

  • parse[]. Do dữ liệu của từng sản phẩm nằm ngoài danh sách Macbook không thể đáp ứng đủ nhu cầu thu thập thông tin của mình nên cần vào link từng sản phẩm bên trong thẻ li ở trong danh sách đó, mỗi li chứa 1 sản phẩm. Dựa vào href của mỗi sản phẩm, mình sẽ gửi MacbookTgddSpider1 tới url của sản phẩm đó và gọi tới MacbookTgddSpider2 để thực hiện thu thập dữ liệu
  • MacbookTgddSpider2. Ở hàm này, mình sẽ tiến hành thu thập dữ liệu những mục mà mình xác định trong MacbookTgddSpider4. Vui lòng xem kỹ trang web và kiểm tra để chọn đúng mục đó trên DOM nhé. v, ví dụ như khi cửa hàng hết hàng thì bộ chọn giá sản phẩm sẽ khác, hoặc bộ chọn giá bán cũng sẽ khác khi mua hàng trực tuyến. Nên cân nhắc kỹ khi Copy selector chứ đừng copy luôn kẻo crawl không ra dữ liệu đúng nhé =]]
4. Crawl process

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 MacbookTgddSpider5 trong MacbookTgddSpider6 mà Scrapy comment đi vào tệp MacbookTgddSpider7 như sau, đồng thời các bạn cấu hình thêm utf-8 để tránh lỗi phông chữ nha

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ố MacbookTgddSpider8 null do con Macbook đó không sale được, còn MacbookTgddSpider9 null thì do con Macbook đó không có ai rate luôn. v, but back thì đều khớp 100%. Thế là thành công rồi đó =]]

Kết luận

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]

Chủ Đề