Làm thế nào để bạn cạo dữ liệu từ một mạng trong python?

Tôi đã cố gắng giúp ai đó thực hiện nhiệm vụ quét web vào ngày hôm qua và tình cờ phát hiện ra một cách thú vị để sử dụng API để thu thập dữ liệu từ một số trang web nhất định

Ngày nay, nhiều trang web sử dụng khung giao diện người dùng hiển thị nội dung động bằng cách tải tệp JSON hoặc XML từ phần phụ trợ của họ. Tôi sẽ chỉ cho bạn cách tìm URL để truy cập nội dung động đó để bạn có thể dễ dàng thu thập dữ liệu từ một trang web mà không cần BeautifulSoup, bộ chọn CSS hoặc XPath. JSON rõ ràng, đơn giản

Tại sao cạo lưu lượng mạng?

Bạn đang ở trên một nền tảng truyền thông xã hội và bạn tạo một bài đăng. Hãy nói một tweet. Sau đó, bạn của bạn nhận xét về nó. Thay vì yêu cầu tải lại toàn bộ trang để hiển thị bình luận gần đây của bạn bè, trình duyệt của bạn chỉ yêu cầu dữ liệu liên quan đến bài đăng của bạn

Điều này làm giảm lượng dữ liệu phải được yêu cầu và người dùng cuối không phải tải lại toàn bộ trang. Điều này rất thú vị để thu thập dữ liệu vì dữ liệu bạn đang theo dõi đôi khi chỉ có thể được truy cập thông qua một trong các yêu cầu này

chúng ta đi đây. Bạn mở URL trang web mà bạn muốn cạo

Bạn truy cập HTML. Nhưng không có gì. Không có dữ liệu nào được hiển thị công khai

Trước khi vào XHR, trước tiên hãy nói về một vấn đề phổ biến mà nhiều người mắc phải khi cạo một trang. Kiểm tra xem bạn có bị mắc kẹt ở đó trước đó không để có được một cấp độ sâu hơn

Dữ liệu trong tập lệnh không giống như trong HTML

Trong một số trường hợp, bạn có thể nhận ra rằng dữ liệu được trả về cho bạn khác với dữ liệu bạn nhìn thấy trong dạng xem. tùy chọn nguồn của trình duyệt của bạn. Hãy nhớ rằng Kiểm tra phần tử và Nguồn xem không giống nhau

  • “Xem nguồn” hiển thị cho bạn HTML chính xác như trang web trả về nó theo yêu cầu ban đầu
  • “Kiểm tra phần tử” hiển thị cho bạn tất cả nội dung được hiển thị, bao gồm thông qua Javascript và các yêu cầu AJAX mới. Hãy nghĩ về các ứng dụng web

Lấy một ví dụ đơn giản, nói Twitter. Nếu bạn đi tới “Xem nguồn”, bạn sẽ thấy một tài liệu khá nhỏ tải hầu hết các tệp javascript cần thiết. Nhưng nếu bạn Kiểm tra các phần tử, bạn sẽ thấy nhiều mã HTML hơn vì nó đã được tìm nạp và hiển thị

Chà, trong trường hợp này, có khả năng thứ bạn đang thiếu là Tiêu đề yêu cầu tác nhân người dùng. Tiêu đề Tác nhân người dùng chỉ định trình duyệt đang được sử dụng. Khi nó không có ở đó, trang web có thể cho rằng một yêu cầu tự động đang được thực hiện. Nhưng nó rất đơn giản để sửa chữa

Chỉ cần thêm tác nhân người dùng của trình duyệt hiện đại vào yêu cầu của bạn

'User-Agent': 'Mozilla/5.0 [X11; Linux x86_64] AppleWebKit/537.36 [KHTML, like Gecko] Chrome/79.0.3945.88 Safari/537.36'

Nhưng nó sẽ không phải lúc nào cũng dễ dàng. Hầu hết thời gian, sẽ không có dữ liệu nào được hiển thị bên trong cấu trúc trang. Hãy xem xét kỹ hơn

Dữ liệu thậm chí không thoát ra bên trong HTML

Chúng tôi sẽ sử dụng Công cụ Chrome để xác định yêu cầu nào chịu trách nhiệm cung cấp dữ liệu mà chúng tôi đang tìm kiếm

Tôi sẽ lấy Airtable làm ví dụ khi bạn tôi đang làm việc với nó. Về cơ bản, ứng dụng này cho phép các nhóm tạo và chia sẻ nhiệm vụ

Tôi đang tìm yêu cầu đưa các tweet mới lên trang bảng điều khiển. Dưới đây là các bước tôi đã làm theo để tìm đúng yêu cầu

  • Đã mở tab Mạng trong công cụ Chrome Dev và nhấn XHR để chỉ thấy loại yêu cầu này [chứ không phải CSS, hình ảnh, v.v. ]
  • Kích hoạt một tải mới. Ctrl+R, đôi khi nó là nút “Load More”. Trong trường hợp này, nguyên nhân là do cuộn xuống
  • Xem qua các yêu cầu, cho đến khi tôi tìm thấy dữ liệu phù hợp trong đó, Ctrl+F

Bây giờ bạn có thể thấy rằng có một số dữ liệu đi qua mạng. Nếu trang web tải dữ liệu động, trang web thường sử dụng XMLHttpRequests [XHR]

