JavaScript ở khắp mọi nơi. Nếu bạn tìm thấy một trang web không có JavaScript trên trang, bạn có thể cá rằng đó là từ những năm 1990
Điều đó thể hiện các vấn đề đối với việc quét web. Hầu hết thời gian, dữ liệu nằm ngay trong HTML của trang. Nó có thể dễ dàng nhìn thấy và cạo. Tuy nhiên, đôi khi dữ liệu chỉ khả dụng sau khi JavaScript được hiển thị
Điều đó đưa ra một thách thức đối với việc quét web. Tôi đã viết các bài báo trước đây về quét web tập trung vào các thư viện Python dễ sử dụng
Thật không may, phương pháp đó bị hỏng khi bạn đưa kết xuất JavaScript vào hỗn hợp
Vậy làm cách nào để chúng tôi xử lý các trang web bẫy dữ liệu của họ đằng sau kết xuất JavaScript?
Công cụ phù hợp cho công việc
Thông thường, tôi muốn giới thiệu một vài thư viện truy cập để quét web
- yêu cầu
- ĐẹpSúp
Hai công cụ này có thể làm được rất nhiều việc, ngay cả khi bạn đang xem qua nhiều trang để lấy dữ liệu. Tuy nhiên, chúng không thể được sử dụng để hiển thị JavaScript
Có cả một bộ công cụ được xây dựng cho loại công việc này. Các công cụ này được nhóm thành một danh mục được gọi là Tự động hóa trình duyệt
Mục tiêu của một công cụ tự động hóa trình duyệt là mô phỏng trải nghiệm duyệt web nhưng nó được tự động hóa để nó có thể chạy ở các khoảng thời gian hoặc tốc độ mà một người không thể đạt được
Chúng được quảng cáo nhiều hơn về khả năng kiểm tra trang web của họ cho chủ sở hữu trang web. Họ cũng tình cờ có mọi thứ chúng tôi cần để hiển thị JavaScript và thu thập dữ liệu cơ bản
Một số công cụ phổ biến hơn trong danh mục này là
- phế liệu
- nhà viết kịch
- selen
Trong ví dụ này, chúng tôi sẽ tập trung vào việc sử dụng Selenium. Chúng tôi cũng sẽ sử dụng thư viện đáng tin cậy BeautifulSoup để phân tích phản hồi
Thiết lập không gian làm việcVì chúng tôi đang tự động hóa hoàn toàn trình duyệt web nên cần thiết lập nhiều hơn một chút so với chỉ một vài lần cài đặt pip. Chúng tôi sẽ cần một vài thứ khác được cài đặt
- Chrome [hoặc trình duyệt web khác, chúng tôi sẽ sử dụng Chrome trong ví dụ này]
- ChromeDriver [trình điều khiển web dành cho Chrome]
Hãy tiếp tục và cài đặt Chrome nếu bạn muốn làm theo. Đối với cài đặt ChromeDriver, chúng tôi sẽ sử dụng thư viện Python tiện dụng sẽ làm điều đó cho chúng tôi
Như đã nói, hãy tiếp tục và cài đặt các thư viện mà chúng tôi sẽ sử dụng
pip install selenium
pip install bs4
pip install chromedriver-autoinstaller
Khi tất cả đã được cài đặt, chúng ta có thể bắt đầu nhập
import chromedriver_autoinstaller
from selenium import webdriver
from bs4 import BeautifulSoup
Thư viện chromedriver_autoinstaller sẽ xử lý việc cài đặt ChromeDriver và thêm nó vào PATH nếu nó chưa có ở đó, điều này sẽ khiến chúng tôi mất một chút công việc. Chúng ta có thể làm điều đó với một dòng đơn giản
chromedriver_autoinstaller.install[]
Đó là khá nhiều để thiết lập môi trường của chúng tôi. Tóm lại, chúng tôi đã cài đặt selen, bs4 và chromedriver-autoinstaller. Tệp Python của chúng ta bây giờ trông như thế này
Nhập khẩuBắt trang web
Với môi trường của chúng tôi được thiết lập, chúng tôi có thể bắt đầu yêu cầu các trang web. Để làm điều đó, chúng ta cần thiết lập đối tượng webdriver mà selen sẽ sử dụng
driver = webdriver.Chrome[]
Và chúng ta có thể tiếp tục và yêu cầu người lái xe tìm nạp một trang web. Trong ví dụ này, chúng tôi sẽ loại bỏ những bộ phim mới được chứng nhận của Rotten Tomatoes
Dữ liệu chúng tôi theo đuổi [tiêu đề phim, xếp hạng, v.v. ] có thể được tìm thấy mà không hiển thị JavaScript. Tuy nhiên, việc phân tích cú pháp dữ liệu sẽ dễ dàng hơn nhiều khi nó được hiển thị
Trang này được hiển thị gần như hoàn toàn bằng JavaScript, đây là trang web đã bật JavaScript
Đã bật JavaScript
Và với JavaScript bị vô hiệu hóa
Chúng tôi có thể yêu cầu trang web này bằng cách sử dụng phương thức “get” đối tượng trình điều khiển của chúng tôi
driver.get['//www.rottentomatoes.com/browse/cf-dvd-streaming-all']
Và chúng ta có thể lấy đầu ra html bằng thuộc tính page_source
html = driver.page_source
Tóm lại, đây là nơi chúng ta đang viết mã
Phân tích cú pháp HTML
Bây giờ, Selenium có thể phân tích dữ liệu. Chúng tôi sẽ sử dụng nó trong một số tình huống nhất định. Tuy nhiên, BeautifulSoup sẽ là mục tiêu của chúng tôi để phân tích cú pháp HTML. Vì vậy, hãy làm một món súp từ nguồn trang
soup = BeautifulSoup[html, 'html.parser']
Bây giờ, chúng ta nên có một cái gì đó trông như thế này
Canh
Nếu chúng tôi in ra đối tượng súp này mà chúng tôi đã tạo ra. Chúng tôi nhận được trang web đầy đủ, trừ đi một số định dạng ưa thích. May mắn thay, chúng ta không phải đợi JavaScript thực thi trên trang này
Trong một số trường hợp, chúng tôi sẽ phải đợi JavaScript thực thi. Điều này có thể được thực hiện bằng cách chờ đợi ngầm hoặc chờ đợi rõ ràng
Vì chúng tôi không phải lo lắng về điều đó, hãy tìm thông tin chúng tôi đang tìm kiếm
Phim đã kết xuất
Có vẻ như tất cả các bộ phim mà chúng tôi đang tìm kiếm đều nằm trong div của chính chúng với lớp “mb-movie”
Mỗi trong số này giữ thông tin về bộ phim riêng lẻ
thông tin phim
Chúng tôi có thể lấy từng cái trong số chúng và lấy tiêu đề, điểm số và ngày phát hành một cách dễ dàng với BeautifulSoup
Thông tin được phân tích cú phápKết luận
Vì vậy, chúng tôi đã đề cập khá nhiều trong một khoảng thời gian ngắn. Đây là bản tóm tắt những gì chúng tôi đã làm
- Chrome đã cài đặt
- Đã cài đặt ChromeDriver bằng thư viện Python
- Đã kéo một trang web nặng JavaScript bằng Selenium
- Phân tích cú pháp và thu thập dữ liệu bằng BeautifulSoup
Đây là cái nhìn cuối cùng về nơi chúng tôi kết thúc, với dữ liệu được in ra trong thiết bị đầu cuối
Nếu điều này giúp ích cho bạn, cách tốt nhất để hỗ trợ tôi là theo dõi tôi trên Twitter hoặc tại đây trên Phương tiện
Phản hồi là bạn của tôi, vì vậy hãy thoải mái liên hệ và nói với tôi rằng bạn thích câu chuyện của tôi, muốn một số chủ đề được đề cập hoặc một phần nào đó của điều này có thể được thực hiện tốt hơn