newspaper4k

AndyTheFactoryMIT活跃维护

从新闻网站批量抓取文章正文、标题和元数据的 Python 库,是 Newspaper3k 的维护分支,适合做新闻语料采集和数据集准备。

📰 Newspaper4k a fork of the beloved Newspaper3k. Extraction of articles, titles, and metadata from news websites.

0.9.6.1发布于 2026-11-01 20:49 UTC1,171star +1 / 7 天118fork同步于 2026-11-10 17:52 UTC

怎么上手

由 README 提炼,执行前请确认
pip install newspaper4k
python -m newspaper --url="https://edition.cnn.com/2023/11/17/success/job-seekers-use-ai/index.html" --language=en --output-format=json --output-file=article.json
硬件要求按 README 说明

README 未说明,纯 Python 库,无需 GPU

下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

newspaper3k 的活跃续作,从新闻网站抓取正文、标题与元数据

从新闻网站批量抓取文章正文、标题和元数据的 Python 库,是 Newspaper3k 的维护分支,适合做新闻语料采集和数据集准备。

核心能力

  • 沿用 newspaper3k 全部类与方法,旧 API 调用可直接迁移
  • 多线程下载文章,线程数可通过 number_threads 配置
  • 自动检测网站分类结构与新闻 URL,构建 Source 抓取整站
  • 提取正文、标题、作者、发布日期、主图与全部图片
  • 内置 NLP 生成关键词与摘要,支持 80+ 种语言

容易踩的坑

需 Python 3.10 及以上;使用 Google News 功能要额外安装 pip install newspaper4k[gnews];语言检测错误时可能提取不到正文,需显式指定 language

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

