LINUX.ORG.RU

Энциклонгов тред

 , , wikidata, wikinews,


2

3

Сабж. Приглашаются всякого рода энциклонги и просто люди, которым доводилось парсить википедию и её подпроекты. Хочется очень вытянуть список из категории отсюда (просто текста достаточно без ссылок и прочего хлама) https://ru.wikinews.org/wiki/Категория:Хоккеисты_по_алфавиту да все 1004 записей и ещё из нескольких категорий в самой жирной из которых 100k записей. Собственно викиданные через запрос тут https://query.wikidata.org/ не могут выдать большие категории (таймаут). Слышал ещё про другие api википедии, но боюсь, что там тоже ограничение раньше чем 100 000 записей будет. Кто как решал подобное? Поднять всю копию вики из дампа конечно можно, но это деньги (один день аренды машинки на которой будет полноценно ворочаться википедия стоит 3-5 килорублей и я не уверен что за день я её полноценно настрою и какое-то говно не вылезет, которое ещё неделю буду ковырять в конфигах каких-то лимиты, например которые будут нужны не дефолтные или ещё много чего может быть, а чисто чтоб поиграться с питоном и не заработать на этом и рубля, а только проверить одну гипотезу для себя, как по мне дороговатое удовольствие). Бан по айпишнику к википедии тоже схлопотать не хочу. Так что пишите кто как такое делал если делал. Какие инструменты использовал. В принципе могу использовать много чего, но предпочёл бы ограничиться Python, на худой конец C# или Java. Да, регулярно тягать оттуда данные мне нет нужды, раз в год а то и реже вполне норм.

★★★★★

https://download.kiwix.org/zim/wikinews/wikinews_ru_all_nopic_2025-11.zim 4.7G.

+ libzim 9.4.0 + zimtools.

Но вот «Категория:Хоккеисты_по_алфавиту» там может и не быть.


Попробовать парсить https://dumps.wikimedia.org/ruwikinews/20251120/.

dataman ★★★★★
()
Последнее исправление: dataman (всего исправлений: 2)
Ответ на: комментарий от dataman

Угу думаю над этим. Но боюсь того что нужные мне категории могут быть сильно меньше. Я хочу, например, список всех имён видеть. И населённых пунктов. А это очень большие списки.

peregrine ★★★★★
() автор топика
Ответ на: комментарий от peregrine

Там должно быть что-то про offset или next/after, как в S3, никто не будет выдавать разом хренлион =) А без выдачи по частям сама идея выдачи данных в json или ином виде странная. Так что кажется надо просто порыть, как получать предыдущие и следующие данные найти.

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

Я выше писал про continue. Не питонист, но гпт угадал мелодию с первого раза:

import requests
import time

API_URL = "https://ru.wikinews.org/w/api.php"

def get_category_members(category, sleep=0.1, retries=5):
    members = []
    session = requests.Session()
    session.headers.update({
        "User-Agent": "CategoryExtractor/1.0 (https://example.com/contact; mymail@example.com)"
    })
    params = {
        "action": "query",
        "list": "categorymembers",
        "cmtitle": category,
        "cmlimit": "500",
        "format": "json"
    }

    while True:
        attempt = 0

        while True:
            try:
                r = session.get(API_URL, params=params, timeout=20)

                # Сервер дал ошибку? Повторяем
                if r.status_code != 200:
                    attempt += 1
                    if attempt >= retries:
                        raise RuntimeError(f"HTTP {r.status_code}, попытки исчерпаны")
                    time.sleep(1)
                    continue

                # Пытаемся разобрать JSON
                try:
                    data = r.json()
                    break  # успех
                except ValueError:
                    # API вернул HTML (ошибка/капча/лимит) → повторяем
                    attempt += 1
                    if attempt >= retries:
                        raise RuntimeError(
                            "Сервер вернул не JSON, возможно капча или временная ошибка Wikimedia"
                        )
                    time.sleep(1)

            except requests.exceptions.RequestException:
                attempt += 1
                if attempt >= retries:
                    raise RuntimeError("Проблема с сетью, попытки исчерпаны")
                time.sleep(1)

        # Обрабатываем данные
        batch = [m["title"] for m in data["query"]["categorymembers"]]
        members.extend(batch)

        # Проверка на продолжение
        if "continue" not in data:
            break

        params["cmcontinue"] = data["continue"]["cmcontinue"]

        time.sleep(sleep)

    return members


category = "Категория:Хоккеисты_по_алфавиту"
titles = get_category_members(category)
print(len(titles))
print("\n".join(titles))

Я бы 500 запросов в час не превышал с одного ip, но не уверен, что обязательно.

anonymous
()
Ответ на: комментарий от anonymous
Выбрать все элементы таблицы (ячейки, строки) в HTML можно с 
помощью CSS или JavaScript. Выбор зависит от задачи: нужно 
выбрать все элементы таблицы для стиля или получить данные из 
таблицы. 

С помощью CSS
Универсальный селектор (*) — выбирает все элементы таблицы. 
Например, правило CSS: * { property: value; }. 

Селектор класса — выбирает элементы с заданным классом. Чтобы 
выбрать элементы с классом, нужно написать символ точки (.), за 
которым следует имя класса. Например: .center { property: value; 
}. 

Селекторы псевдоклассов для позиции — например, :first-child — 
выбирает первый элемент, который будет первым дочерним элементом 
внутри указанного родительского контейнера. 

С помощью JavaScript

Метод querySelectorAll — выбирает все HTML-элементы, подходящие 
под указанный CSS-селектор. Позволяет искать элементы как по всей 
странице, так и внутри определённого элемента. Например: const 
cells = document.querySelectorAll("#demo td") — выбирает все 
элементы таблицы с id="demo".

