Rails

Block Web Crawlers với Rails

Các công cụ tìm kiếm Thu thập dữ liệu và các chỉ số nội dung trên web của Google thông qua các chương trình được gọi là rô bốt (còn gọi là trình thu thập dữ liệu hoặc trình thu thập dữ liệu). Điều này có thể có vấn đề cho các dự án của chúng tôi trong các tình huống như:

  • một môi trường staging
  • di chuyển dữ liệu từ hệ thống cũ sang địa điểm mới
  • tung ra các tính năng alpha hoặc beta

Các cách tiếp cận để chặn trình thu thập thông tin trong các tình huống này bao gồm:

  • authentication (tốt nhất)
  • robots.txt (crawling)
  • X-Robots-Tag (indexing)

Vấn đề: trùng lặp nội dung

Với nhiều môi trường hoặc trong giai đoạn di chuyển dữ liệu, nội dung trùng lặp có thể được truy cập bởi các trình thu thập thông tin. Các công cụ tìm kiếm sẽ phải đoán phiên bản nào để lập chỉ mục, gán quyền và xếp hạng trong kết quả truy vấn.

Ví dụ: chúng tôi định kỳ sao lưu dữ liệu cho production của mình vào môi trường dàn dựng bằng Parity :

production backup
staging restore production

Những công cụ tìm kiếm làm