5 个版本0.9.6.1
  1. 0.9.6.1Version 0.9.6.1 - Security fix: SSRF protection for outbound requests最新正式版2026-11-01 · 2026-11-01 20:49 UTC

    Highlights

    • Security fix (CWE-918, SSRF): Article.parse() fetches images by default, and it took image URLs straight from the page (<img src>, og:image). The only validation was a URL scheme check. A page an attacker controls or influences could therefore make the server request internal addresses such as 127.0.0.1, private ranges, or cloud metadata endpoints like 169.254.169.254. Versions up to and including 0.9.6 are affected.
    • Outbound requests are now checked: every request made through do_request is rejected with PrivateHostError unless the host resolves to a public IP. Redirect targets are checked at every hop, so a public URL can't bounce to an internal host. This covers read_more_link targets, meta-refresh targets, and Source category, feed and article URLs.
    • Image fetching: image downloads, which don't go through do_request, have their own check and follow redirects by hand with a check on each hop.
    • New option allow_private_hosts (default False): set it to True to fetch private or internal hosts again.
    • NLP requires nltk >=3.10: the Punkt tokenizer in nltk 3.10 splits sentences after closing quotes, which changes the generated summaries.

    Breaking changes

    • Requests to localhost, private IP ranges, or internal hostnames now fail unless allow_private_hosts=True. This includes article URLs you pass in yourself.
    • The nlp extra now needs nltk >=3.10. Summaries can differ from earlier versions because of the sentence-splitting change.
    • nltk 3.10 rejects an nltk_data directory that is writable by another account. Point NLTK_DATA at a directory you own if you hit a LookupError for punkt_tab.

    Upgrade advice

    Anyone using newspaper4k to parse pages from untrusted or user-supplied sources should upgrade. If you must stay on an older version, set fetch_images=False to disable image fetching and validate user-supplied URLs yourself.

    Known limitations

    DNS rebinding between the host check and the connection is not prevented. For hard guarantees, also restrict outbound traffic at the network level.

    What's Changed

    • Block SSRF in image extraction, meta refresh, read_more_link and Source URL handling, with allow_private_hosts to opt out
    • Add PrivateHostError and network.is_public_url()
    • Update NLP test fixtures for nltk 3.10 Punkt and require nltk >=3.10

    Full Changelog: https://github.com/AndyTheFactory/newspaper4k/compare/0.9.6...0.9.7

  2. 0.9.6Version 0.9.6 - PyInstaller support, small fixes, more documentation, some reworks2026-07-19 · 2026-07-19 16:45 UTC
    查看更新说明
    • Added native PyInstaller support
    • Fixed article configuration isolation
    • Improved extraction and duplicate detection
    • Added lxml 6.x support
    • Expanded documentation and test coverage

    What's Changed

    Full Changelog: [0.9.5...0.9.6](https://github.com/AndyTheFactory/newspaper4k/compare/0.9.5...0.9.6)

  3. 0.9.5Version 0.9.5 - improvements Google News and honor robots.txt2026-02-28 · 2026-02-28 14:33 UTC
    查看更新说明
    • lang: Add ISO 639-3 language code support for Kurdish (ckb, kmr)
    • tests: add robots tests
    • feat: added robots.txt check with hook in do_request
    • feat: add hooks to get_html
    • parse: prioritize datePublished over dateCreated in JSON-LD extraction
    • docs: Readme improvements
    • feat: add nltk as an optional dependency for leaner deployments
    • docs: added additional documentation for GoogleNews and Cloudscraper integration
    • rework: type annotations removed deprecated types (python 3.10+)

    What's Changed

    Bugs Fixed

    New Contributors

    Full Changelog: https://github.com/AndyTheFactory/newspaper4k/compare/0.9.4...0.9.5

  4. 0.9.4.1Version 0.9.4.1 - Python 3.14 support2025-11-18 · 2025-11-18 06:08 UTC
    查看更新说明
    • feat: add support for python 3.14
    • rework: minor typing changes
    • tests: increase test coverage

    What's Changed

    New Contributors

    Full Changelog: https://github.com/AndyTheFactory/newspaper4k/compare/0.9.4...0.9.4.1

  5. 0.9.4Version 0.9.4 - Dropping python 3.8, 3.9, Switching to `uv`, improving tests2025-11-15 · 2025-11-15 21:52 UTC
    查看更新说明

    New Features

    Bumped min Python version to 3.10. Version 3.8 and 3.9 are no longer supported, but might still work.

    • misc: switch to uv from poetry
    • parse: add brotli compression
    • install: dependency versions pin
    • tests: split tests into unit, integration and e2e. Only unit tests are ran on each PR. Integration and e2e tests are ran locally when developing.
    • tests: added coverage report generation. Coverage uploaded to coveralls.io

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    Newspaper4k: Article Scraping & Curation, a continuation of the beloved newspaper3k by codelucas

    PyPI version Build status Coverage status Documentation Status

    Newspaper4k Project grew from a fork of the well known newspaper3k by codelucas which was not updated since September 2020. The initial goal of this fork was to keep the project alive and to add new features and fix bugs. As of version 0.9.3 there are many new features and improvements that make Newspaper4k a great tool for article scraping and curation. To make the migration to Newspaper4k easier, all the classes and methods from the original project were kept and the new features were added on top of them. All API calls from the original project still work as expected, such that for users familiar with newspaper3k you will feel right at home with Newspaper4k.

    At the moment of the fork, in the original project were over 400 open issues, which I have duplicated, and as of v 0.9.3 only about 180 issues still need to be verified (many are already fixed, but it's pretty cumbersome to check - hint hint ... anyone contributing?). If you have any issues or feature requests please open an issue here.

    Experimental ChatGPT helper bot for Newspaper4k:ChatGPT helper

    Python compatibility

    - Python 3.10+ minimum
    

    Quick start

    pip install newspaper4k
    

    Using the CLI

    You can start directly from the command line, using the included CLI:

    python -m newspaper --url="https://edition.cnn.com/2023/11/17/success/job-seekers-use-ai/index.html" --language=en --output-format=json --output-file=article.json
    
    

    More information about the CLI can be found in the CLI documentation.

    cli demo

    Using the Python API

    Alternatively, you can use Newspaper4k in Python:

    Processing one article / url at a time

    import newspaper
    
    article = newspaper.article('https://edition.cnn.com/2023/10/29/sport/nfl-week-8-how-to-watch-spt-intl/index.html')
    
    print(article.authors)
    # ['Hannah Brewitt']
    
    print(article.publish_date)
    # 2023-10-29 09:00:15.717000+00:00
    
    print(article.text)
    # New England Patriots head coach Bill Belichick, right, embraces Buffalo Bills head coach Sean McDermott ...
    
    print(article.top_image)
    # https://media.cnn.com/api/v1/images/stellar/prod/231015223702-06-nfl-season-gallery-1015.jpg?c=16x9&q=w_800,c_fill
    
    print(article.movies)
    # []
    
    article.nlp()
    print(article.keywords)
    # ['patrick', 'mahomes', 'history', 'nfl', 'week', 'broncos', 'denver', 'p', 'm', '00', 'pittsburgh',...]
    
    
    print(article.summary)
    # Kevin Sabitus/Getty Images Denver Broncos running back Javonte Williams evades Green Bay Packers safety Darnell Savage, bottom.
    # Kathryn Riley/Getty Images Kansas City Chiefs quarterback Patrick Mahomes calls a play during the Chiefs' 19-8 Thursday Night Football win over the Denver Broncos on October 12.
    # Paul Sancya/AP New York Jets running back Breece Hall carries the ball during a game against the Denver Broncos.
    # The Broncos have not beaten the Chiefs since 2015, and have never beaten Chiefs quarterback Patrick Mahomes.
    # Australia: NFL+, ESPN, 7Plus Brazil: NFL+, ESPN Canada: NFL+, CTV, TSN, RDS Germany: NFL+, ProSieben MAXX, DAZN Mexico: NFL+, TUDN, ESPN, Fox Sports, Sky Sports UK: NFL+, Sky Sports, ITV, Channel 5 US: NFL+, CBS, NBC, FOX, ESPN, Amazon Prime
    
    

    source demo

    Parsing and scraping whole News Sources (websites) using the Source Class

    This way you can build a Source object from a newspaper websites. This class will allow you to get all the articles and categories on the website. When you build the source, articles are not yet downloaded. The build() call will parse front page, will detect category links (if possible), get any RSS feeds published by the news site, and will create a list of article links. You need to call download_articles() to download the articles, but note that it can take a significant time.

    download_articles() will download the articles in a multithreaded fashion using ThreadPoolExecutor from the concurrent package. The number of concurrent threads can be configured in Configuration.number_threads or passed as an argument to build().

    import newspaper
    
    cnn_paper = newspaper.build('http://cnn.com', number_threads=3)
    print(cnn_paper.category_urls())
    
    # ['https://cnn.com', 'https://money.cnn.com', 'https://arabic.cnn.com',
    # 'https://cnnespanol.cnn.com', 'http://edition.cnn.com',
    # 'https://edition.cnn.com', 'https://us.cnn.com', 'https://www.cnn.com']
    
    article_urls = [article.url for article in cnn_paper.articles]
    print(article_urls[:3])
    # ['https://arabic.cnn.com/middle-east/article/2023/10/30/number-of-hostages-held-in-gaza-now-up-to-239-idf-spokesperson',
    # 'https://arabic.cnn.com/middle-east/video/2023/10/30/v146619-sotu-sullivan-hostage-negotiations',
    # 'https://arabic.cnn.com/middle-east/article/2023/10/29/norwegian-pm-israel-gaza']
    
    
    article = cnn_paper.articles[0]
    article.download()
    article.parse()
    
    print(article.title)
    # المتحدث باسم الجيش الإسرائيلي: عدد الرهائن المحتجزين في غزة يصل إلى
    
    

    Or if you want to get bulk articles from the website (have in mind that this could take a long time and could get your IP blocked by the newssite):

    import newspaper
    
    cnn_source = newspaper.build('http://cnn.com', number_threads=3)
    
    print(len(newspaper.article_urls))
    
    articles = source.download_articles()
    
    print(len(articles))
    
    print(articles[0].title)
    

    As of version 0.9.3, Newspaper4k supports Google News as a special Source object

    First, make sure you have the google extra installed, since we rely on the Gnews package to get the articles from Google News. You can install it using pip like this:

    pip install newspaper4k[gnews]
    

    Then you can use the GoogleNews class to get articles from Google News:

    from newspaper.google_news import GoogleNewsSource
    
    source = GoogleNewsSource(
        country="US",
        period="7d",
        max_results=10,
    )
    
    source.build(top_news=True)
    
    print(source.article_urls())
    # ['https://www.cnn.com/2024/03/18/politics/trump-464-million-dollar-bond/index.html', 'https://www.cnn.com/2024/03/18/politics/supreme-court-new-york-nra/index.html', ...
    source.download_articles()
    

    Multilanguage features

    Newspaper can extract and detect languages seamlessly based on the article meta tags. Additionally, you can specify the language for the website / article. If no language is specified, Newspaper will attempt to auto detect a language from the available meta data. The fallback language is English.

    Language detection is crucial for accurate article extraction. If the wrong language is detected or provided, chances are that no article text will be returned. Before parsing, check that your language is supported by our package.

    from newspaper import Article
    
    article = Article('https://www.bbc.com/zhongwen/simp/chinese-news-67084358')
    article.download()
    article.parse()
    
    print(article.title)
    # 晶片大战:台湾厂商助攻华为突破美国封锁?
    
    if article.config.use_meta_language:
      # If we use the autodetected language, this config attribute will be true
      print(article.meta_lang)
    else:
      print(article.config.language)
    
    # zh
    

    Docs

    Check out The Docs for full and detailed guides using newspaper.

    Features

    • Multi-threaded article download framework
    • Newspaper website category structure detection
    • News url identification
    • Google News integration
    • Text extraction from html
    • Top image extraction from html
    • All image extraction from html
    • Keyword building from the extracted text
    • Automatic article text summarization
    • Author extraction from text
    • Easy to use Command Line Interface (python -m newspaper....)
    • Output in various formats (json, csv, text)
    • Works in 80+ languages (English, Chinese, German, Arabic, ...) see LANGUAGES.md for the full list of supported languages.

    Evaluation

    Evaluation Results

    Using the dataset from ScrapingHub I created an evaluator script that compares the performance of newspaper against it's previous versions. This way we can see how newspaper updates improve or worsen the performance of the library.

    VersionCorpus BLEU ScoreCorpus Precision ScoreCorpus Recall ScoreCorpus F1 Score
    Newspaper3k 0.2.80.86600.91280.90710.9100
    Newspaper4k 0.9.00.92120.89920.93360.9161
    Newspaper4k 0.9.10.92240.88950.92420.9065
    Newspaper4k 0.9.20.94260.90700.90870.9078
    Newspaper4k 0.9.30.95310.95850.93390.9460
    Newspaper4k 0.9.40.95310.95850.93390.9460
    Newspaper4k 0.9.50.95310.95850.93390.9460
    Newspaper4k 0.9.60.95310.95850.93390.9460

    Precision, Recall and F1 are computed using overlap of shingles with n-grams of size 4. The corpus BLEU score is computed using the nltk's bleu_score.

    We also use our own, newly created dataset, the Newspaper Article Extraction Benchmark (NAEB) which is a collection of over 400 articles from 200 different news sources to evaluate the performance of the library.

    VersionCorpus BLEU ScoreCorpus Precision ScoreCorpus Recall ScoreCorpus F1 Score
    Newspaper3k 0.2.80.84450.87600.85560.8657
    Newspaper4k 0.9.00.83570.85470.89090.8724
    Newspaper4k 0.9.10.83730.85050.88670.8682
    Newspaper4k 0.9.20.84220.88880.92400.9061
    Newspaper4k 0.9.30.86950.91400.89210.9029
    Newspaper4k 0.9.40.86890.91400.89210.9029
    Newspaper4k 0.9.50.86890.91400.89210.9029
    Newspaper4k 0.9.60.86960.91360.88980.9015

    Requirements and dependencies

    The package has two kinds of requirements:

    • System libraries (needed for lxml and image support)
    • Python package dependencies (installed via pip or a pinned requirements.txt)

    System packages (common)

    • Pillow: libjpeg-dev, zlib1g-dev, libpng-dev (or libpng12-dev on older systems)
    • lxml: libxml2-dev, libxslt1-dev
    • Python development headers: python3-dev

    Debian / Ubuntu (install prerequisites):

        sudo apt-get install python3 python3-dev python3-pip libxml2-dev libxslt1-dev libjpeg-dev zlib1g-dev libpng-dev
    

    macOS (Homebrew):

        brew install libxml2 libxslt
        brew install libtiff libjpeg webp little-cms2
    

    Installing the package (pip)

    Basic install:

        pip install newspaper4k
    

    Optional extras

    Newspaper4k exposes several optional extras that enable additional features:

    • gnews — Google News integration (gnews package)
    • nlp — NLP helpers (e.g. nltk)
    • cloudflare — cloudscraper for Cloudflare-protected sites
    • zh, th, ja, bn, hi,np, ta - language-specific NLP support (e.g. jieba for Chinese)
    • all — a convenience extra that installs many language and helper packages

    Examples:

        pip install newspaper4k[gnews]
        pip install "newspaper4k[gnews,nlp]"
        pip install newspaper4k[all]
    

    Use whichever extras you need; extras can be combined as shown above.

    Install using uv (recommended for reproducible, pinned installs)

    uv can generate a pinned requirements.txt from pyproject.toml which is handy for deployments or for reproducible installs.

    1. Install uv (if you don't have it):

       pip install uv
      
    2. add the newspaper4k package to your project using uv add (you must be in a project directory with a pyproject.toml file):

       uv add newspaper4k
      

    or if you want to include extras:

        uv add --all-groups newspaper4k
    

    or uv add --group gnews newspaper4k

    Notes

    • If you encounter problems with libpng12-dev, try libpng-dev instead.
    • The optional extras are declared in pyproject.toml under [project.optional-dependencies] (for example gnews, nlp, cloudflare, all).

    Contributing

    see CONTRIBUTING.md

    LICENSE

    Authored and maintained by Andrei Paraschiv.

    Newspaper was originally developed by Lucas Ou-Yang (codelucas), the original repository can be found here. Newspaper is licensed under the MIT license.

    Credits

    Thanks to Lucas Ou-Yang for creating the original Newspaper3k project and to all contributors of the original project.