Cạo bảng javascript python

Có nhiều cách khác nhau để cạo các trang web bằng python. Trong bài viết trước của tôi, tôi đã giới thiệu về quét web bằng cách sử dụng các thư viện.

echo $PATH
7 và
echo $PATH
8. Tuy nhiên, nhiều trang web động và sử dụng JavaScript để tải nội dung của chúng. Các trang web này thường yêu cầu một cách tiếp cận khác để thu thập dữ liệu

Kỹ năng khoa học dữ liệu. Quét web bằng python

Một trong những nhiệm vụ đầu tiên mà tôi được giao trong công việc của mình với tư cách là Nhà khoa học dữ liệu liên quan đến Quét web. Đây hoàn toàn là một…

hướng tới khoa học dữ liệu. com

Trong hướng dẫn này, tôi sẽ trình bày một số cách khác nhau để thu thập nội dung của trang web có chứa Javascript. Các kỹ thuật được sử dụng sẽ như sau

  1. Sử dụng
    echo $PATH
    9 với trình điều khiển web Firefox
  2. Sử dụng trình duyệt không đầu với
    # add geckodriver to your PATH
    export PATH="$PATH:/path/to/your/directory"
    0
  3. Thực hiện lệnh gọi API bằng ứng dụng khách REST hoặc thư viện python
    echo $PATH
    7

TL; DR Để biết các ví dụ về cách quét các trang web javascript trong python, bạn có thể tìm thấy mã hoàn chỉnh như được trình bày trong hướng dẫn này trên GitHub

Cập nhật ngày 7 tháng 11 năm 2019. Xin lưu ý, cấu trúc html của trang web đang được quét có thể được cập nhật theo thời gian và bài viết này ban đầu phản ánh cấu trúc tại thời điểm xuất bản vào tháng 11 năm 2018. Bài viết hiện đã được cập nhật để chạy với trang web hiện tại nhưng trong tương lai điều này có thể lại thay đổi

Những bước đầu tiên

Để bắt đầu hướng dẫn, trước tiên tôi cần tìm một trang web để cạo. Trước khi tiếp tục với trình quét web của bạn, điều quan trọng là phải luôn kiểm tra Điều khoản & Điều kiện và Chính sách quyền riêng tư trên trang web bạn định quét để đảm bảo rằng bạn không vi phạm bất kỳ điều khoản sử dụng nào của họ

Động lực

Khi cố gắng tìm một trang web phù hợp để minh họa, nhiều ví dụ mà tôi xem lần đầu tiên đã tuyên bố rõ ràng rằng trình thu thập dữ liệu web bị cấm. Mãi cho đến khi đọc một bài báo về hàm lượng đường trong sữa chua và tự hỏi tôi có thể tìm thấy thông tin dinh dưỡng mới nhất ở đâu đã truyền cảm hứng cho một luồng suy nghĩ khác về nơi tôi có thể tìm thấy một trang web phù hợp;

Các nhà bán lẻ trực tuyến thường có các trang web động tải nội dung bằng javascript, vì vậy mục đích của hướng dẫn này là thu thập thông tin dinh dưỡng của sữa chua từ trang web của một siêu thị trực tuyến

Thiết lập môi trường của bạn

Vì chúng tôi sẽ sử dụng một số thư viện python mới để truy cập nội dung của các trang web và cũng để xử lý dữ liệu, các thư viện này sẽ cần được cài đặt bằng trình quản lý gói python thông thường của bạn

# add geckodriver to your PATH
export PATH="$PATH:/path/to/your/directory"
2. Nếu bạn chưa có ________ 33 thì bạn cũng cần cài đặt cái này tại đây

pip install selenium
pip install pandas

Để sử dụng

echo $PATH
9 làm trình điều khiển web, có một vài yêu cầu bổ sung

firefox

Tôi sẽ sử dụng Firefox làm trình duyệt cho trình điều khiển web của mình, vì vậy điều này có nghĩa là bạn sẽ cần cài đặt Firefox để làm theo hướng dẫn này hoặc bạn có thể sử dụng Chromium với Chrome

