Hướng dẫn từ Semalt: Quét web bằng Python

Gần đây tôi đã ghé thăm KinoPoisk (phiên bản tiếng Nga của IMDB) và phát hiện ra rằng trong nhiều năm qua, tôi đã đạt được hơn 1000 bộ phim. Tôi nghĩ rằng sẽ rất thú vị khi nghiên cứu những dữ liệu này chi tiết hơn: thị hiếu phim của tôi có thay đổi theo thời gian không? Trong những mùa nào trong năm tôi xem nhiều phim hơn?

Nhưng trước khi chúng tôi phân tích và xây dựng đồ họa đẹp, chúng tôi cần lấy dữ liệu. Thật không may, nhiều dịch vụ không có API công khai, vì vậy bạn phải xắn tay áo và phân tích các trang html.

Bài viết này dành cho những người luôn muốn tìm hiểu cách sử dụng Web Scrapping nhưng không nhúng tay vào hoặc không biết bắt đầu từ đâu.

Bài tập

Nhiệm vụ của chúng tôi là trích xuất dữ liệu về các bộ phim đã xem: tiêu đề của bộ phim, ngày và thời gian xem, xếp hạng của người dùng.

Trên thực tế, công việc của chúng tôi sẽ được thực hiện trong 2 giai đoạn:

Giai đoạn 1: tải xuống và lưu các trang html

Giai đoạn 2: phân tích html theo định dạng phù hợp để phân tích thêm (csv, json, pandas dataframe, v.v.)

Dụng cụ

Có rất nhiều thư viện python để gửi yêu cầu http. Một trong những nổi tiếng nhất và rất tiện dụng là Yêu cầu.

Cũng cần phải chọn một thư viện để phân tích cú pháp html.

BeatiouslySoup, lxml

Đây là hai thư viện phổ biến nhất để phân tích cú pháp html và chọn một trong số chúng chỉ là một sở thích cá nhân. Hơn nữa, các thư viện này được kết nối chặt chẽ với nhau: BeautifulSoup bắt đầu sử dụng lxml làm trình phân tích cú pháp nội bộ để tăng tốc và trong lxml, một mô-đun soupparser đã được thêm vào. Để so sánh các cách tiếp cận, tôi sẽ phân tích dữ liệu với BeautifulSoup và sử dụng các bộ chọn XPath trong mô-đun lxml.html.

Đang tải dữ liệu

Hãy bắt đầu tải dữ liệu. Trước hết, chúng ta hãy thử lấy trang theo url và lưu nó vào một tệp cục bộ.

Chúng tôi mở tệp kết quả và thấy rằng nó không đơn giản: trang web coi chúng tôi là robot và sẽ không hiển thị dữ liệu.

Hãy cùng tìm hiểu cách thức hoạt động của trang web

Trình duyệt không có vấn đề trong việc lấy thông tin từ trang web. Chúng ta hãy xem chính xác nó gửi yêu cầu như thế nào. Để thực hiện việc này, chúng tôi sử dụng bảng "Mạng" trong "Công cụ dành cho nhà phát triển" trong trình duyệt (tôi sử dụng Fireorms cho việc này), thông thường, yêu cầu chúng tôi cần là yêu cầu dài nhất.

Như chúng ta có thể thấy, trình duyệt cũng gửi đến các tiêu đề UserAgent, cookie và một số tham số khác. Trước tiên, chúng tôi sẽ cố gắng gửi UserAgent chính xác đến một tiêu đề.

Lần này chúng tôi thành công, và bây giờ chúng tôi được cung cấp dữ liệu cần thiết. Điều đáng chú ý là đôi khi trang web cũng kiểm tra tính hợp lệ của cookie, trong trường hợp các phiên trong thư viện Yêu cầu sẽ giúp ích.

Tải xuống tất cả giá

Bây giờ chúng tôi có thể lưu một trang với tỷ lệ. Nhưng thông thường, người dùng có rất nhiều mức giá và cần phải lặp lại qua tất cả các trang. Số trang mà chúng tôi quan tâm dễ dàng chuyển trực tiếp đến url.

Thu thập dữ liệu từ Html

Bây giờ hãy trực tiếp thu thập dữ liệu từ html. Cách dễ nhất để hiểu cách cấu trúc trang html là sử dụng chức năng "Kiểm tra phần tử" trong trình duyệt. Trong trường hợp này, mọi thứ khá đơn giản: toàn bộ bảng có tỷ lệ nằm trong thẻ. Chọn nút này:

từ bs4 nhập BeautifulSoup

từ lxml nhập html

# Súp đẹp

súp = BeautifulSoup (văn bản)

film_list = soup.find ('div', ('class': 'profileFilmsList'))

# lxml

cây = html.from chuỗi (văn bản)

film_list_lxml = cây.xpath ('// div [@ class =' 'profileFilmList' ']') [0]

Chúng ta hãy tìm hiểu cách lấy tiêu đề phim Nga và liên kết đến trang của bộ phim (cũng như cách lấy văn bản và giá trị của thuộc tính).

Nếu bạn cần trích xuất tiêu đề bằng tiếng Anh, chỉ cần thay đổi "nameRus" thành "nameEng".

Các kết quả

Chúng tôi đã học cách phân tích các trang web, làm quen với các thư viện Requests, BeautifulSoup và lxml, cũng như nhận được dữ liệu phù hợp để phân tích thêm về các bộ phim đã xem trên KinoPoisk.