CoderCastrov logo
CoderCastrov
Википедия

Парсинг страницы просмотров Википедии для создания обзора 2020 года

Парсинг страницы просмотров Википедии для создания обзора 2020 года
просмотров
2 мин чтение
#Википедия

Оглядываясь наиболее популярные статьи Википедии

Люди часто обращаются к Википедии, чтобы осмыслить текущие события - возможно, чтобы получить краткое описание последнего выпуска 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-я поправка" будут иметь всплеск, поскольку люди пытаются усвоить новостной цикл. Аналогично, когда умирает известный человек, многие обращаются к Википедии, чтобы прочитать его биографию.

Наслаждайтесь просмотром обзора(ов) ниже!