Newspaper高级使用指南:多线程下载与定制化配置
多线程文章下载优化
在实际应用中,单线程下载新闻文章效率低下,但过度并发请求又会导致目标网站限流甚至封禁IP。Newspaper提供了智能的多线程下载方案,通过为每个新闻源分配1-2个线程,在提高下载速度的同时保持对目标网站的友好访问。
import newspaper
from newspaper import news_pool
# 构建多个新闻源
slate_paper = newspaper.build('http://slate.com')
tc_paper = newspaper.build('http://techcrunch.com')
espn_paper = newspaper.build('http://espn.com')
# 配置线程池
papers = [slate_paper, tc_paper, espn_paper]
news_pool.set(papers, threads_per_source=2) # 总共创建6个线程(3源×2线程)
news_pool.join()
# 此时所有文章都已下载完成
print(slate_paper.articles[10].html)
这种设计既保证了下载效率,又避免了给单一网站造成过大访问压力,是生产环境中推荐的下载方式。
保留文章正文HTML结构
默认情况下,Newspaper会提取纯文本内容,但有时我们需要保留正文的HTML结构,以便后续处理或展示。通过设置keep_article_html=True
参数,可以获取带有原始HTML标签的正文内容。
from newspaper import Article
a = Article('http://www.cnn.com/2014/01/12/world/asia/north-korea-charles-smith/index.html',
keep_article_html=True)
a.download()
a.parse()
print(a.article_html) # 输出带HTML标签的正文内容
解析后,还可以访问底层的DOM对象:
print(a.clean_dom) # 获取清理后的lxml DOM对象
print(a.clean_top_node) # 获取包含正文的顶层DOM节点
支持新语言的扩展方法
Newspaper的文本提取算法依赖于对停用词的识别,因此添加新语言支持需要提供该语言的停用词列表。根据语言类型不同,处理方式也有所区别:
拉丁语系语言
- 创建停用词文件:
stopwords-<语言代码>.txt
- 将文件放入资源目录
newspaper/resources/text/
非拉丁语系语言(如中文、阿拉伯语)
- 同上创建停用词文件
- 提供专门的分词器(tokenizer)实现
- 中文使用jieba分词
- 阿拉伯语使用NLTK的分词器
添加新语言后,需要更新项目文档中支持的语言列表。
底层Source API详解
除了使用高级的newspaper.build()
API,开发者可以直接操作Source类,获得更精细的控制:
from newspaper import Source
# 基础构建
cnn_paper = Source('http://cnn.com')
cnn_paper.build()
print(cnn_paper.size()) # 文章数量
# 分步构建(完全控制流程)
cnn_paper = Source('http://cnn.com')
cnn_paper.download()
cnn_paper.parse()
cnn_paper.set_categories()
cnn_paper.download_categories()
cnn_paper.parse_categories()
cnn_paper.set_feeds()
cnn_paper.download_feeds()
cnn_paper.generate_articles()
这种分步构建方式允许开发者在任意阶段介入处理过程,适合需要定制化处理的场景。
配置参数详解
Newspaper提供两种配置方式:命名参数和Config对象。
命名参数方式(推荐)
cnn = newspaper.build('http://cnn.com',
language='en',
memoize_articles=False)
article = Article(url='http://cnn.com/french/...',
language='fr',
fetch_images=False)
Config对象方式
from newspaper import Config
config = Config()
config.memoize_articles = False
config.language = 'en'
cbs_paper = newspaper.build('http://cbs.com', config)
重要配置参数说明
-
内容提取相关:
MIN_WORD_COUNT
: 文章最小词数(默认300)MIN_SENT_COUNT
: 文章最小句子数(默认7)MAX_TITLE
: 标题最大长度(默认200字符)
-
网络请求相关:
request_timeout
: 请求超时时间(默认7秒)number_threads
: 线程数(默认10)follow_meta_refresh
: 是否跟随meta刷新重定向(默认False)
-
功能开关:
fetch_images
: 是否下载图片(默认True)keep_article_html
: 是否保留正文HTML(默认False)memoize_articles
: 是否缓存文章(默认True)
开发者应根据实际需求合理配置这些参数,在功能完整性和性能之间取得平衡。对于生产环境,建议适当增加超时时间和线程数,同时开启缓存功能以提高效率。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考