Sau một thời gian hoạt động, chắc chắn các bạn muốn biết blog của mình hoạt động ra sao. Cách đơn giản nhất để xem những dữ liệu thống kê này là vào phần /wp-admin và click vào “Site Stats”. Tuy nhiên, nếu các bạn muốn download những dữ liệu đó về máy để tự mình xử lý thì làm thế nào? Bằng một số kiến thức Python và data science cơ bản, chúng ta có thể làm được điều đó.
How to extract your own wordpress.com stats using Python.
Stats cơ bản
Thực ra trang stats cơ bản của WordPress cũng khá là đẹp và đủ dùng rồi.

Ở trang này thì có thể coi được lượng views và lượng truy cập hằng ngày, hằng tuần, hằng tháng và hằng năm. Chúng ta cũng coi được truy cập từ những nước nào, những bài post nào được mở nhiều nhất.
Hãy vào Tab “Insight” để xem thêm.

Vào phần Insights thì xem được tần suất post bài, những ngày nào có lượng view nhiều, v.v..
Tuy nhiên, từ khi WordPress đổi sang Jetpack thì không thể download những dữ liệu này được nữa. Không sao, sử dụng Python thì chúng ta sẽ lấy được những thông tin đó (raw data)
Trích xuất dữ liệu bằng Python
Để chạy được chương trình này, các bạn có thể sử dụng các Text Editor phổ biến như VSC, Atom hay Jupyter Notebook.
Nếu muốn chạy online trực tiếp trên trình duyệt thì có thể xài Google Colabs.
Bước 0: Xem qua trang url tĩnh chứa dữ liệu
Truy cập: https://stats.wordpress.com/csv.php?
Các bạn sẽ thấy một cái hình như thế này:

