#mysql #mediawiki #wiki #wikipedia #wikipedia-api
#mysql #mediawiki #Вики #википедия #википедия-api
Вопрос:
Я хотел бы получить URL-адреса всех статей (мне не нужен весь текст) внутри категории Википедии.
Например, если я хочу получить все URL-адреса статей из следующей категории:https://en.wikipedia.org/wiki/Category:History , каков наилучший способ сделать это?
Обязательно ли загружать весь дамп mysql и выполнять запросы вручную?
Ответ №1:
Если вы не возражаете против использования PHP, чтобы помочь с этим, в библиотеке addwiki / mediawiki-api есть система для рекурсивного извлечения всех страниц в данной категории. Что-то вроде следующего:
$api = new MediawikiApiMediawikiApi( 'http://en.wikipedia.org/w/api.php' );
$services = new MediawikiApiMediawikiFactory( $api );
$categoryTraverser = $services->newCategoryTraverser();
// Get the root category.
$rootCatIdent = new PageIdentifier( new Title( 'Category:History' ) );
$rootCat = $this->factory->newPageGetter()->getFromPageIdentifier( $pageIdentifier );
// Get all page URLs:
$allPages = $categoryTraverser->descend( $rootCat );
foreach ($allPages->toArray() as $page) {
echo 'https://en.wkipedia.org/wiki/'.$page->getPageIdentifier()->getTitle()->getText();
}
Ответ №2:
Используйте API Википедии.
Действие «запрос» в списке «члены категории» — это то, что вам нужно здесь. Примером запроса для перечисления страниц в категории может быть:
Обратите внимание, что:
-
По умолчанию результаты возвращаются в формате HTML, отображающем данные JSON. Это предназначено исключительно для отладки, а не для производственного использования. Передайте
format=json
параметр, чтобы получить неформатированный JSON обратно из API. (Также доступен ряд других форматов; подробнее читайте документацию.) -
Результаты этого запроса выводятся на страницы. Вы можете увеличить размер страницы, используя
cmlimit
параметр, но в конечном итоге вам может потребоваться отобразить результаты, извлекаяcmcontinue
значение из результатов и передавая его в параметре с тем же именем. -
Многие «страницы» внутри категории на самом деле являются другими категориями. Невозможно рекурсивно перечислить содержимое категории и все категории, которые она содержит, поскольку категории Википедии не являются иерархией. Некоторые категории будут содержать категории, которые содержат их, или которые содержат другие категории, которые не являются строгими подмножествами. («Категории» Википедии — это на самом деле больше тегов, чем категорий, но название достаточно старое, и сейчас его невозможно изменить.)
Комментарии:
1. Я не хочу использовать API, потому что я тоже хочу получать страницы подкатегорий (рекурсивно с глубиной 8 или более).
2. Как я уже объяснял, не делайте этого. Категории Википедии не являются иерархическими; в итоге вы получите намного больше статей, чем ожидали, и многие из них не будут связаны с исходной категорией. Даже если вы решите — вопреки моему совету — выполнить рекурсию, API будет самым простым способом сделать это.
3. Я понимаю, я думаю, что буду использовать petscan.wmflabs.org с глубиной <= 5, чтобы избежать статей не по теме.
4. В наши дни продолжение работает, получая пары ключ-значение в
continue
свойстве результирующего набора и добавляя их в запрос.
Ответ №3:
Не обязательно MySQL. Есть более простые способы. Для этого вы можете просто написать короткий код. Просто используйте регулярное выражение или найдите ключевое слово, например, ссылка имеет определенный шаблон, чтобы найти их :
in this case it's
"< a href="/wiki/ " or so as the starter
"</a>" to the end
Комментарии:
1. на любых языках
2. Но это было бы похоже на «сканирование», вот чего я хочу избежать.
3. Попытка имитировать веб-поисковик почти всегда будет наихудшим подходом. API / дампы / etc предоставляются именно для того, чтобы вам не пришлось проходить через это.