tắc kè

Để sử dụng trình điều khiển web, chúng ta cần cài đặt một công cụ trình duyệt web, geckodriver. Bạn sẽ cần tải xuống geckodriver cho hệ điều hành của mình, giải nén tệp và đặt vị trí đường dẫn thực thi

Bạn có thể thực hiện việc này theo nhiều cách.
[i] di chuyển geckodriver đến thư mục bạn chọn và xác định đây là đường dẫn thực thi trong mã python của bạn [xem ví dụ sau],

[ii] di chuyển geckodriver đến một thư mục đã được thiết lập làm thư mục chứa các tệp thực thi, đây được gọi là đường dẫn biến môi trường của bạn.
Bạn có thể tìm ra thư mục nào trong

# add geckodriver to your PATH
export PATH="$PATH:/path/to/your/directory"
5 của mình bằng cách sau.

Windows
Đi tới.

Bảng điều khiển> Biến môi trường> Biến hệ thống> Đường dẫn

Mac OSX / Linux
Trong thiết bị đầu cuối của bạn, hãy sử dụng lệnh.

echo $PATH

[iii] thêm vị trí tắc kè vào biến môi trường

# add geckodriver to your PATH
export PATH="$PATH:/path/to/your/directory"
6 của bạn

Windows
Đi tới.

Bảng điều khiển > Biến môi trường > Biến hệ thống > Đường dẫn > Chỉnh sửa
Thêm thư mục chứa geckodriver vào danh sách này và lưu

Mac OSX / Linux
Thêm một dòng vào

# add geckodriver to your PATH
export PATH="$PATH:/path/to/your/directory"
7 [Mac OSX] hoặc
# add geckodriver to your PATH
export PATH="$PATH:/path/to/your/directory"
8 [Linux]

# add geckodriver to your PATH
export PATH="$PATH:/path/to/your/directory"

Khởi động lại thiết bị đầu cuối của bạn và sử dụng lệnh từ [ii] để kiểm tra xem đường dẫn mới của bạn đã được thêm chưa

PhantomJS

Tương tự như các bước dành cho geckodriver, chúng ta cũng cần tải PhantomJS. Sau khi tải xuống, hãy giải nén tệp và di chuyển đến thư mục bạn chọn hoặc thêm vào đường dẫn thực thi của bạn, làm theo các hướng dẫn tương tự như trên

Máy khách REST

Trong phần cuối cùng của blog này, chúng tôi sẽ yêu cầu API bằng ứng dụng khách REST. Tôi sẽ sử dụng Insomnia nhưng bạn có thể sử dụng bất kỳ khách hàng nào bạn thích

Cạo trang web bằng BeautifulSoup

Làm theo các bước tiêu chuẩn được nêu trong hướng dẫn giới thiệu của tôi về quét web, tôi đã kiểm tra trang web và muốn trích xuất phần tử HTML lặp lại

echo $PATH
5

Bước đầu tiên, bạn có thể thử sử dụng BeautifulSoup để trích xuất thông tin này bằng tập lệnh sau

echo $PATH
6

Không ngờ khi chạy script python thì số kết quả trả về là 0 mặc dù trên web mình thấy rất nhiều kết quả

echo $PATH
7

Khi kiểm tra thêm trang, có nhiều tính năng động trên trang web cho thấy rằng javascript được sử dụng để trình bày các kết quả này.
Bằng cách nhấp chuột phải và chọn

# add geckodriver to your PATH
export PATH="$PATH:/path/to/your/directory"
9, có nhiều phần tử
echo $PATH
50 đang được sử dụng và tìm kiếm phần tử ở trên có chứa dữ liệu mà chúng tôi quan tâm không trả về kết quả khớp.

Cách tiếp cận đầu tiên để cạo trang web này là sử dụng trình điều khiển web Selenium để gọi trình duyệt, tìm kiếm các yếu tố quan tâm và trả về kết quả

