跳到正文
DEV Community· Mạnh Digital·· 4 小時前AI 評分68

如何檢查 AI 爬蟲能否讀取網站:robots.txt、初始 HTML 與伺服器日誌

Kiểm tra AI crawler có đọc được site không: robots.txt, HTML ban đầu và log server

AI 導讀

Mạnh Digital 分享一套檢查 AI 爬蟲能否讀取網站的方法,分別核對 robots.txt、爬蟲 user-agent 取得的 HTML,以及伺服器 access log。做法包括以 curl 檢查 robots.txt 狀態、模擬各 bot 的 user-agent 查看 HTTP 回應和初始 HTML,再從 access log 核對狀態碼及來源 IP。

正文

Tuần trước một người quen nhờ mình xem vì sao ChatGPT trả lời về công ty anh ấy toàn thông tin cũ. Nội dung không sai, schema cũng có. Kiểm tra một lúc mới ra nguyên nhân rất "dev": robots.txt đang chặn một bot tìm kiếm của AI, còn trang dịch vụ thì phần mô tả chỉ hiện ra sau khi JavaScript chạy xong.

Bài này ghi lại cách mình kiểm tra theo ba lớp: robots.txt, HTML ban đầu và log server. Toàn bộ chỉ cần terminal, curl, grep và quyền đọc access log. Mình không bàn chuyện nội dung hay thực thể ở đây, chỉ xem bot có vào được và đọc được hay không.

Các user-agent nên biết

Không có danh sách nào đầy đủ mãi, nhưng đây là những cái mình hay gặp nhất:

  • GPTBot (OpenAI): thu thập nội dung có thể dùng để huấn luyện mô hình. Chặn GPTBot nghĩa là bạn không muốn nội dung bị dùng cho việc đó.
  • OAI-SearchBot (OpenAI): dùng cho tính năng tìm kiếm của ChatGPT. Theo tài liệu của OpenAI, site chặn bot này sẽ không xuất hiện trong câu trả lời tìm kiếm của ChatGPT (vẫn có thể hiện dạng link điều hướng).
  • ChatGPT-User (OpenAI): truy cập khi người dùng yêu cầu ChatGPT mở một trang. OpenAI ghi rõ đây là hành động do người dùng khởi tạo nên robots.txt có thể không áp dụng.
  • ClaudeBot (Anthropic) và PerplexityBot (Perplexity): crawler của hai nền tảng này.
  • Google-Extended: chỉ là một token trong robots.txt, không có user-agent riêng nên bạn sẽ không thấy nó trong log. Google dùng nó để bạn chọn có cho nội dung phục vụ Gemini hay không; nó không ảnh hưởng tới việc trang có lên Google Search. AI Overviews vẫn đi theo Googlebot và index thông thường.

Điểm quan trọng: ba bot của OpenAI là ba thiết lập độc lập. Bạn hoàn toàn có thể mở OAI-SearchBot để được tìm thấy trong ChatGPT search mà vẫn chặn GPTBot.

Lớp 1: đọc robots.txt cho đúng

Đầu tiên lấy file về:

curl -s https://example.com/robots.txt

Chỗ nhiều người đọc nhầm: một crawler chỉ theo nhóm user-agent khớp cụ thể nhất với nó. Nếu file có nhóm User-agent: GPTBot thì GPTBot bỏ qua hoàn toàn nhóm User-agent: *, kể cả các dòng Disallow bạn tưởng là áp dụng cho mọi bot. Ví dụ:

User-agent: *
Disallow: /admin/

User-agent: GPTBot
Disallow: /

Ở đây GPTBot bị chặn toàn site, còn OAI-SearchBot, ClaudeBot, PerplexityBot rơi vào nhóm * nên chỉ bị chặn /admin/. Nếu bạn muốn cho bot tìm kiếm vào nhưng chặn bot huấn luyện, viết rõ từng nhóm:

User-agent: OAI-SearchBot
Allow: /

User-agent: GPTBot
Disallow: /

User-agent: Google-Extended
Disallow: /

Mình hay lọc nhanh các dòng liên quan bằng:

curl -s https://example.com/robots.txt \
  | grep -inE -A3 'user-agent: *(\*|gptbot|oai-searchbot|chatgpt-user|claudebot|perplexitybot|google-extended)'

Hai lỗi mình gặp nhiều nhất: plugin bảo mật hoặc CDN tự thêm nhóm chặn "AI bots" mà chủ site không biết, và robots.txt bị trả về 403 hoặc trang HTML lỗi thay vì file text. Kiểm tra luôn status và content-type:

curl -sI https://example.com/robots.txt | grep -iE '^(HTTP|content-type)'

OpenAI cũng lưu ý thay đổi robots.txt có thể mất khoảng 24 giờ để hệ thống tìm kiếm của họ cập nhật, nên đừng sửa xong rồi thử ngay.

Lớp 2: gọi trang bằng user-agent của bot và xem HTML ban đầu

robots.txt cho phép không có nghĩa là server cho phép. WAF, Cloudflare hay rule chống bot có thể trả 403, 429 hoặc trang challenge cho đúng mấy user-agent này. Mình giả lập bằng curl:

URL="https://example.com/dich-vu/abc"

for UA in \
  "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; GPTBot/1.4; +https://openai.com/gptbot" \
  "Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko); compatible; ChatGPT-User/1.0; +https://openai.com/bot" \
  "OAI-SearchBot/1.4" \
  "ClaudeBot/1.0" \
  "PerplexityBot/1.0"
do
  printf '%-20s ' "$(echo "$UA" | grep -oE '(GPTBot|ChatGPT-User|OAI-SearchBot|ClaudeBot|PerplexityBot)')"
  curl -s -o /dev/null -A "$UA" -w '%{http_code} %{size_download} bytes\n' "$URL"