Метод getElementsByClassName — позволяет найти все элементы с 
заданным классом или классами. В первом случае его нужно вызывать 
как метод объекта document, во втором — как метод 
соответствующего HTML-элемента. Например: const elsControl = 
document.getElementsByClassName('control') — находит элементы с 
классом control в документе.

Perl позволяет весьма просто работать с WWW.

https://intuit.ru/studies/courses/2248/19/lecture/623?page=2&ysclid=mibs7nh37c848607579 Взаимодействие с web-сервером

https://zetcode.com/perl/lwp/ Perl LWP programming

anonymous
()

Хочется очень вытянуть список из категории отсюда (просто текста достаточно без ссылок и прочего хлама) https://ru.wikinews.org/wiki/Категория:Хоккеисты_по_алфавиту да все 1004 записей и ещё из нескольких категорий в самой жирной из которых 100k записей.

Там же есть предыдущая следующая страница. В чем же проблема, я не понял.

Psilocybe ★★★★★
()
Ответ на: комментарий от Psilocybe

Проблема в том, что обычно за кучу запросов в секунду с одного айпишника похожих на автоматические нормальные ресурсы дают бан по айпишнику, особенно когда есть API, которое меньше грузит сервер чем странички, которые ещё и формировать надо из того же JSON-а. Вот я и хочу узнать как у вики с этим.

peregrine ★★★★★
() автор топика
Последнее исправление: peregrine (всего исправлений: 1)

Поднять всю копию вики из дампа конечно можно, но это деньги (один день аренды машинки на которой будет полноценно ворочаться википедия стоит 3-5 килорублей и я не уверен что за день я её полноценно настрою и какое-то говно не вылезет, которое ещё неделю буду ковырять в конфигах каких-то лимиты, например которые будут нужны не дефолтные или ещё много чего может быть, а чисто чтоб поиграться с питоном и не заработать на этом и рубля, а только проверить одну гипотезу для себя, как по мне дороговатое удовольствие)

В смысле? Локалхост стал платным? Судя по https://meta.wikimedia.org/wiki/Data_dump_torrents дампы не такие уж и большие.

manntes-live ★★★
()
Ответ на: комментарий от manntes-live

Не, чтоб викидата ворочалась и по дампу искала полноценному (он около терабайта) нужна машинка от 128 гигов оперативки и кучей ресурсов процессорных. Покрути у яндекса такую машинку самую дешевую от 128 оперативки и посмотри сколько день аренды стоит. Хотя если у тебя 128 оперативки машинка локальная, то да, условно бесплатно. У гугла (сейчас из РФ толком не оплатишь ещё и не поюзаешь без 3 букв) оплата почасовая, отклонение в пересчёте на 24 часа порядка 5-20% в зависимости от локации как вверх так и вниз. Но тоже примерно того порядка цифры. А проблема будет ещё на этапе скачивания терабайта (это медленно даже для облачной машинки и там время уйдёт пол дня только на то чтоб всё подготовить для разворачивания). Википедия не так просто кучу бабла собирает каждый год чтоб не закрыться. Они бабки лопатой не гребут, железо дорого стоит их. Сам софт там вокруг апача и хадупа, т.е. самая жирная джава.

peregrine ★★★★★
() автор топика
Последнее исправление: peregrine (всего исправлений: 5)
Ответ на: комментарий от peregrine

И ещё хотел добавить:

Покрути у яндекса такую машинку самую дешевую от 128 оперативки и посмотри сколько день аренды стоит.

Непонятно, зачем брать у дорогих типа Яндекса и Гугла под такую задачу. В хецнере 5950х с 2х2/4тб ссд и 128гб памяти стоит 100-120 евро в месяц (беру там именно их).

У всяких вдс хостеров, которыми пользуюсь - пара ядер и 96гб ОЗУ стоит меньше 10 долларов в день.

anonymous
()
Ответ на: комментарий от anonymous

А зачем мне на месяц то? Чтоб что? 10 долларов в день это тоже как бы не бесплатно, за 10 долларов можно несколько книжек купить и прочитать, поддержав хороших авторов, например. Проще уж за 250 рублей в месяц купить vps туда засунуть скрипты которые будут медленно качать без риска бана со стороны сайта который парсится.

peregrine ★★★★★
() автор топика
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от peregrine

Википедия не так просто кучу бабла собирает каждый год чтоб не закрыться

В давние годы они тратили на это процентов 10 от всех денег, если правильно помню. Как сейчас - не знаю, но думаю похоже.

anonymous
()
Ответ на: комментарий от anonymous

Ну меня банили авито (ручками отец накликал кучу страниц, когда искал редкую штуку, и фильтр сработал на неделю просто потому что он 100+ страниц выдачи пролистал за день и ничего не купил), на яндексовском погодном сервисе (там да я сам виноват, из-за ошибки в коде я их действительно чаще нужного грузил скриптом запроса погоды и за 5 минут словил бан до капчи кажется, но точно уже не помню, это было лет 17 назад, на очень тонком канале, кажется ещё мобильный модем тогда у меня был). В гугле и поисковике яндекса банили (у меня за натом тогда слишком много народу было и любой поисковый запрос капча). Так что предпочту быть душным, опыт имеется и в техподдержку писать по нему бесполезно.

peregrine ★★★★★
() автор топика
Ответ на: комментарий от peregrine

Ну ты сравнил конечно Википедию с сервисами, которые описал выше :) Тем более, ты писал что это надо делать нечасто и насколько понимаю масштабы у тебя небольшие.

Я не верю, что тебя забанит вики.

anonymous
()