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 HTMLTrong 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 HTMLChú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 POSTTrong 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 HTTPTrong 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ậnXin 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ó