Cách trích xuất dữ liệu WordPress Stats bằng Python

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 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)

Ở đâ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ả.

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:

Photo by Isaac Smith on Unsplash

2 thoughts on “Cách trích xuất dữ liệu WordPress Stats bằng Python

Trả lời Sugus Sugus Hủy trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất /  Thay đổi )

Google photo

Bạn đang bình luận bằng tài khoản Google Đăng xuất /  Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất /  Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất /  Thay đổi )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.