Đây là bản hướng dẫn chúng ta làm sao để truy cập vào đường dẫn có chứa raw data và lấy nó ra.
Required parameters là thành phần bắt buộc, bao gồm api_key và blog_id hoặc blog_uri
Optional parameters là những tham số điều chỉnh để lấy được dữ liệu mong muốn. Các bạn nhìn mục table sẽ thấy những dữ liệu có thể lấy được như ‘views’, ‘postviews’, ‘search term’, ‘clicks’
Như vậy chúng ta cần lấy 2 thành phần không thể thiếu, đó là api_key và blog_uri
Bước 1: Lấy API_key
API này là API dựa trên Akismet, là dịch vụ chống spam của WordPress. Các bạn sẽ cần API key. Cái này đăng ký được free trên Akismet.
b1: Vào https://akismet.com/
b2: Đăng ký bằng email mà bạn dùng để tạo nên blog (free hoàn toàn)
b3: Đăng ký xong, bạn sẽ nhận được 1 email thông báo từ akismet, trong đó có chứa Akismet API Key (gồm 12 ký tự)
Copy lấy API_key đó vì chúng ta sẽ cần dùng nó để trích xuất dữ liệu.
Bước 2: Lấy URL của blog
Cái này thì copy từ trình duyệt là được, bỏ qua cái https://
Ví dụ blog của mình là nipponkiyoshi.com hoặc nipponkiyshi.wordpress.com
Đây chính là blog_uri của chúng ta.
Bước 3: Dùng Python để trích xuất dữ liệu
Load libraries:
import matplotlib.dates as mdates
import matplotlib.axes as ax
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import requests
Sau đó liêt kê các parameters. Code sẽ được chỉnh ở đây tuỳ vào trang blog của bạn.
#edit parameters here
api_key = 'abcxyz123456 '
blog_uri = 'somewebsite.com'
table = ['views', 'postviews', 'referrers',
'referrers_grouped', 'searchterms', 'clicks', 'videoplays']
days = -1
master_url = 'https://stats.wordpress.com/csv.php?'
Ở đây lấy ví dụ api_key của chúng ta là abcxyz123456, còn blog_uri là somewebsite.com
Tất nhiên, khi ứng dụng cho blog của mình thì phải thay abcxyz123456 ở trên bằng api của mình, blog_uri cũng vậy.
Đặt days=-1 nghĩa là bạn lấy tất cả thông tin của web từ ngày khai thiên lập địa. Tất nhiên, có thể chỉnh thành bất kỳ giá trị nào mong muốn. Ví dụ để days =7 thì bạn sẽ lấy được stats của blog trong 7 ngay
Tiếp theo, nối chúng lại với nhau, ta sẽ xây dựng được một url hoàn chỉnh.
x = 1
url = master_url + 'api_key=' + api_key + '&blog_uri=' + blog_uri + '&table=' + table[x] + '&days=' + str(days)
print(url)
https://stats.wordpress.com/csv.php?api_key=123456&blog_uri=somewebsite.com&table=postviews&days=-1
Ở đây biến x thay cho thứ tự của element trong cái table ở trên. Các bạn có thể sửa x tuỳ vào dữ liệu mình muốn lấy. Ví dụ x = 0 tương ứng với table[0] là ‘views’. Ở đây mình để x = 1 là ‘postviews’ thì trong dữ liệu hiện ra mỗi ngày có những post nào được xem và có lượng view của mỗi post. Nếu muốn coi xem những trang nào refer tới trang của bạn thì thay x = 2
Các bạn có thể paste thằng url này vào trình duyệt để xem. Do các cột đã được tự động ngăn bởi dấu phẩy, nên có thể bôi đen toàn bộ và Copy-Paste vào bất cứ TextEditor nào để lưu lại dưới file .csv.
"date","post_id","post_title","post_permalink","views"
"2021-03-05",469,"Viết thư bằng tiếng Nhật","https://nipponkiyoshi.com/2014/11/20/viet-thu/",23
"2021-03-05",0,"Home page","https://nipponkiyoshi.com/",20
"2021-03-05",644,"Tóm tắt lịch sử Nhật Bản","https://nipponkiyoshi.com/2014/12/14/tom-tat-lich-su-nhat-ban/",17
"2021-03-05",2275,"Mạc phủ Tokugawa sụp đổ. Thiên hoàng trở lại nắm quyền.","https://nipponkiyoshi.com/2019/03/06/mac-phu-tokugawa-sup-do-duy-tan-minh-tri-thanh-cong/",13
"2021-03-05",134,"Tự luyện thi JLPT N3 (P1): Sách luyện thi (có link download)","https://nipponkiyoshi.com/2014/09/27/tu-hoc-on-thi-jlpt-n3-sach-luyen-thi/",13
"2021-03-05",1199,"Tự luyện thi JLPT N2 (P1): Cấu trúc đề thi","https://nipponkiyoshi.com/2015/03/02/tu-luyen-thi-jlpt-n2-p1-cau-truc-de-thi/",10
"2021-03-05",1723,"Những từ ghép với 気","https://nipponkiyoshi.com/2015/11/10/nhung-tu-ghep-voi-%e6%b0%97/",10
"2021-03-05",1995,"Tự luyện thi JLPT N1: Sách luyện thi (Update: 2020/06/29)","https://nipponkiyoshi.com/2017/05/09/tu-luyen-thi-jlpt-n1-sach-luyen-thi-co-link-download/",7
"2021-03-05",1094,"Tiếng Nhật ""lóng""","https://nipponkiyoshi.com/2015/02/08/tieng-nhat-long/",6
Cuối cùng, chúng ta sẽ lưu dữ liệu vào trong DataFrame của thư viện Pandas và lưu lại thành một file .csv (các bạn nhớ sửa đường dẫn của file csv vào nơi muốn lưu (bỏ dấu <>). Pandas có thể đọc trực tiếp luôn từ url này vì dữ liệu đã được format đẹp đẽ dứoi dạng .csv.
data = pd.read_csv(url)
df = pd.DataFrame(data)
df['date'] = pd.to_datetime(df['date'])
df.to_csv('<path>/output.csv')
Như vậy phần trích xuất dữ liệu thô đã xong. Tiếp theo, các bạn có thể làm những hoạt động đơn giản như vẽ biểu đồ hay phân tích data này (xem ngày nào có nhiều view nhất, post nào nhiều view nhất).
Khám phá dữ liệu
Bài nào được đọc nhiều nhất
Với file df (DataFrame) ở trên, các bạn có thể dùng function groupby để nhóm các bài post theo ‘post_title’ và cộng tổng lượng views. Sau đó ta sẽ sort chúng theo thứ tự từ cao đến thấp.
#Sort by viewcounts (to see which posts have the most view counts)
by_viewcounts = df.groupby(['post_title', 'post_id','post_permalink']).agg(
{'views': 'sum'})
by_viewcounts_view = by_viewcounts.sort_values(by='views', ascending=False)
#pd.set_option('display.max_rows', 500) #uncomment to print all.
print(by_viewcounts_view)
Và đây là kết quả. Các bạn có thể uncomment dòng lệnh thứ 5 để in tất cả.
views post_title post_id post_permalink 10 Ứng dụng học Tiếng Nhật tốt nhất 1248.0 https://nipponkiyoshi.com/2015/03/20/10-ung-dung... 219957 Tự luyện thi JLPT N3 (P1): Sách luyện thi (có l... 134.0 https://nipponkiyoshi.com/2014/09/27/tu-hoc-on-t... 182891 Home page 0.0 https://nipponkiyoshi.com/ 119807 Tự luyện thi JLPT N2: Sách luyện thi (Update 20... 1555.0 https://nipponkiyoshi.com/2015/07/26/tu-luyen-th... 114065 Viết thư bằng tiếng Nhật 469.0 https://nipponkiyoshi.com/2014/11/20/viet-thu/ 113979 Tiếng Nhật trong nhà bếp 1768.0 https://nipponkiyoshi.com/2015/12/08/tieng-nhat-... 62939 Tự luyện thi JLPT N2 (P1): Cấu trúc đề thi 1199.0 https://nipponkiyoshi.com/2015/03/02/tu-luyen-th... 56164 Tiếng Nhật "lóng" 1094.0 https://nipponkiyoshi.com/2015/02/08/tieng-nhat-... 46069 Senpai, Kohai và Sensei 83.0 https://nipponkiyoshi.com/2014/09/11/senpai-koha... 41114 Tự luyện thi JLPT N1: Sách luyện thi (Update: 2... 1995.0 https://nipponkiyoshi.com/2017/05/09/tu-luyen-th... 36228
Có vẻ ứng dụng học tiếng Nhật và việc ôn thi N3 được rất nhiều người quan tâm.
Ngày nào có nhiều view nhiều nhất
Xem theo ngày (group by day then sort by views)
#Sort by date (days) to see which days have the most views
by_date = df.groupby('date').agg({'views':'sum'})
by_date_view = by_date.sort_values(by='views',ascending=False)
#pd.set_option('display.max_rows', 10000) #uncomment to print all.
print(by_date_view)
views date 2016-07-18 7430 2018-01-24 7267 2015-08-27 4554 2015-06-24 2926 2016-07-19 2594 2015-07-04 2376 2018-01-25 2285 2015-08-28 2163 2017-08-23 2054 2015-07-05 2023 2016-08-24 1948 2015-06-25 1913 . . . 2014-09-21 1 2014-09-14 1 2014-09-13 1 2014-09-12 1 2014-10-05 1 2014-10-13 1 2014-10-20 1 2014-09-07 1 2014-10-23 1 2014-11-02 1 2014-08-28 1
Các bạn có thể thấy mấy ngày đầu lập blog, mỗi ngày chỉ có mỗi 1 view thôi (phần lớn là mình tự view :p)
Ngày có view nhiều nhất là 18/07/2016, không biết hôm đó đã có chuyện gì xảy ra nhỉ.
Xem theo tháng (group by month then sort by views)
#Sort by month
by_month = df.groupby(pd.Grouper(key='date', freq='M')).agg({'views': 'sum'})
by_month_view = by_month.sort_values(by='views',ascending=False)
print(by_month_view)
views date 2016-07-31 45368 2017-08-31 36708 2018-01-31 36609 2017-07-31 36454 2016-08-31 36130 2017-09-30 36113 2016-09-30 35392 2017-05-31 35334 2017-02-28 35285 2017-06-30 35184
Xem theo năm (group by year then sort by views)
#Sort by year
by_year = df.groupby(pd.Grouper(key='date', freq='Y')).agg({'views': 'sum'})
by_year_view = by_year.sort_values(by='views',ascending=False)
print(by_year_view)
views date 2016-12-31 384867 2017-12-31 379944 2018-12-31 345057 2015-12-31 261308 2019-12-31 251444 2020-12-31 149031 2021-12-31 21113 2014-12-31 2882
Từ năm 2016 – 2018 là những năm tháng đỉnh cao của cái blog này 🙂
Vẽ biểu đồ (plotting)
Đầu tiên mình sẽ vẽ biểu đồ lượng view theo tháng
#plot by month
x = by_month.index
values = by_month['views']
widths = [20 for i in x]
colors = ['darkorange' for i in x]
# Optional
# Set the monthly locator
import datetime
import matplotlib.dates as mdates
locator = mdates.MonthLocator(interval=4) # blank for every month
# Specify the format - %b gives us Jan, Feb...
fmt = mdates.DateFormatter('%b/%y')
# Specify formatter
X = plt.gca().xaxis
X.set_major_locator(locator)
X.set_major_formatter(fmt)
#specify plot parameters
plt.xlabel('time')
plt.ylabel('views')
plt.bar(x, values, width=widths, color=colors)
plt.xticks(rotation=90)
plt.plot()

Tiếp theo thử plot theo năm xem:
import matplotlib.pyplot as plt
#convert Datetime Index to list and extract year (if not, matplot will automatically assign 2018/12/31 to 2019)
y = by_year.index
y = y.to_list()
y_date = pd.DatetimeIndex(y).year
#declare plot elements
values = by_year['views']
widths = [0.5 for i in y_date]
colors = ['darkorange' for i in y_date]
plt.xlabel('Time')
plt.ylabel('views')
#plot
plt.bar(y_date, values, width = widths, color = colors)
plt.title('nipponkiyoshi.com \n Views by year')
plt.show()

Hi vọng năm 2021, nipponkiyoshi sẽ khởi sắc trở lại 🙂
Kết
Các bạn hãy thử làm với blog của mình xem sao nhé!
Tham khảo:
How to download your WordPress.com stats in CSV, JSON, or XML format
https://developer.wordpress.com/docs/api/
Ảnh:
Pingback: Tự phân tích những gì bạn viết trên WordPress bằng Python – Nippon Kiyoshi Blog
Rất mong những bài viết mới của ad!
ThíchThích
Brilliant, bro 😮
ThíchĐã thích bởi 1 người