Cạo trang web bằng Selenium

1. Selenium với con tắc kè

Vì chúng tôi không thể truy cập nội dung của trang web bằng Beautiful Soup, trước tiên chúng tôi cần thiết lập trình điều khiển web trong tập lệnh python của mình

echo $PATH
0

Như đã đề cập khi cài đặt geckodriver, nếu tệp thực thi không nằm trong đường dẫn thực thi, chúng tôi có thể xác định đường dẫn trong tập lệnh python của mình. Nếu nó nằm trong đường dẫn thực thi thì dòng trên sẽ trở thành

echo $PATH
1

Sau khi thiết lập, giờ đây chúng ta có thể kết nối với trang web và tìm các yếu tố quan tâm. Khi tải trang web trong trình duyệt, kết quả thường mất một lúc để tải và thậm chí có thể không tải cho đến khi chúng tôi cuộn trang xuống.
Với suy nghĩ này, ở đây chúng ta có thể thêm một số javascript để trình điều khiển web thực thi để thực hiện các hành động đó. Dưới đây là một ví dụ đơn giản để cuộn trang, sẽ có nhiều cách hiệu quả hơn để thực hiện việc này, tại sao bạn không kiểm tra javascript của riêng mình tại đây và cho tôi biết trong phần nhận xét cách nào phù hợp nhất với bạn.

Chúng tôi cũng thêm thời gian ngủ như một phương pháp khác để đợi trang tải đầy đủ

echo $PATH
2

Nếu chúng tôi chạy tập lệnh ngay bây giờ [bạn cũng có thể bỏ ghi chú

echo $PATH
51 ở cuối để đảm bảo trình duyệt đóng], vì tập lệnh python của bạn chạy Firefox sẽ mở url được chỉ định và cuộn xuống trang. Hy vọng rằng bạn nên tải nhiều sản phẩm lên trước khi tập lệnh chạy xong

Tiếp theo, chúng tôi muốn có được các yếu tố quan tâm. Trước đây, khi sử dụng Beautiful Soup, chúng tôi đã cố gắng tìm tất cả các phần tử dựa trên thuộc tính thẻ và lớp, tuy nhiên, trong ví dụ này, chúng tôi sẽ sử dụng một cách tiếp cận hơi khác để truy cập thông tin sản phẩm. Thay vào đó, chúng ta có thể tìm kiếm các phần tử bằng xpath, dựa trên cấu trúc XML hoặc bộ chọn css

Chúng tôi có thể kiểm tra phần tử quan tâm và trong thanh công cụ, nhấp chuột phải vào phần tử được tô sáng và Sao chép > Sao chép xpath [hoặc Sao chép bộ chọn]. Đây là một cách thú vị khác để hiểu cấu trúc của html. Trong trường hợp này, chúng tôi sẽ sử dụng xpath để tìm các phần tử và sau đó chúng tôi có thể in số lượng kết quả phù hợp

echo $PATH
4

Một trong những lý do chính để sử dụng xpath thay vì sử dụng phần tử vì kết quả có một vài phần tử trong đó gốc của id là

echo $PATH
52 với một số từ bổ sung, vì vậy hàm
echo $PATH
53 đã được sử dụng để chọn tất cả các kết quả nhưng cũng để chọn

echo $PATH
0

Bây giờ chúng tôi có một số kết quả từ trang, chúng tôi có thể lặp lại từng kết quả và lưu dữ liệu quan tâm. Trong trường hợp này, chúng tôi có thể lưu tên sản phẩm và liên kết

Lưu ý rằng thực tế có hơn 38 kết quả trên trang web. Con số này cũng có thể khác nhau tùy thuộc vào số lượng kết quả tải khi bạn kết nối với trang. Tất cả các kết quả có thể được thu thập bằng cách thay đổi javascript mà chúng tôi thực thi như đã đề xuất ở trên, hoặc các phương pháp khác sẽ được khám phá trong các phần sau

