Как получить контент Википедии, используя API Википедии?

Я хочу получить первый абзац статьи в Википедии.

Что такое запрос API для этого?

12 ответов

Решение

Смотрите этот раздел в документации по MediaWiki.

Это ключевые параметры.

prop=revisions&rvprop=content&rvsection=0

rvsection = 0 указывает, что нужно возвращать только ведущую секцию.

Смотрите этот пример.

http://en.wikipedia.org/w/api.php?action=query&prop=revisions&rvprop=content&rvsection=0&titles=pizza

Чтобы получить HTML, вы можете использовать аналогично: action = parse http://en.wikipedia.org/w/api.php?action=parse§ion=0&prop=text&page=pizza

Обратите внимание, что вам придется удалить любые шаблоны или информационные блоки.

См. Есть ли чистый Википедия API только для получения краткого содержания? для других предложенных решений. Вот тот, который я предложил:

На самом деле есть очень хорошая опора, называемая выдержками, которая может использоваться с запросами, разработанными специально для этой цели. Выдержки позволяют получить выдержки из статьи (усеченный текст статьи). Существует параметр exintro, который можно использовать для получения текста в нулевом разделе (без дополнительных ресурсов, таких как изображения или информационные поля). Вы также можете получить извлечения с более высокой степенью детализации, например, с помощью определенного количества символов (exchars) или определенного количества предложений (exsences)

Вот пример запроса http://en.wikipedia.org/w/api.php?action=query&prop=extracts&format=json&exintro=&titles=Stack%20Overflow и песочница API http://en.wikipedia.org/wiki/ Специально:ApiSandbox#action=query&prop=extracts&format=json&exintro=&title = Stack% 20Overflow, чтобы больше экспериментировать с этим запросом.

Обратите внимание: если вам нужен первый абзац, вам все равно нужно получить первый тег. Однако в этом вызове API нет дополнительных ресурсов, таких как изображения для анализа. Если вас устраивает это вступительное резюме, вы можете получить текст, запустив функцию, такую ​​как php's strip_tag, которая удаляет HTML-теги.

Я делаю это так:

https://en.wikipedia.org/w/api.php?action=opensearch&search=bee&limit=1&format=json

Ответ, который вы получите, представляет собой массив с данными, которые легко анализировать:

[
  "bee",
  [
    "Bee"
  ],
  [
    "Bees are flying insects closely related to wasps and ants, known for their role in pollination and, in the case of the best-known bee species, the European honey bee, for producing honey and beeswax."
  ],
  [
    "https://en.wikipedia.org/wiki/Bee"
  ]
]

Чтобы получить только первый абзац limit=1 это то, что вам нужно.

Чтобы ПОЛУЧИТЬ первый абзац статьи:

https://en.wikipedia.org/w/api.php?action=query&titles=Belgrade&prop=extracts&format=json&exintro=1

Я создал короткие документы API Википедии для своих нужд. Существуют рабочие примеры того, как получить статьи, изображения и т. Д.

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

<script>    
    function dowiki(place) {
        var URL = 'https://en.wikipedia.org/w/api.php?format=json&action=query&prop=extracts&exintro=&explaintext=';

        URL += "&titles=" + place;
        URL += "&rvprop=content";
        URL += "&callback=?";
        $.getJSON(URL, function (data) {
            var obj = data.query.pages;
            var ob = Object.keys(obj)[0];
            console.log(obj[ob]["extract"]);
            try{
                document.getElementById('Label11').textContent = obj[ob]["extract"];
            }
            catch (err) {
                document.getElementById('Label11').textContent = err.message;
            }

        });
    }
</script>

Вы можете ознакомиться со статьей в Википедии, обратившись к таким страницам, как https://en.wikipedia.org/w/api.php?format=json&action=query&prop=extracts&exintro=&explaintext=&titles=java. Вам просто нужно проанализировать файл json, и в результате вы получите простой текст, который был очищен, включая удаление ссылок и ссылок.

Вы можете загрузить базу данных Wikipedia напрямую и проанализировать все страницы в XML с помощью Wiki Parser, который является автономным приложением. Первый абзац является отдельным узлом в результирующем XML.

Кроме того, вы можете извлечь первый абзац из его текстового вывода.

Вы можете использовать JQuery для этого. Сначала создайте URL с соответствующими параметрами. Проверьте эту ссылку, чтобы понять, что означают параметры. Тогда используйте $.ajax() метод для получения статей. Обратите внимание, что в Википедии запрещен перекрестный запрос. Вот почему мы используем dataType : jsonp в запросе.

var wikiURL = "https://en.wikipedia.org/w/api.php";
wikiURL += '?' + $.param({
    'action' : 'opensearch',
    'search' : 'your_search_term',
    'prop'  : 'revisions',
    'rvprop' : 'content',
    'format' : 'json',
    'limit' : 10
});

 $.ajax( {
    url: wikiURL,
    dataType: 'jsonp',
    success: function(data) {
       console.log(data);
    }
} );

Вы можете использовать extract_html поле итоговой конечной точки REST для этого: например, https://en.wikipedia.org/api/rest_v1/page/summary/Cat.

Примечание. Это делается для того, чтобы немного упростить содержание, удалив большинство произношений, в некоторых случаях в основном в скобках.

$keyword = "Batman"; //Term you want to search

