SemrushEnterpriseby LionTech · Vietnam PartnerĐăng ký demo ↗
SEO tổng quan

Phân tích nội dung bằng XML Sitemaps và Python

Cách phân tích nội dung của một website theo thời gian bằng XML Sitemap và tải mẫu Python miễn phí để phân tích sitemap, kèm theo notebook tương tác. Hữu ích cho việc nghiên cứu đối thủ cạnh tranh.

Bạn sẽ bắt đầu từ đâu nếu muốn tìm hiểu nội dung của một website, đặc biệt là các nhà xuất bản lớn?

Tôi thường quan tâm đến những câu hỏi sau:

  • Họ xuất bản thường xuyên đến mức nào và đăng bao nhiêu nội dung?
  • Hoạt động xuất bản của họ có xu hướng theo ngày, tuần, tháng hoặc năm không?
  • Họ viết về những chủ đề nào hoặc bán sản phẩm gì?
  • Chủ đề của họ có những xu hướng gì? Chủ đề nào đang tăng về số lượng, chủ đề nào thì không?
  • Nội dung hoặc sản phẩm được phân chia như thế nào theo ngôn ngữ, khu vực, danh mục hoặc tác giả?

Ở dạng cơ bản nhất, sitemap chỉ cần có thẻ “loc” (nằm bên trong thẻ “url” cha).

Về cơ bản, một sitemap có thể chỉ là danh sách URL. Sitemap cũng được phép có các thẻ tùy chọn khác, quan trọng nhất là:

  • "lastmod",
  • "changefreq",
  • "priority",
  • Và trong một số trường hợp, "alternate".

Nếu sitemap có "lastmod" (và hầu hết các website uy tín đều có), bạn có thể thu thập mọi thông tin liên quan đến hoạt động và xu hướng xuất bản. Mức độ phong phú của URL sẽ quyết định lượng thông tin bạn có thể trích xuất. Tuy nhiên, hãy lưu ý rằng nếu URL được cấu trúc mà không chứa thông tin thực sự, chẳng hạn như example.com/product/12345, thì bạn sẽ không thể lấy được nhiều thông tin từ sitemap.

Mục tiêu của hướng dẫn này là giúp sitemap bớt nhàm chán hơn một chút!

Tôi sẽ phân tích sitemap của BuzzFeed. Vì họ có "lastmod" và URL nhất quán, giàu thông tin, chúng ta sẽ có thể trả lời tất cả câu hỏi nêu trên.

Thông tin này sẽ được dùng làm đại diện cho "publishing date" (ngày xuất bản). Cách này không chính xác tuyệt đối vì các trang có thể được cập nhật. Nhìn chung, tôi nhận thấy nếu nội dung có thay đổi thì thường là trong vòng một hoặc hai ngày để chỉnh sửa một vài điểm, còn phần lớn thì không thay đổi.

Phân tích bằng Python

Tôi sẽ dùng Python để phân tích, và bạn có thể xem phiên bản tương tác của bài viết tại đây. Nếu muốn theo dõi từng bước, tôi khuyến khích bạn xem thử. Nhờ đó, bạn có thể chỉnh sửa và khám phá những khía cạnh khác mà mình quan tâm.

Các hình ảnh trực quan hóa dữ liệu cũng có tính tương tác, vì vậy bạn có thể phóng to, di chuột và khám phá kỹ hơn. Nếu không biết lập trình, bạn có thể yên tâm bỏ qua tất cả đoạn code (dù sao tôi cũng sẽ giải thích chúng).

Vậy hãy bắt đầu.

Để lấy các sitemap ở định dạng bảng, tôi sẽ dùng hàm sitemap_to_df từ package advertools. "df" là viết tắt của DataFrame, về cơ bản là một bảng dữ liệu.

Bạn chỉ cần truyền URL của một sitemap (hoặc URL của sitemap index) vào hàm, hàm sẽ trả về các sitemap ở định dạng bảng. Nếu bạn cung cấp một sitemap index, hàm sẽ duyệt qua tất cả sitemap con để trích xuất URL cùng mọi dữ liệu khác hiện có. Ngoài advertools, tôi sẽ dùng pandas để xử lý dữ liệu và plotly để trực quan hóa dữ liệu.

Lấy sitemap của BuzzFeed và gộp chúng vào một DataFrame

Một số hàng mẫu từ DataFrame "buzzfeed"