echo $PATH
1

Bên ngoài vòng lặp này, chúng tôi có thể đóng trình duyệt và khi chúng tôi nhập thư viện

echo $PATH
55, chúng tôi có thể sử dụng thư viện đó bằng cách lưu dữ liệu mà chúng tôi đã thu thập vào một khung dữ liệu. Chúng tôi có thể in khung dữ liệu để xem nội dung

echo $PATH
2

Ở định dạng này, chúng ta có thể ghi dữ liệu này vào tệp csv một cách rất đơn giản

echo $PATH
3

Sử dụng Selenium với geckodriver là một cách nhanh chóng để cạo các trang web đang sử dụng javascript nhưng có một vài nhược điểm. Tôi nhận thấy rằng đôi khi trang không tải [tôi chắc chắn rằng điều này có thể hiệu quả hơn bằng cách thay đổi javascript mà chúng tôi thực thi như đã đề cập ở trên, nhưng tôi chưa quen với JS nên điều này có thể cần một chút thời gian], nhưng cũng tải trình duyệt

Một tùy chọn khác, chúng ta có thể sử dụng trình duyệt không đầu. Điều này sẽ tăng tốc độ quét vì chúng tôi không phải đợi trình duyệt tải mỗi lần

2. Selenium với trình duyệt không đầu

Khi sử dụng PhantomJS làm trình duyệt không đầu thay vì tắc kè, sự khác biệt duy nhất là cách trình điều khiển web được tải. Điều này có nghĩa là chúng ta có thể làm theo phương pháp trên nhưng thay đổi dòng khởi tạo trình điều khiển web trở thành

echo $PATH
4

Lưu ý ở đây rằng hỗ trợ Selenium cho PhantomJS đã bị loại bỏ và đưa ra cảnh báo

Cũng có thể sử dụng chế độ không đầu với tắc kè bằng cách sử dụng tùy chọn không đầu

echo $PATH
5

Bằng cách sử dụng trình duyệt không đầu, chúng tôi sẽ thấy sự cải thiện về thời gian để tập lệnh chạy vì chúng tôi không mở trình duyệt nhưng không phải tất cả các kết quả đều được loại bỏ theo cách tương tự như sử dụng firefox webdriver ở chế độ bình thường

Thực hiện một yêu cầu API

Cách tiếp cận cuối cùng mà chúng ta sẽ thảo luận trong hướng dẫn này là đưa ra yêu cầu đối với API. Khi kiểm tra các tệp XHR của trang Mạng, khi tải trang, trang này sẽ hiển thị các yêu cầu đang được thực hiện. Trong danh sách này là yêu cầu

echo $PATH
56 gọi điểm cuối API để nhận kết quả được trình bày trên trang

Chúng tôi có thể thực hiện cùng một yêu cầu bằng ứng dụng khách REST hoặc với một vài dòng python

Nếu chúng tôi kiểm tra tệp

echo $PATH
57 và xem các tiêu đề, url yêu cầu chứa từ khóa và các tham số khác cần thiết để thực hiện yêu cầu. Bên dưới các chi tiết chung là các tiêu đề phản hồi và yêu cầu mà chúng tôi có thể cần sau này

Công cụ kiểm tra hiển thị tiêu đề yêu cầu tìm kiếm

Để nhận được phản hồi, chúng tôi có thể lấy url yêu cầu và để kiểm tra, hãy nhập url này vào thanh địa chỉ của trình duyệt của bạn. Vì các tham số được thêm vào trong chuỗi, chúng tôi cũng có thể thử xóa tất cả trừ tham số từ khóa để kiểm tra xem có cần thêm tham số nào không. Trong trường hợp này, từ khóa truy vấn trả về kết quả trong trình duyệt, vì vậy chúng ta cũng có thể thực hiện yêu cầu tương tự bằng ứng dụng khách REST hoặc trong python

Khách hàng mất ngủ REST

