Tôi chạy một trang web cho một khách hàng nơi họ hiển thị một cơ sở dữ liệu lớn của thông tin mà họ đã thu thập chính xác và chậm trong những năm qua. Họ đang tìm kiếm dữ liệu của họ trên web ở nhiều nơi khác nhau. Nhiều hơn khả năng của nó do một scraper đi qua trang web của họ theo trang và trích xuất các thông tin mà họ cần vào một cơ sở dữ liệu của riêng mình. Và trong trường hợp bạn đang tự hỏi, họ biết đó là dữ liệu của họ vì một mảnh dữ liệu được trồng duy nhất trong mỗi danh mục trên trang web của họ.
Tôi đã thực hiện rất nhiều nghiên cứu về điều này trong vài ngày qua, và tôi có thể nói với bạn rằng không có một giải pháp hoàn hảo nào. Tôi đã tìm thấy một số điều cần làm để thực hiện điều này một chút khó khăn hơn cho họ tuy nhiên. Đây là những gì tôi đã triển khai cho khách hàng.
Dữ liệu được phân trang đã được Ajax hóa
Nếu bạn có nhiều dữ liệu được phân trang và bạn đang phân trang dữ liệu của mình bằng cách chỉ thêm một số khác vào cuối URL của bạn, ví dụ: http://www.domain.com/category/programming/2 - Sau đó, bạn đang tạo công việc của trình thu thập thông tin dễ dàng hơn nhiều. Vấn đề đầu tiên là, nó trong một mẫu dễ nhận biết, do đó, thiết lập một scraper lỏng lẻo trên các trang này rất dễ dàng như chiếc bánh. Vấn đề thứ hai, bất kể URL của các trang tiếp theo trong danh mục, nhiều khả năng sẽ có một liên kết tiếp theo và trước đó để chúng bám vào.
Bằng cách tải dữ liệu được phân trang qua javascript mà không cần tải lại trang, điều này làm phức tạp đáng kể công việc cho rất nhiều mẩu tin lưu niệm ở đó. Google gần đây mới bắt đầu phân tích cú pháp javascript trên trang. Có rất ít bất lợi khi tải lại dữ liệu như thế này. Bạn cung cấp một vài trang ít hơn để Google lập chỉ mục, nhưng về mặt kỹ thuật, tất cả dữ liệu được phân trang đều phải trỏ đến trang danh mục gốc thông qua chuẩn hóa. Ajaxify các trang dữ liệu được phân trang của bạn.
Ngẫu nhiên đầu ra mẫu
Scrapers thường sẽ được tùy chỉnh một chút cho dữ liệu của bạn một cách cụ thể. Họ sẽ chốt vào một id div hoặc lớp nhất định cho tiêu đề, ô thứ 3 trong mỗi hàng cho mô tả của bạn, v.v. Có một mẫu dễ nhận biết cho hầu hết các trình cắm để làm việc với hầu hết dữ liệu đến từ cùng một bảng, được hiển thị bởi cùng một mẫu. Ngẫu nhiên các id div và tên lớp của bạn, chèn các cột bảng trống một cách ngẫu nhiên với độ rộng 0. Hiển thị dữ liệu của bạn trong một bảng trên một trang, trong các div được tạo kiểu và kết hợp trên một mẫu khác. Bằng cách trình bày dữ liệu của bạn có thể dự đoán được, nó có thể được lấy ra dự đoán và chính xác.
Hũ mật ong
Điều này là khá gọn gàng trong sự đơn giản của nó. Tôi đã đi qua phương pháp này trên một số trang về ngăn chặn trang web cạo.
- Tạo một tệp mới trên máy chủ của bạn có tên là gotcha.html.
- Trong tệp robots.txt của bạn, hãy thêm thông tin sau:
Đại lý người dùng: *
Disallow: /gotcha.html
Điều này cho biết tất cả các rô-bốt và nhện đều có lập chỉ mục trang web của bạn để không lập chỉ mục tệp gotcha.html. Bất kỳ trình thu thập dữ liệu web thông thường nào cũng sẽ tôn trọng mong muốn của tệp robots.txt của bạn và không truy cập tệp đó. tức là Google và Bing. Bạn có thể thực sự muốn thực hiện bước này và đợi 24 giờ trước khi thực hiện bước tiếp theo. Điều này sẽ đảm bảo rằng trình thu thập thông tin không vô tình bị bạn chặn do thực tế là trình thu thập dữ liệu đã ở giữa khi bạn cập nhật tệp robots.txt của mình. - Đặt liên kết đến gotcha.html ở đâu đó trên trang web của bạn. Không quan trọng ở đâu. Tuy nhiên, tôi khuyên bạn nên sử dụng chân trang, đảm bảo liên kết này không hiển thị, trong CSS, display: none;
- Bây giờ, hãy ghi lại thông tin IP / thông tin chung của perp đã truy cập trang này và chặn chúng. Ngoài ra, bạn có thể đưa ra một kịch bản để cung cấp cho họ dữ liệu không chính xác và rác. Hoặc có thể là một thông điệp cá nhân tốt đẹp từ bạn cho họ.
Người xem web thông thường sẽ không thể nhìn thấy liên kết, vì vậy nó sẽ không vô tình được nhấp vào. Trình thu thập dữ liệu có uy tín (ví dụ: Google), sẽ tôn trọng mong muốn của robots.txt của bạn và không truy cập tệp. Vì vậy, các máy tính duy nhất mà nên vấp ngã trên trang này là những người có ý định độc hại, hoặc ai đó xem mã nguồn của bạn và ngẫu nhiên nhấp chuột xung quanh (và cũng oh nếu điều đó xảy ra).
Có một vài lý do có thể không phải lúc nào cũng hoạt động. Đầu tiên, rất nhiều trình gỡ rối không hoạt động như trình thu thập dữ liệu web bình thường và không chỉ khám phá dữ liệu bằng cách theo dõi mọi liên kết từ mọi trang trên trang web của bạn. Scrapers thường được xây dựng để sửa chữa trên một số trang nhất định và chỉ theo một số cấu trúc nhất định. Ví dụ, một scraper có thể được bắt đầu trên một trang thể loại, và sau đó chỉ nói để truy cập URL với từ / dữ liệu trong slug. Thứ hai, nếu ai đó đang chạy scraper của họ trên cùng một mạng như những người khác, và có một IP được chia sẻ đang được sử dụng, bạn sẽ cấm toàn bộ mạng. Bạn sẽ phải có một trang web rất phổ biến thực sự cho điều này là một vấn đề.
Ghi dữ liệu vào ảnh ngay lập tức
Tìm một trường dữ liệu nhỏ hơn, không nhất thiết là chuỗi văn bản dài vì điều này có thể làm cho việc tạo kiểu trang trở nên khó khăn hơn một chút. Xuất dữ liệu này bên trong một hình ảnh, tôi cảm thấy khá tự tin rằng có những phương pháp chỉ bằng mọi ngôn ngữ lập trình để viết văn bản vào một hình ảnh động (trong php, imagettftext). Điều này có lẽ hiệu quả nhất với các giá trị số như số cung cấp một lợi thế SEO không đáng kể hơn nhiều.
Thay thế
Đây không phải là một lựa chọn cho dự án này. Yêu cầu đăng nhập sau một số lần truy cập trang nhất định hoặc hiển thị lượng dữ liệu giới hạn mà không cần đăng nhập. Nghĩa là nếu bạn có 10 cột, chỉ hiển thị 5 cho người dùng không đăng nhập.
Đừng mắc lỗi này
Đừng bận tâm cố gắng tìm ra một số giải pháp dựa trên user-agent của bot. Thông tin này có thể dễ dàng bị giả mạo bởi một scraper người biết những gì họ đang làm. Ví dụ: bot google có thể dễ dàng được mô phỏng. Bạn có nhiều khả năng không muốn cấm Google.