External link thường bị bỏ quên sau khi đăng bài: trang đích đổi địa chỉ, gỡ bài, hoặc plugin âm thầm gắn nofollow cho tất cả. Bài này viết một script audit link ra ngoài của một trang theo các quy tắc trong tài liệu về link của Google.
Những gì cần bắt
- Link gãy: trang đích trả về 404 hoặc lỗi.
- Link trả phí không khai báo: link affiliate thiếu
rel="sponsored". - Nofollow tràn lan: link tới nguồn đáng tin cũng bị gắn nofollow.
- Link trỏ về trang chủ nguồn thay vì trang chứa thông tin.
- Anchor chung chung kiểu "xem tại đây".
noopener không phải nofollow
WordPress tự thêm rel="noopener" khi chọn "Mở trong tab mới". Đó là thuộc tính bảo mật, không liên quan SEO. Script phải tách các giá trị rel ra rồi mới xét, đừng kiểm "rel" in a.attrs.
rel = set((a.get("rel") or [])) # BeautifulSoup trả rel dạng list
co_khai_bao = rel & {"sponsored", "ugc", "nofollow"}
Script
from urllib.parse import urlparse
import requests
from bs4 import BeautifulSoup
ANCHOR_CHUNG = {"tại đây", "xem tại đây", "click here", "here", "link", "xem thêm"}
DAU_HIEU_AFFILIATE = ("ref=", "aff", "utm_source=affiliate", "/go/")
def audit_external(html: str, ten_mien: str) -> list:
soup = BeautifulSoup(html, "html.parser")
loi = []
for a in soup.find_all("a", href=True):
url = a["href"]
host = urlparse(url).netloc.lower()
if not host or host.endswith(ten_mien):
continue # internal link
rel = set(a.get("rel") or [])
anchor = a.get_text(" ", strip=True).lower()
if anchor in ANCHOR_CHUNG:
loi.append(("anchor_chung_chung", url))
if any(k in url.lower() for k in DAU_HIEU_AFFILIATE) and "sponsored" not in rel:
loi.append(("nghi_affiliate_thieu_sponsored", url))
if urlparse(url).path in ("", "/"):
loi.append(("tro_trang_chu_nguon", url))
try:
r = requests.head(url, allow_redirects=True, timeout=10)
if r.status_code in (405, 403):
r = requests.get(url, allow_redirects=True, timeout=10, stream=True)
if r.status_code >= 400:
loi.append((f"link_gay_{r.status_code}", url))
except requests.RequestException as e:
loi.append(("khong_truy_cap_duoc", f"{url} ({type(e).__name__})"))
return loi
Đếm tỷ lệ nofollow
Nếu gần như mọi link ra ngoài của website đều có nofollow, nhiều khả năng một plugin đang gắn tự động. Google khuyên chỉ dùng nofollow khi không tin nguồn, không phải cho mọi external link. Link tới nguồn đáng tin như tài liệu chính thức nên để bình thường.
def ty_le_nofollow(cac_link):
ngoai = [a for a in cac_link if a["ngoai"]]
nf = [a for a in ngoai if "nofollow" in a["rel"]]
return len(nf) / max(len(ngoai), 1)
Giới hạn của script
Dấu hiệu affiliate trong URL chỉ là heuristic, mỗi chương trình affiliate có dạng link riêng. Script cũng không biết nguồn có đáng tin hay có đúng ý đoạn văn không. Hai câu hỏi đó vẫn là việc của người viết. Theo Google, các giá trị rel từ năm 2019 được xem là gợi ý, và có thể ghép nhiều giá trị như rel="ugc nofollow".
Phần dành cho người viết nội dung, gồm 5 quy tắc đặt link ra ngoài và bảng nguồn nên dẫn theo lĩnh vực, có trong bài External link là gì trên Onic.vn.
Top comments (0)