Phần trên là một tập con nhỏ của DataFrame — "lastmod" là chỉ mục và chúng ta có hai cột: "loc" chứa URL, còn "sitemap" là URL của sitemap nơi URL đó được lấy.

"NaT" là viết tắt của "not-a-time", cách biểu thị giá trị thiếu của các đối tượng ngày/giờ. Như bạn thấy, chúng ta có khoảng nửa triệu URL cần xử lý.

Trích xuất danh mục Sitemap

Nếu xem URL của các sitemap, bạn sẽ thấy chúng chứa danh mục của website, chẳng hạn:

https://www.buzzfeed.com/sitemap/buzzfeed/2019_5.xml
https://www.buzzfeed.com/sitemap/shopping/2018_13.xml

Điều này có thể giúp xác định URL thuộc danh mục nào.

Để trích xuất danh mục từ các URL đó, dòng lệnh sau sẽ tách URL XML tại ký tự gạch chéo xuôi rồi lấy phần tử thứ năm (chỉ mục 4) trong danh sách kết quả. Văn bản được trích xuất sẽ được gán vào một cột mới có tên sitemap_cat.

Các danh mục Sitemap được trích xuất và đưa vào cột mới "sitemap_cat"

Giờ đây, khi đã có một cột hiển thị danh mục, chúng ta có thể đếm số URL trong từng danh mục và nắm được tổng quan về lượng nội dung tương ứng.

Đoạn code sau chỉ đếm các giá trị trong cột đó rồi định dạng DataFrame thu được.

Số bài viết trong mỗi danh mục, kèm tỷ lệ phần trăm

Có thể thấy "buzzfeed" là danh mục chính, về cơ bản tương ứng với website chính, còn các danh mục khác nhỏ hơn nhiều.

Trước khi tiếp tục, điều quan trọng là cần hiểu rõ hơn các giá trị NaT mà chúng ta thấy ở đầu. Hãy xem chúng thuộc danh mục nào.

Các danh mục không có "lastmod" (năm mục đầu tiên)

Năm mục đầu tiên thuộc "video", nhưng liệu điều này có đúng với tất cả giá trị bị thiếu không?

Dòng lệnh sau lấy một tập con của DataFrame Buzzfeed (tập con có chỉ mục chứa giá trị bị thiếu), sau đó lấy cột sitemap_cat rồi đếm số giá trị duy nhất. Vì chúng ta thấy một số giá trị là "video", nếu chỉ có một giá trị duy nhất thì mọi danh mục có ngày bị thiếu đều thuộc "video".

Số danh mục duy nhất không có "lastmod"

Giờ đây, chúng tôi đã phát hiện ra một hạn chế trong bộ dữ liệu, ảnh hưởng đến 2.1% số URL.

Tuy nhiên, chúng tôi không thể biết chúng chiếm bao nhiêu phần trăm traffic và/hoặc doanh thu. Chúng tôi sẽ không thể phân tích các vấn đề liên quan đến ngày tháng của những URL video. Ngoài ra, chúng tôi cũng sẽ không lấy được thông tin nào về nội dung của các URL đó:

Ví dụ về các URL video

Xu hướng xuất bản

Giờ hãy kiểm tra số bài viết họ xuất bản mỗi năm và xem có năm nào số lượng xuất bản cao hơn hoặc thấp hơn không.

Đoạn code sau lấy mẫu lại DataFrame theo "A" (hằng năm) và đếm số hàng của từng năm. Về cơ bản, đây là một pivot table nếu bạn quen dùng bảng tính hơn.

Số bài viết mỗi năm

Biểu đồ cột số bài viết mỗi năm

Có thể thấy số bài viết tăng mạnh từ năm 2010 (3,514) lên năm 2011 (12k), rồi từ năm 2011 lên năm 2012 (46k).

Khả năng một website tăng gần gấp bốn lần hoạt động xuất bản, rồi lặp lại điều đó trong hai năm liên tiếp, là rất thấp. Có thể họ đã thực hiện một số thương vụ mua lại, hợp tác nội dung, hoặc bộ dữ liệu có vấn đề.

Xu hướng theo tháng

Khi xem xét các tác giả ở phần sau, chúng ta sẽ tìm thấy một lời giải thích khả dĩ cho mức tăng đột ngột này. Hãy xem chi tiết hơn xu hướng theo tháng.

Mẫu số bài viết mỗi tháng

Biểu đồ cột số bài viết mỗi tháng