$url = 'http://en.wikipedia.org/w/api.php?action=parse&page='.$keyword.'&format=json&prop=text&section=0';
$ch = curl_init($url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_USERAGENT, 'Infeeds Sniper');
$c = curl_exec($ch);
$json = json_decode($c);
if($json !='' && isset($json->{'parse'})){
   $title = $json->{'parse'}->{'title'};
   $content = $json->{'parse'}->{'text'}->{'*'};
   $pattern = '#<p>(.*)</p>#Us';
   if(preg_match($pattern, $content, $matches)){
      if($matches[1]!=''){
         $con = preg_replace_callback("/\[[^)]+\]/", function($m){return '';}, $matches[1]);
         echo '<h2>'.$title.'</h2>'.strip_tags($con).'</p><src>Source: <a href="https://en.wikipedia.org/wiki/'.$keyword.'" target="_blank">Wikipedia</a></src>';
      }
   }
}

Вики Резюме Scrapper W / PHP

Суть Wiki Scrapper, чтобы получить сводку из Wikipedia или DB Pedia API с PHP. Надеюсь, поможет.

Вот программа, которая сбрасывает французский и английский викисловарь и википедию:

      import sys
import asyncio
import urllib.parse
from uuid import uuid4

import httpx
import found
from found import nstore
from found import bstore
from loguru import logger as log

try:
    import ujson as json
except ImportError:
    import json


# XXX: https://github.com/Delgan/loguru
log.debug("That's it, beautiful and simple logging!")


async def get(http, url, params=None):
    response = await http.get(url, params=params)
    if response.status_code == 200:
        return response.content

    log.error("http get failed with url and reponse: {} {}", url, response)
    return None



def make_timestamper():
    import time
    start_monotonic = time.monotonic()
    start = time.time()
    loop = asyncio.get_event_loop()

    def timestamp():
        # Wanna be faster than datetime.now().timestamp()
        # approximation of current epoch time.
        out = start + loop.time() - start_monotonic
        out = int(out)
        return out

    return timestamp


async def wikimedia_titles(http, wiki="https://en.wikipedia.org/"):
    log.debug('Started generating asynchronously wiki titles at {}', wiki)
    # XXX: https://www.mediawiki.org/wiki/API:Allpages#Python
    url = "{}/w/api.php".format(wiki)
    params = {
        "action": "query",
        "format": "json",
        "list": "allpages",
        "apfilterredir": "nonredirects",
        "apfrom": "",
    }

    while True:
        content = await get(http, url, params=params)
        if content is None:
            continue
        content = json.loads(content)

        for page in content["query"]["allpages"]:
            yield page["title"]
        try:
            apcontinue = content['continue']['apcontinue']
        except KeyError:
            return
        else:
            params["apfrom"] = apcontinue


async def wikimedia_html(http, wiki="https://en.wikipedia.org/", title="Apple"):
    # e.g. https://en.wikipedia.org/api/rest_v1/page/html/Apple
    url = "{}/api/rest_v1/page/html/{}".format(wiki, urllib.parse.quote(title))
    out = await get(http, url)
    return wiki, title, out


async def save(tx, data, blob, doc):
    uid = uuid4()
    doc['html'] = await bstore.get_or_create(tx, blob, doc['html'])

    for key, value in doc.items():
        nstore.add(tx, data, uid, key, value)

    return uid


WIKIS = (
    "https://en.wikipedia.org/",
    "https://fr.wikipedia.org/",
    "https://en.wiktionary.org/",
    "https://fr.wiktionary.org/",
)

async def chunks(iterable, size):
    # chunk async generator https://stackoverflow.com/a/22045226
    while True:
        out = list()
        for _ in range(size):
            try:
                item = await iterable.__anext__()
            except StopAsyncIteration:
                yield out
                return
            else:
                out.append(item)
        yield out


async def main():
    # logging
    log.remove()
    log.add(sys.stderr, enqueue=True)

    # singleton
    timestamper = make_timestamper()
    database = await found.open()
    data = nstore.make('data', ('sourcery-data',), 3)
    blob = bstore.make('blob', ('sourcery-blob',))

    async with httpx.AsyncClient() as http:
        for wiki in WIKIS:
            log.info('Getting started with wiki at {}', wiki)
            # Polite limit @ https://en.wikipedia.org/api/rest_v1/
            async for chunk in chunks(wikimedia_titles(http, wiki), 200):
                log.info('iterate')
                coroutines = (wikimedia_html(http, wiki, title) for title in chunk)
                items = await asyncio.gather(*coroutines, return_exceptions=True)
                for item in items:
                    if isinstance(item, Exception):
                        msg = "Failed to fetch html on `{}` with `{}`"
                        log.error(msg, wiki, item)
                        continue
                    wiki, title, html = item
                    if html is None:
                        continue
                    log.debug(
                        "Fetch `{}` at `{}` with length {}",
                        title,
                        wiki,
                        len(html)
                    )

                    doc = dict(
                        wiki=wiki,
                        title=title,
                        html=html,
                        timestamp=timestamper(),
                    )

                    await found.transactional(database, save, data, blob, doc)


if __name__ == "__main__":
    asyncio.run(main())

Другой подход к сбору данных Викимедиа - полагаться на дампы kiwix zim.

Другие вопросы по тегам