Википедия — это открытая энциклопедия, созданная в 2001 году Джимми Уэйлсом и Ларри Сэнгером. Она наполняется сообществом энтузиастов и переведена на сотни разных языков мира (360+). Со временем энциклопедия дополнилась массой вспомогательных проектов, таких как Викисловарь, Викисклад, Викицитатник, Викитека и пр. Эта экосистема теперь объединяется под крылом Wikimedia Foundation.
Так как проекты Викимедиа содержат более 300 млн страниц с предметной информацией, это делает их самой полной базой данных, которую можно использовать для разных задач: обучения ИИ, создания справочных разделов, уточнения переводов и значений слов, подбора изображений/иконок/другого контента и т.п.
Этот материал о том, как можно парсить Википедию: есть ли у неё API, где и какие готовые библиотеки можно найти, что лучше — прямой парсинг или API, в каких ситуациях.
Да, у Википедии есть API, но стоит помнить, что это не результат микросервисной архитектуры. Это стало возможным благодаря открытому движку — MediaWiki, написанному на PHP. Это как WordPress, но только рассчитанный не на блоги, а на сайты онлайн-энциклопедий. И в нём уже «зашиты» нужные программные интерфейсы.
В частности, на текущий момент Вики API доступен в трёх форматах:
Для многих типовых задач уже реализованы:
API Википедии позволяют получать структурированные данные напрямую, без необходимости скачивать HTML-страницу и анализировать её синтаксис через BeautifulSoup или аналогичные библиотеки. Это быстрее, надёжнее и проще.
Что конкретно можно получить «из коробки» через MediaWiki Action API (/w/api.php):
Всё перечисленное выше возвращается в JSON-формате или в виде HTML/чистого текста. Вам не нужно самостоятельно искать нужные теги или чистить текст от служебных элементов. API Википедии уже делает всю эту работу за вас. Автоматическая обработка данных Wiki становится проще и быстрее.
Покажем пару примеров прямых HTTP-запросов для получения нужных данных. Примерно так можно организовать веб-парсинг Wikipedia без сложных скриптов и библиотек:
GET https://ru.wikipedia.org/w/api.php?action=parse&format=json&formatversion=2&page=Python_(язык_программирования)&prop=text&disableeditsection=1
Этот запрос вернёт всё содержимое статьи без разметки, шаблонов и служебных элементов внутри JSON. Настройка осуществляется с помощью параметров: format, formatversion, prop и disableeditsection. Искомая страница передаётся в параметре page.
GET https://ru.wikipedia.org/w/api.php?action=query&format=json&formatversion=2&list=search&srsearch=язык программирования Python&srlimit=10&srwhat=text
Этот запрос вернёт список статей с заголовками, сниппетами (фрагментами текста) и номерами результатов.
GET https://ru.wikipedia.org/w/api.php?action=opensearch&format=json&formatversion=2&search=Питон&limit=10&namespace=0
Возвращает классический формат OpenSearch — массив в формате: [query, [titles], [descriptions], [urls]].
Википедия очень строго относится к автоматическим запросам. Если не соблюдать правила, ваш IP могут временно или постоянно заблокировать.
На что обратить внимание:
Пример правильного User-Agent:
headers = {"User-Agent": "МойПарсерВикипедии/1.2 (https://example.com/myproject; contact@example.com)"}
Все требования и рекомендации по использованию ботов автоматически вытекают из политики Wikimedia.
Как можно было заметить, официальный API Википедии не подходит для масштабного парсинга — нужно ждать по 5–10 секунд между запросами, да и количество потоков наращивать нельзя. Это уровень pet-проектов, не более.
Чтобы обойти эти ограничения, можно пойти разными путями:
Когда ручной парсинг действительно имеет смысл:
Парсите Google, Bing и другие поисковики — быстро, стабильно и удобно.
Этот скрипт парсинга Wikipedia принимает поисковый запрос (термин), находит наиболее релевантную страницу через поиск Wikipedia, извлекает первый абзац (определение) и сохраняет результат в DataFrame.
import requests
from bs4 import BeautifulSoup
import pandas as pd
def get_wikipedia_intro(query):
# 1. Формируем URL поиска
search_url = "https://en.wikipedia.org/w/index.php"
params = {
"search": query
}
response = requests.get(search_url, params=params)
soup = BeautifulSoup(response.text, "html.parser")
# 2. Пытаемся найти первую ссылку на статью
result = soup.select_one(".mw-search-result-heading a")
if result:
article_url = "https://en.wikipedia.org" + result.get("href")
else:
# Если сразу открылась статья (редирект)
article_url = response.url
# 3. Загружаем страницу статьи
article_response = requests.get(article_url)
article_soup = BeautifulSoup(article_response.text, "html.parser")
# 4. Ищем первый абзац
paragraphs = article_soup.select("p")
intro_text = None
for p in paragraphs:
text = p.get_text(strip=True)
if text:
intro_text = text
break
return {
"query": query,
"url": article_url,
"intro": intro_text
}
if __name__ == "__main__":
query = input("Введите термин: ")
data = get_wikipedia_intro(query)
df = pd.DataFrame([data])
print(df)
# при необходимости фрейм можно сохранить
df.to_csv("wikipedia_intro.csv", index=False)
Конечно, писать парсер с нуля всегда сложнее. Википедия поощряет открытый код и даже рекламирует на своих страницах массу готовых библиотек и инструментов автоматизации. Существует даже специальный каталог инструментов от сообщества — Toolhub.
Не забудьте установить недостающие библиотеки: pip install Wikipedia-API pandas.
import requests
import wikipediaapi
import pandas as pd
def create_wiki_client(lang="en"):
"""
Инициализация клиента Wikipedia API
"""
return wikipediaapi.Wikipedia(
language=lang,
extract_format=wikipediaapi.ExtractFormat.WIKI,
user_agent="my-wiki-parser/1.0 (example@mail.com)" # Обязательно заменить на свои данные!!!!
)
def search_wikipedia(query, lang="en"):
"""
Поиск релевантной статьи через API Wikipedia
"""
url = f"https://{lang}.wikipedia.org/w/api.php"
params = {
"action": "query",
"list": "search",
"srsearch": query,
"format": "json"
}
try:
response = requests.get(url, params=params, timeout=10)
response.raise_for_status()
data = response.json()
results = data.get("query", {}).get("search", [])
if results:
return results[0]["title"]
except Exception as e:
print(f"[Search error]: {e}")
return None
def get_wikipedia_intro(query, wiki, lang="en"):
"""
Основная функция:
- ищет статью
- получает страницу
- извлекает первый абзац
"""
title = search_wikipedia(query, lang)
if not title:
return {
"query": query,
"title": None,
"url": None,
"intro": None,
"status": "not_found"
}
page = wiki.page(title)
if not page.exists():
return {
"query": query,
"title": title,
"url": None,
"intro": None,
"status": "page_not_exists"
}
intro = page.summary.split('\n')[0]
return {
"query": query,
"title": page.title,
"url": page.fullurl,
"intro": intro,
"status": "ok"
}
if __name__ == "__main__":
query = input("Enter the term: ").strip()
# можно менять язык: en / ru / de
lang = "en"
# 1. создаём клиент
wiki = create_wiki_client(lang)
# 2. получаем данные
result = get_wikipedia_intro(query, wiki, lang)
# 3. вывод
df = pd.DataFrame([result])
print(df)
# 4. сохранение
df.to_csv("wikipedia_result.csv", index=False)
В отличие от прямого парсинга HTML, здесь используется официальный API, что делает код стабильнее и проще.
Сначала расскажем о плюсах и минусах каждого из подходов.
Официальный API Википедии обеспечивает максимальную стабильность и предсказуемость парсера, вы можете распланировать нагрузку и запустить практически любые задачи с минимальным написанием кода. Данные можно собирать сразу в нужном формате — без дополнительной обработки. А если у вас активна корпоративная подписка на Wikimedia Enterprise API, то и о лимитах можно не переживать. Когда вы придерживаетесь рекомендаций сервиса, риск блокировок будет минимальным. Возможности API Wikipedia закрывают 90% всех возможных задач. Если вам не нужно изменять содержимое страниц энциклопедии или размещать новый контент, то API вполне сможет работать без авторизации.
Прямой парсинг Википедии сопряжён с рядом рисков: при высокой скорости запросов можно получить перманентный или постоянный бан по IP-адресу, редко, но вёрстка страниц может изменяться, что автоматически приводит к необходимости частичной переделки парсера. Сам парсер нужно написать и поддерживать в актуальном состоянии, следить за его работой на своём оборудовании. Однако, если задействовать систему прокси-серверов, вы легко сможете обойти потенциальные баны и ограничения по числу обращений к серверам экосистемы Wikimedia. Плюс можно собирать абсолютно любые данные, в том числе те, которые невозможно получить по API.
Так что выбрать?
Если у вас pet-проект и нужно собрать небольшой объём информации по определённой тематике, то гораздо логичнее выбрать официальный API Википедии. Для взаимодействия с энциклопедией и хранилищами свободного медиаконтента имеются готовые библиотеки и подробная документация. Создание парсера займёт минимум времени и сил.
Но если вам нужно собрать большие объёмы данных за короткий промежуток времени или со страниц нужно достать особый (нестандартный) контент, то придётся писать собственный парсер. Он не сможет стабильно работать без качественных прокси с ротацией.
Википедия действительно способствует открытому распространению информации. Все сервисы экосистемы Wikimedia имеют официальные API-интерфейсы, причём не один, а сразу несколько — для разных задач и целей. Чтобы быстро и без проблем собрать небольшой объём данных, а также получить информацию об обновлениях, Википедия предлагает массу готовых инструментов и библиотек. Плюс есть масса технических решений от сторонних разработчиков.
Однако, если говорить о масштабном парсинге, API Википедии может не подойти, так как интерфейс имеет существенные лимиты на скорость обработки запросов и подходит далеко не для всех задач. По этой причине может потребоваться создание собственного парсера, игнорирующего API.
Ни один масштабный парсер не сможет работать без качественных прокси. Froxy — это огромный пул резидентных, мобильных и серверных прокси с автоматической ротацией. С ними вы можете не бояться блокировок и параллельно запускать обработку сотен потоков сбора данных.