Парсинг страницы просмотров Википедии для создания обзора 2020 года
Table Of Content
Оглядываясь наиболее популярные статьи Википедии
Люди часто обращаются к Википедии, чтобы осмыслить текущие события - возможно, чтобы получить краткое описание последнего выпуска Netflix или прочитать о достижениях недавно умершей знаменитости.
У меня возникла идея использовать данные о просмотрах страниц Википедии для создания своего рода "обзора 2020 года" - анимированной временной шкалы текущих событий и трендов на протяжении года 2020. Вот как я это сделал.
Код для этого проекта можно найти здесь.
Сначала я определил функцию "get_traffic", чтобы получить данные о просмотрах страницы для заданного дня:
TOP_API_URL = 'https://wikimedia.org/api/rest_v1/metrics/pageviews/'\ 'top/**{lang}**.**{project}**/all-access/**{year}**/**{month}**/**{day}**' **def** get_traffic(year, month, day):
TOP_API_URL.format(lang='en',project='wikipedia', year=year, month=month,day=day)resp = urllib2.urlopen(url)
resp_bytes = resp.read()
data = json.loads(resp_bytes)
articles = data['items'][0]['articles']
**return** articles
Вызов get_traffic('2020', '02', '21'), например, выведет JSON-объект с 1000 наиболее просматриваемыми статьями Википедии в этот день. Объект содержит название статьи, количество просмотров и ее "ранг" за этот день по количеству просмотров.
Я также создал функцию is_article для проверки того, что каждая статья действительно является статьей, прежде чем добавлять ее во фрейм данных.
**def** is_article(title, wiki_info):
skip = ['-', '404.php', 'XHamster'] + [wiki_info['mainpage']]
prefixes = PREFIXES + wiki_info['namespaces']
**if** title **in** skip:
**return** **False**
**if** title == "Media":
**return** **False**
**if** title == "Wikipedia":
**return** **False**
**if** title == "United_States_Senate":
**return** **False**
**for** prefix **in** prefixes:
**if** title.startswith(prefix + ':'):
**return** **False**
**return** **True**
Чтобы создать обзор, я вызывал функцию get_traffic для каждого дня в 2020 году и объединял результаты во фрейм данных. В этом фрейме данных я сохранял только 25 наиболее просматриваемых статей, а не весь вывод get_traffic.
date1 = '2020-01-01'
date2 = '2021-01-07'
dates = pd.date_range(date1, date2).tolist()top_array = []
**for** date **in** dates:
year=date.strftime('%Y')
month = date.strftime('%m')
day = date.strftime('**%d**')
print(date) raw_traffic = get_traffic(year, month, day)
articles = [a **for** a **in** raw_traffic **if** is_article(a['article'], wiki_info)]
top_array.append(articles[:25])views_array = []
articles_array = []
ranks_array = []
**for** i **in** range(len(top_array)):
date = dates[i]
array = top_array[i]
**for** j **in** range(25):
row = array[j]
dates_array.append(date)
articles_array.append(row['article'].replace('_', ' '))
_# print(articles_array)_
views_array.append(row['views'])
ranks_array.append(row['rank'])dict = {'date': dates_array, 'article': articles_array, 'views': views_array, 'rank': ranks_array}
df = pd.DataFrame(data=dict)
После получения набора данных я следовал учебнику Майка Бостока, чтобы создать гонку столбчатых диаграмм в d3.js с использованием этих данных. Я разделил обзор 2020 года на 2 части, чтобы избежать слишком длительного видео.
Если вы посмотрите оба видео, вы заметите некоторые закономерности - люди кажутся наиболее заинтересованными в политике, биографиях знаменитостей, новых развлекательных выпусках и Библии. Статьи вроде "Касем Сулеймани" или "25-я поправка" будут иметь всплеск, поскольку люди пытаются усвоить новостной цикл. Аналогично, когда умирает известный человек, многие обращаются к Википедии, чтобы прочитать его биографию.
Наслаждайтесь просмотром обзора(ов) ниже!