Sử dụng chứng mất ngủ, chúng tôi có thể nhập url yêu cầu và gửi yêu cầu

Điều này trả về một phản hồi JSON chứa dữ liệu mà chúng tôi đang tìm kiếm

Xem trước phản hồi JSON trong Insomnia

Ví dụ này rất đơn giản mà không cần có tiêu đề hoặc mã thông báo bảo mật. Đối với các trường hợp khác, ứng dụng khách REST cho phép bạn nhập bất kỳ tham số phản hồi bổ sung nào mà bạn có thể nhận được từ công cụ kiểm tra khi thu thập chi tiết yêu cầu

yêu cầu Python

Chúng tôi cũng có thể thực hiện cùng một yêu cầu từ python bằng cách sử dụng thư viện

echo $PATH
58 giống như cách chúng tôi kết nối với một trang web trước khi cạo

Phản hồi JSON có thể dễ đọc hơn bằng cách thêm một vài tham số để thụt lề và sắp xếp các khóa để giờ đây chúng tôi có thể mở tệp và xem dữ liệu phản hồi được cung cấp cho trang web khi tìm kiếm được thực hiện

echo $PATH
6

Hiện tại, chúng tôi sẽ giữ tất cả dữ liệu. Hướng dẫn tiếp theo của tôi sẽ trình bày chi tiết hơn về cấu trúc dữ liệu và đầu ra để chúng ta có thể thao tác với JSON và tìm dữ liệu liên quan

Tóm lược

Hướng dẫn này đã phác thảo một số phương pháp chúng ta có thể sử dụng để loại bỏ các trang web sử dụng javascript. Những phương pháp này bao gồm

Sử dụng trình điều khiển web để cạo nội dung

  • Sử dụng trình điều khiển web Selenium để kết nối với một trang web bằng trình điều khiển web Firefox, PhantomJS, trình duyệt không đầu
  • Sử dụng trình điều khiển web để tìm các yếu tố quan tâm
  • Lặp lại kết quả và lưu các biến quan tâm
  • Lưu dữ liệu vào một khung dữ liệu
  • Ghi vào tệp csv

Thực hiện một yêu cầu HTTP

  • Kiểm tra trang web để tìm chi tiết yêu cầu HTTP
  • Thực hiện yêu cầu GET bằng trình duyệt, ứng dụng khách REST, python

Mặc dù phương thức yêu cầu HTTP được triển khai nhanh hơn trong hướng dẫn này và cung cấp tất cả dữ liệu chúng tôi cần từ một yêu cầu, nhưng điều này không phải lúc nào cũng đúng. Không phải tất cả các trang web đều hiển thị yêu cầu của họ, bảo mật bổ sung có thể được áp dụng với mã thông báo xác thực hết hạn hoặc dữ liệu đầu ra có thể yêu cầu làm sạch đáng kể, điều này sẽ hiệu quả hơn so với sử dụng trình điều khiển web với một số javascript để cho phép tải tất cả kết quả và lặp qua tất cả các trang. Hướng dẫn này cung cấp một vài lựa chọn thay thế khác nhau mà bạn có thể thử để có thể cạo javascript

Trong hướng dẫn tiếp theo của tôi, chúng ta sẽ khám phá cấu trúc dữ liệu, thao tác dữ liệu và ghi vào tệp đầu ra hoặc cơ sở dữ liệu

Cảm ơn bạn đã đọc. Nếu bạn thích bài viết của tôi thì hãy đăng ký nhận bản tin hàng tháng của tôi, nơi bạn có thể nhận các bài viết mới nhất của tôi và các tài nguyên hàng đầu được gửi ngay đến hộp thư đến của bạn hoặc tìm hiểu thêm về những gì tôi đang làm trên trang web của mình

Nếu bạn chưa quen với python hoặc muốn cải thiện, hãy xem bài viết của tôi với danh sách các tài nguyên học tập bao gồm các khóa học về khoa học dữ liệu

Chủ Đề