XHR có thể phát sóng

Trình duyệt sử dụng API để lấy dữ liệu từ máy chủ. Và nó chính xác là những gì chúng tôi đang tìm kiếm. Ở đây, XHR là một yêu cầu GET chứa tất cả dữ liệu chúng tôi muốn loại bỏ

Đôi khi bạn chỉ cần sao chép URL đó và dán nó vào nơi khác, dữ liệu sẽ tăng lên. Nhưng ở đây hệ thống phức tạp hơn một chút. có một URL duy nhất được tạo cho mọi yêu cầu để ngăn không cho nó bị loại bỏ. Chúng ta sẽ xem sau cách xử lý việc này

Note: the headless browser renders everything from XHR requests and from content stored within tags, because the page behaves exactly as in the browser. You can use selenium, puppeteer, splash or any other js / headless browser rendering tool. But there are some downside :

  • Chậm hơn nhiều so với các yêu cầu HTTP đơn lẻ để cạo
  • Khó mở rộng quy mô và chạy các yêu cầu song song

Đó là một tùy chọn khi không có gì khác hoạt động hoặc khi yêu cầu đầu vào

Làm việc với các yêu cầu POST

Trong ví dụ của chúng tôi, chúng tôi đã làm việc với một yêu cầu GET

Nhưng điều gì sẽ xảy ra nếu trang web sử dụng các yêu cầu POST chỉ hoạt động trong ngữ cảnh của trang được tải [được bảo mật bằng cookie, tiêu đề, mã thông báo. ]?

Phương pháp này có thể được sử dụng để nhận đánh giá ứng dụng từ Cửa hàng Google Play. Trong hình bên dưới, bạn có thể thấy một ví dụ điển hình về yêu cầu POST cùng với dữ liệu của nó, được gửi cho mỗi 40 bài đánh giá mà bạn muốn xem

Để gửi yêu cầu POST, chúng ta có thể sử dụng jQuery. ajax[] và gọi nó từ ngữ cảnh của trang được tải trong trình duyệt không đầu. Để nhận được hơn 40 đánh giá, bạn có thể lặp lại tham số page [bằng cách phân tích cấu trúc URL]

XHR trong trường hợp này trả về dữ liệu HTML thay vì JSON, vì vậy chúng tôi phải phân tích chúng và sử dụng bộ chọn

Bằng cách này, bạn có thể thu thập thông tin và trích xuất 4.000 bài đánh giá cho một ứng dụng nhất định trên Cửa hàng Google Play trong vài giây

Cách xử lý 429 phản hồi HTTP

Trong một số trường hợp, bạn nhận được phản hồi 429 hoặc các phản hồi giới hạn tỷ lệ khác. Rất có khả năng trang web hiểu rằng bạn đang cạo nó và đang cố ngăn bạn

Cạo với tốc độ chậm hơn có thể là giải pháp. Hoặc bạn có thể sử dụng proxy [vì đó là một điểm thú vị, tôi sẽ viết một bài viết về điều đó sau]

Phần kết luận

Xin chúc mừng nếu bạn đã đến đây. Bằng cách truy cập trực tiếp vào lưu lượng truy cập mạng của trang web, chúng tôi đã quản lý để trích xuất dữ liệu không thể truy cập theo cách cổ điển. Hy vọng bạn đã học được một số thứ và thích đọc nó

Tôi có thể sử dụng Python để cạo dữ liệu không?

Thay vì xem trang web việc làm mỗi ngày, bạn có thể sử dụng Python để giúp tự động hóa các phần lặp đi lặp lại trong tìm kiếm việc làm của mình . Quét web tự động có thể là một giải pháp để tăng tốc quá trình thu thập dữ liệu. Bạn viết mã của mình một lần và nó sẽ nhận được thông tin bạn muốn nhiều lần và từ nhiều trang.

Làm cách nào để giám sát lưu lượng mạng bằng Python?

nhập thời gian nhập psutil UPDATE_DELAY = 1 # tính bằng giây def get_size[byte]. """ Trả về kích thước của byte ở định dạng đẹp """ cho đơn vị trong ['', 'K', 'M', 'G', 'T', 'P']. nếu byte < 1024. trả lại f"{byte. 2f}{unit}B" byte /= 1024
# lấy số liệu thống kê I/O của mạng từ psutil io = psutil

Mô-đun Python nào được sử dụng để quét web?

Những thư viện nào được sử dụng để quét web bằng Python? . Requests, BeautifulSoup, Scrapy, and Selenium, are some popular libraries used for web scraping in Python.

Các cách để cạo dữ liệu là gì?

Kỹ thuật thu thập dữ liệu .
Phân tích cú pháp HTML. Phân tích cú pháp HTML liên quan đến việc sử dụng JavaScript để nhắm mục tiêu trang HTML tuyến tính hoặc lồng nhau. .
Phân tích cú pháp DOM. .
Tổng hợp theo chiều dọc. .
XPath. .
Google Trang tính. .
Tỷ lệ giới hạn Yêu cầu người dùng. .
Giảm thiểu những người yêu cầu số lượng lớn bằng CAPTCHA. .
Thường xuyên sửa đổi đánh dấu HTML

Chủ Đề