Để cung cấp kết quả, công cụ tìm kiếm có thể chuẩn bị bằng cách thực hiện những điều sau:

  1. kiểm tra cài đặt robot của tên miền (ví dụ http://example.com/robots.txt)
  2. yêu cầu một trang web trên tên miền (ví dụ http://example.com/)
  3. kiểm tra X-Robots-Tag tiêu đề phản hồi HTTP của trang web
  4. lưu trữ trang web (lưu cơ quan phản hồi của nó)
  5. lập chỉ mục trang web (trích xuất từ khóa từ phản hồi để tra cứu nhanh)
  6. theo liên kết trên trang web đến các trang web khác và lặp lại

Các bước 1, 2, 3 và 6 nói chung là các bước thu thập dữ liệu của Google và các bước 4 và 5 nói chung là các bước lập chỉ mục.

Giải pháp: authentication (tốt nhất)

Cách đáng tin cậy nhất để ẩn nội dung khỏi trình thu thập thông tin là xác thực, chẳng hạn như xác thực HTTP Basic :

class ApplicationController < ActionController::Base
  if ENV["DISALLOW_ALL_WEB_CRAWLERS"].present?
    http_basic_authenticate_with(
      name: ENV.fetch("BASIC_AUTH_USERNAME"),
      password: ENV.fetch("BASIC_AUTH_PASSWORD"),
    )
  end
end

Đây thường là tất cả những gì chúng ta cần cho các tình huống như môi trường staging. Các cách tiếp cận sau đây hạn chế hơn nhưng có thể phù hợp hơn cho các tình huống khác.

Lưu ý rằng chúng ta có thể kiểm soát xem trình thu thập thông tin có được phép truy cập nội dung qua cấu hình trong môi trường hay không . Chúng ta có thể sử dụng Parity một lần nữa để thêm cấu hình cho dàn Heroku:

staging config:set DISALLOW_ALL_WEB_CRAWLERS=true

Giải pháp: robot.txt (crawling)

Các tiêu chuẩn loại trừ rô bốt giúp robot quyết định những gì hành động để thực hiện. Một robot đầu tiên nhìn vào /robots.txt tệp trên miền trước khi thu thập thông tin.


Nó là một tiêu chuẩn thực tế (không thuộc sở hữu của một cơ quan tiêu chuẩn) và được robot chọn tham gia. Các robot chính thống như Googlebot tôn trọng các tiêu chuẩn nhưng các diễn viên xấu có thể không.

Một tệp /robots.txt ví dụ trông như thế này:

User-agent: *
Disallow: /

Khối này (không cho phép) tất cả nội dung (/) cho tất cả các trình thu thập thông tin User-agent. Xem danh sách trình thu thập dữ liệu Google để biết ví dụ về mã thông báo tác nhân người dùng.

Globbing và biểu thức thông thường không được hỗ trợ trong tập tin này. Xem những gì có thể đi trong đó .

Thêm Climate Control để Gemfile kiểm soát các biến môi trường trong các thử nghiệm:

gem "climate_control"

Trong spec/requests/robots_txt_spec.rb:

require "rails_helper"

describe "robots.txt" do
  context "when not blocking all web crawlers" do
    it "allows all crawlers" do
      get "/robots.txt"

      expect(response.code).to eq "404"
      expect(response.headers["X-Robots-Tag"]).to be_nil
    end
  end

  context "when blocking all web crawlers" do
    it "blocks all crawlers" do
      ClimateControl.modify "DISALLOW_ALL_WEB_CRAWLERS" => "true" do
        get "/robots.txt"
      end

      expect(response).to render_template "disallow_all"
      expect(response.headers["X-Robots-Tag"]).to eq "none"
    end
  end
end

Google khuyến nghị không có tệp robots.txt nếu chúng tôi muốn tất cả nội dung của chúng tôi được thu thập thông tin.

Trong ```config/routes.rb``:

get "/robots.txt" => "robots_txts#show"

Trong app/controllers/robots_txts_controller.rb:

class RobotsTxtsController < ApplicationController
  def show
    if disallow_all_crawlers?
      render "disallow_all", layout: false, content_type: "text/plain"
    else
      render nothing: true, status: 404
    end
  end

  private

  def disallow_all_crawlers?
    ENV["DISALLOW_ALL_WEB_CRAWLERS"].present?
  end
end

Nếu chúng tôi đang sử dụng thư viện xác thực, chẳng hạn như trang web Clearance , chúng tôi sẽ muốn bỏ qua bộ lọc của nó trong bộ điều khiển của chúng tôi:

class ApplicationController < ActionController::Base
  before_action :require_login
end

class RobotsTxtsController < ApplicationController
  skip_before_action :require_login
end

Xóa Rails mặc định robots.txt và chuẩn bị thư mục tùy chỉnh:

rm public/robots.txt
mkdir app/views/robots_txts

Trong app/views/robots_txts/disallow_all.erb:

User-agent: *
Disallow: /

Giải pháp: X-Robots-Tag (indexing)

Có thể các công cụ tìm kiếm lập chỉ mục nội dung mà không cần thu thập thông tin vì các trang web có thể liên kết với nội dung đó. Vì vậy, robots.txt kỹ thuật của chúng tôi đã chặn thu thập thông tin, nhưng không lập chỉ mục.

Thêm một X-Robots-Tag header để trả lời của chúng tôi ngắn mạch toàn bộ quá trình; Trình thu thập thông tin hoạt động tốt sẽ không thực hiện các yêu cầu HTTP đối với nội dung trên miền.

Bạn có thể đã thấy các thẻ meta như thế này trong các dự án bạn đã làm việc trên:

<meta name="robots" content="noindex,nofollow">

Các X-Robots-Tag header có tác dụng tương tự như các robots thẻ meta nhưng áp dụng cho tất cả các loại nội dung trong ứng dụng của chúng tôi (ví dụ như hình ảnh, kịch bản, phong cách), không chỉ các file HTML.

Để chặn robot trong môi trường của chúng tôi, chúng tôi muốn một tiêu đề như thế này:

X-Robots-Tag: none

Lệnh nonenày tương đương với noindex, nofollow . Nó bảo robot không lập chỉ mục, theo liên kết hoặc bộ đệm.

Trong lib/rack_x_robots_tag.rb:

module Rack
  class XRobotsTag
    def initialize(app)
      @app = app
    end

    def call(env)
      status, headers, response = @app.call(env)

      if ENV["DISALLOW_ALL_WEB_CRAWLERS"].present?
        headers["X-Robots-Tag"] = "none"
      end

      [status, headers, response]
    end
  end
end

Trong config/application.rb:

require_relative "../lib/rack_x_robots_tag"

module YourAppName
  class Application < Rails::Application
    # ...
    config.middleware.use Rack::XRobotsTag
  end
end

Thông số kỹ thuật của chúng tôi bây giờ sẽ vượt qua.

Phần kết luận

Nội dung của môi trường của chúng tôi có thể bị chặn theo ba cách khác nhau từ thu thập dữ liệu và lập chỉ mục bởi các robot web tôn trọng tiêu chuẩn loại trừ robot (quan trọng nhất là Google).

Sử dụng xác thực để ẩn hoàn toàn hoặc robot.txt cộng với X-Robots-Tag kiểm soát chi tiết hơn.

Nguồn bài viết: https://thoughtbot.com/blog/block-web-crawlers-with-rails


Happy Codding!

Registration Login
Sign in with social account
or
Lost your Password?
Registration Login
Sign in with social account
or
A password will be send on your post
Registration Login
Registration