Dữ liệu này xác nhận xu hướng ở trên và cho thấy một thay đổi còn đột ngột hơn.

Tháng 4 năm 2010, họ xuất bản 1,249 bài viết, trong khi tháng trước đó chỉ xuất bản 354 bài. Tình hình tương tự cũng diễn ra vào tháng 4 năm 2011. Giờ đây, gần như chắc chắn đây không phải là mức tăng trưởng tự nhiên của hoạt động xuất bản.

Xu hướng theo tuần

Chúng ta cũng có thể xem xu hướng theo ngày trong tuần.

Số bài viết được xuất bản theo ngày trong tuần

Không có gì quá bất ngờ ở đây. Họ xuất bản số lượng bài viết khá ổn định vào các ngày trong tuần, gần gấp đôi số bài vào cuối tuần. Chẳng hạn, bạn có thể chạy phân tích này cho các giai đoạn khác nhau để xem có thay đổi nào qua các năm hoặc các tháng hay không.

Xu hướng hằng năm theo danh mục

Chúng ta cũng có thể xem xu hướng hằng năm theo danh mục để tìm những điểm nổi bật. Đoạn code sau duyệt qua tất cả danh mục và tạo biểu đồ thể hiện số bài viết mỗi năm.

Số bài viết hằng năm theo danh mục

Tôi nhận thấy hai điểm ở đây. Thứ nhất là số bài viết về "shopping" tăng từ 1,732 lên 6,845 vào năm 2019, và năm 2020 có khả năng sẽ vượt mức đó. Có vẻ cách làm này đang mang lại hiệu quả cho họ. Khi xem một số bài viết đó, bạn có thể thấy họ đang triển khai các chương trình affiliate và quảng bá một số sản phẩm.

Điểm thứ hai là biểu đồ này có thể gây hiểu nhầm. Ví dụ, Tasty được BuzzFeed mua lại tương đối gần đây, nhưng ở đây bạn có thể thấy phần nội dung của họ chỉ chiếm một tỷ lệ rất nhỏ. Tuy nhiên, nếu xem trang Facebook của họ, bạn sẽ thấy họ có gần một trăm triệu người theo dõi. Vì vậy, hãy ghi nhớ điều này, luôn hoài nghi và cố gắng xác minh thông tin từ các nguồn khác khi có thể.

URL Structure

Giờ đây, chúng ta có thể chuyển sang phân tích những thông tin có thể thu thập từ URL. Sau đây là một mẫu ngẫu nhiên:

Mẫu URL ngẫu nhiên

Mẫu chung có vẻ có dạng buzzfeed.com/{language}/{author}/{article-title}, và các bài viết tiếng Anh không có "/en/" trong URL.

Giờ hãy tạo một cột mới cho ngôn ngữ bằng cách trích xuất mẫu gồm hai chữ cái bất kỳ nằm giữa hai dấu gạch chéo. Nếu không có giá trị nào, cột sẽ được điền "en". Giờ đây, chúng ta có thể xem số bài viết theo từng ngôn ngữ (hoặc quốc gia trong một số trường hợp).

Số bài viết theo từng ngôn ngữ

Biểu đồ cột số bài viết theo ngôn ngữ

Chúng ta cũng có thể xem số bài viết mỗi tháng theo từng ngôn ngữ để có cái nhìn rõ hơn.

Số bài viết mỗi tháng theo ngôn ngữ

Trích xuất dữ liệu về tác giả

Giờ hãy thực hiện quy trình tương tự với tác giả. Như trước đó, chúng ta tách cột "loc" theo dấu "/", trích xuất phần tử áp chót rồi đưa vào cột mới "author". Sau đó, chúng ta có thể đếm số bài viết theo tác giả.

Đã thêm cột mới "author"

Mã để đếm và định dạng số bài viết theo tác giả

Số bài viết theo từng tác giả (tính từ trước đến nay)

"cum. %" thể hiện tỷ lệ phần trăm tích lũy số bài viết của các tác giả tính đến hàng hiện tại.

Ví dụ, ba tác giả đầu tiên tạo ra 6.6% tổng số bài viết (dĩ nhiên, "video" không phải là tác giả nên chúng ta sẽ bỏ qua). Bạn cũng có thể thấy một số tác giả hàng đầu thực chất là các tổ chức tin tức khác chứ không phải cá nhân.