done

Chuỗi user-agent đầy đủ có số phiên bản thay đổi theo thời gian; với việc kiểm tra rule chặn theo tên thì chỉ cần chứa đúng tên bot là đủ. Kết quả cần nhìn: mọi dòng nên là 200 và kích thước gần bằng nhau. Một dòng 403, hoặc 200 nhưng chỉ vài KB trong khi trình duyệt nhận cả trăm KB, thường là trang challenge.

Lưu ý: cách này chỉ kiểm tra được rule chặn theo user-agent. Nếu firewall chặn theo IP hoặc ASN thì curl từ máy bạn vẫn qua, còn bot thật thì không. Vì vậy cần lớp 3.

Nội dung có nằm trong HTML ban đầu không

Nhiều bot AI đọc HTML trả về chứ không chạy JavaScript như trình duyệt. Nếu site là SPA render phía client, bot có thể chỉ thấy một <div id="root"></div> trống.

Cách kiểm tra đơn giản: chọn một câu quan trọng (tên dịch vụ, giá, địa chỉ) và grep trong HTML thô:

curl -s -A "GPTBot/1.4" "$URL" | grep -c "Dịch vụ thiết kế website"

Ra 0 thì có hai khả năng: nội dung do JS tạo ra, hoặc chuỗi bị encode thành HTML entity. Để chắc, mình bỏ thẻ và xem phần text thô:

curl -s -A "GPTBot/1.4" "$URL" \
  | python3 -c "import sys,re,html; t=sys.stdin.read(); t=re.sub(r'<(script|style)[^>]*>.*?</\1>','',t,flags=re.S); t=html.unescape(re.sub(r'<[^>]+>','\n',t)); print('\n'.join(l.strip() for l in t.splitlines() if l.strip()))" \
  | head -50

Nếu 50 dòng đầu chỉ có menu, footer và "Loading...", đó là dấu hiệu nội dung chính không nằm trong HTML ban đầu. Hướng sửa thường là SSR, SSG hoặc prerender cho các trang quan trọng; tùy framework mà cách làm khác nhau.

Cũng nên kiểm tra thêm <title>, meta description và thẻ <meta name="robots"> trong HTML thô, vì có site gắn noindex bằng JS rồi quên gỡ:

curl -s "$URL" | grep -oiE '<(title|meta name="(description|robots)")[^>]*>[^<]*'

Lớp 3: đọc access log

Đây là nơi trả lời câu hỏi "bot có thực sự ghé không". Với log nginx hoặc Apache dạng combined:

# Đếm lượt truy cập theo từng bot (gồm cả log đã nén)
zgrep -hoiE 'GPTBot|OAI-SearchBot|ChatGPT-User|ClaudeBot|PerplexityBot' /var/log/nginx/access.log* \
  | sort | uniq -c | sort -rn
# Xem bot gặp status nào, ở URL nào
grep -iE 'GPTBot|OAI-SearchBot|ClaudeBot|PerplexityBot' /var/log/nginx/access.log \
  | awk '{print $9, $7}' | sort | uniq -c | sort -rn | head -30

Nếu thấy nhiều 403 hoặc 429, quay lại xem rule WAF hoặc rate limit. Nếu hoàn toàn không có dòng nào sau vài tuần, có thể bot chưa biết tới site, hoặc bị chặn từ tầng CDN trước khi request tới server; khi đó cần xem log hoặc dashboard của CDN.

User-agent thì ai cũng giả được. OpenAI công bố dải IP cho từng bot ở các file JSON như https://openai.com/gptbot.json, searchbot.json, chatgpt-user.json. Mình kiểm tra một IP trong log như sau:

IP="20.171.206.10"
curl -s https://openai.com/gptbot.json \
  | jq -r '.prefixes[] | .ipv4Prefix // .ipv6Prefix' \
  | python3 -c "import sys,ipaddress; ip=ipaddress.ip_address('$IP'); print(any(ip in ipaddress.ip_network(l.strip()) for l in sys.stdin if l.strip()))"

Ra True thì đúng là bot của OpenAI. Với các bot khác, xem trang tài liệu crawler của từng bên để lấy cách xác minh tương ứng.

Checklist ngắn

  1. robots.txt trả 200, text/plain, không có nhóm chặn bot mà bạn không chủ động thêm.
  2. Mỗi bot bạn muốn cho vào được xử lý đúng nhóm user-agent của nó, không trông vào nhóm *.
  3. curl với từng user-agent đều ra 200 và kích thước tương đương trình duyệt.
  4. Câu quan trọng nhất của trang có trong HTML thô, không cần JS.
  5. Không có noindex ngoài ý muốn trong HTML ban đầu.
  6. Log có lượt truy cập từ bot, status chủ yếu là 200, IP khớp dải được công bố.
  7. Trang đã được Google index, vì AI Overviews chỉ lấy nguồn từ trang đủ điều kiện hiển thị trên Google Search.

Ba lớp này chỉ trả lời câu hỏi bot có đọc được site hay không. Đọc được rồi mà AI vẫn tả sai công ty thì vấn đề nằm ở nội dung và nguồn bên ngoài; phần đó mình đã viết riêng trong checklist 30 phút tìm lý do ChatGPT mô tả sai doanh nghiệp.

Nếu bạn không có quyền đọc log hay không muốn tự mò rule CDN, Mạnh Digital có dịch vụ tối ưu cho AI search, trong đó phần kỹ thuật gồm đưa nội dung quan trọng vào HTML ban đầu và cấu hình robots.txt cho các bot AI. Còn nếu tự làm, chạy hết checklist trên một lần là đã loại được phần lớn lỗi mình hay gặp.

來源:DEV Community · dev.to