Tôi đã kiểm tra thủ công một vài bài viết của "huffpost" và gặp lỗi 404 Error. Đoạn mã sau đây lấy một mẫu URL ngẫu nhiên có tác giả là "huffpost" rồi in URL cùng với phản hồi.

Mẫu URL ngẫu nhiên và phản hồi tương ứng

Và đây là một vấn đề khác trong tập dữ liệu.

Các bài viết của những tác giả đóng góp nhiều nhất hiện không còn tồn tại. Tôi chưa kiểm tra tất cả; cách làm phù hợp là rà soát toàn bộ nửa triệu URL để định lượng vấn đề này.

Số lượng lớn bài viết từ các tổ chức tin tức lớn có thể là lời giải đáp cho câu hỏi vì sao khối lượng nội dung trên BuzzFeed đột ngột tăng.

Việc có 404 Error trong XML Sitemap chắc chắn là một vấn đề. Nhưng trong trường hợp này, thật tốt là họ không xóa chúng, vì nhờ vậy chúng ta có cái nhìn rõ hơn về lịch sử của trang web, dù nhiều URL hiện không còn tồn tại. Điều này cũng có nghĩa là có thể còn những URL không tồn tại khác đã bị xóa mà chúng ta không biết. Tôi đã nói là hãy hoài nghi chưa?

Với một website lớn như vậy, bạn có thể dự đoán sẽ phát sinh một số vấn đề, đặc biệt khi xem lại dữ liệu cách đây bảy hoặc tám năm, vì nhiều thứ đã thay đổi và nhiều thứ không còn phù hợp. Vậy hãy thực hiện bài tập tương tự cho giai đoạn gần đây hơn: năm 2019 và quý đầu tiên của năm 2020.

Code đếm số bài viết theo tác giả trong giai đoạn 2019 - quý 1 năm 2020

Các tác giả có số bài viết nhiều nhất trong giai đoạn 2019 - quý 1 năm 2020

Giờ đây, có vẻ như tất cả tác giả hàng đầu đều là cá nhân chứ không phải tổ chức.

Ta cũng có thể thấy 20 tác giả hàng đầu đã tạo ra 21.5% nội dung trong giai đoạn này. Đồng thời, ta biết được mỗi tác giả đã viết bao nhiêu bài và tỷ lệ số bài đó trên tổng số bài viết trong giai đoạn.

Nếu bạn đang thắc mắc mỗi tháng từng tác giả đã viết bao nhiêu bài:

Code tạo danh sách bài viết hàng tháng theo tác giả

Số bài viết mỗi tháng theo tác giả

Phương pháp tiếp cận từ trên xuống

Phần trên sử dụng phương pháp khám phá, khi chúng ta chưa biết gì về các tác giả. Giờ đã biết thêm đôi chút, ta có thể áp dụng phương pháp tiếp cận từ trên xuống.

Hàm sau đây nhận một số lượng tùy ý tên tác giả và vẽ biểu đồ số bài viết hàng tháng của từng người, giúp bạn so sánh hai tác giả trở lên. Hãy bắt đầu với các tổ chức tin tức hàng đầu.

Hàm vẽ và so sánh hoạt động xuất bản của các tác giả (số bài viết mỗi tháng)

Số bài viết mỗi tháng của 'fabordrabfeed', 'huffpost', 'hollywoodreporter' và 'soft'

Xét toàn bộ dữ liệu, có vẻ nhiều khả năng số bài viết tăng vọt vào tháng 4 năm 2011 là do các mối quan hệ hợp tác nội dung. Ta cũng có thể thấy mối quan hệ hợp tác với HuffingtonPost đã kết thúc vào tháng 11 năm 2013, ít nhất là theo sitemap.

Dưới đây là xu hướng của ba tác giả hàng đầu trong năm quý gần nhất.

Số bài viết mỗi tháng của 'ryanschocket2', 'daves4' và 'noradominick'

Phân tích nội dung

Giờ chúng ta đến phần cuối cùng của URL — slug chứa tiêu đề bài viết. Cho đến thời điểm này, về cơ bản, chúng ta đã tạo metadata bằng cách phân loại nội dung theo ngày, danh mục, ngôn ngữ và tác giả.

Bạn cũng có thể trích xuất slug vào một cột riêng bằng cách áp dụng phương pháp tương tự. Tôi cũng thay dấu gạch ngang bằng dấu cách để dễ tách và phân tích hơn.

Đã thêm cột mới "slugs"

Để xem các slug, tôi tạo một tập con chỉ gồm các bài viết bằng tiếng Anh.

Mẫu ngẫu nhiên gồm các slug bài viết

Hàm 'word_frequency'

Cách đơn giản nhất là đếm số từ trong slug. Hàm word_frequency giúp chúng ta thực hiện việc đó.

Lưu ý rằng hàm này mặc định loại bỏ stopword; bạn có thể khám phá danh sách stopword này. Trong nhiều trường hợp, bạn có thể muốn chỉnh sửa danh sách, vì một từ có thể là stopword trong ngữ cảnh này nhưng không phải trong ngữ cảnh khác.

Các từ được sử dụng thường xuyên nhất trong tiêu đề bài viết

Nếu một từ không truyền tải được nhiều thông tin, phrase_len chúng ta có thể đặt giá trị là 2 để đếm các cụm từ gồm hai từ (còn gọi là token).

Các cụm từ gồm hai từ được dùng thường xuyên nhất

Các chủ đề cần phân tích

Tương tự như cách so sánh các tác giả, chúng ta có thể áp dụng phương pháp này bằng cách tạo một hàm tương tự cho các từ, dùng làm chủ đề cần phân tích.

Hàm so sánh sự xuất hiện của các từ được chọn theo thời gian

Đây là ba tên người nổi tiếng xuất hiện thường xuyên nhất, và "quiz" cũng có vẻ phổ biến, nên tôi đã so sánh chúng với nhau.

Số bài viết mỗi tháng về 'kim kardashian', 'miley cyrus', 'justin bieber' và 'quiz'

Dữ liệu này cho thấy nội dung mà HuffingtonPost và các trang khác xuất bản có lẽ chủ yếu xoay quanh người nổi tiếng. Dữ liệu cũng cho thấy các bài quiz phổ biến đến mức nào và họ tập trung rất nhiều vào chủ đề này.

Điều này đặt ra câu hỏi các bài quiz đó nói về điều gì. Để tìm hiểu, chúng ta có thể lấy một tập con gồm các slug có chứa từ "quiz", rồi chỉ đếm các từ trong những slug đó. Nhờ vậy, chúng ta có thể xác định những chủ đề họ sử dụng cho các bài quiz.

Các từ thường xuất hiện nhất cùng với "quiz"

Và giờ bạn có thể bắt đầu phân tích!

Tóm tắt

Giờ đây, chúng ta đã có cái nhìn tổng quan khá rõ về quy mô và cấu trúc của tập dữ liệu, đồng thời phát hiện một số vấn đề trong dữ liệu. Để sắp xếp dữ liệu tốt hơn, chúng ta đã tạo một vài cột nhằm dễ dàng tổng hợp theo ngôn ngữ, danh mục, tác giả, ngày tháng và cuối cùng là tiêu đề bài viết.

Rõ ràng, chỉ dựa vào sitemap thì bạn không thể có được bức tranh toàn cảnh về website, nhưng sitemap giúp nhanh chóng thu thập nhiều thông tin về hoạt động xuất bản và nội dung, như đã thấy ở trên. Cách chúng ta xử lý "lastmod" khá phổ biến (nhiều trang cũng cung cấp thời điểm xuất bản chứ không chỉ ngày tháng), nhưng URL thì khác nhau ở mỗi trang web.

Sau khi chuẩn bị và làm quen với một số vấn đề tiềm ẩn có thể gặp phải, giờ đây bạn có thể bắt đầu phân tích nội dung một cách bài bản. Một số hướng bạn có thể khám phá: mô hình hóa chủ đề, đồng xuất hiện của từ, trích xuất entity, phân cụm tài liệu, và thực hiện các phân tích này trong những khoảng thời gian khác nhau cũng như theo bất kỳ thông số nào khác mà chúng ta đã tạo.

Nguồn tham khảo

https://www.semrush.com/blog/content-analysis-xml-sitemaps-python/ ↗

Đưa góc nhìn thành kế hoạch.

Chia sẻ website và mục tiêu để LionTech tư vấn giải pháp phù hợp.

Đăng ký tư vấn ↗
THÊM MỘT GÓC NHÌN CHO THƯƠNG HIỆU

Để lại website và email để LionTech tiếp nhận yêu cầu báo cáo hiện diện AIO.

Bằng việc gửi, bạn đồng ý để LionTech liên hệ qua email về yêu cầu báo cáo.