[⭐趣玩]高效的通用新闻文本提取器

653 阅读3分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

高效的通用新闻文本提取器

面向NLP领域进行研究或多或少都会需要爬取海量的新闻数据,对每个新闻网站写一套爬取规则肯定也不合适,借助第三方软件想灵活爬取需要付费,总有本次博客介绍一个高效的单篇新闻抽取的工具包,该工具包能够出色完成不同新闻门户网站中新闻信息的抽取的工作。

GeneralNewsExtractor(GNE)是一个通用新闻网站正文抽取模块,输入一篇新闻网页的 HTML, 输出正文内容、标题、作者、发布时间、正文中的图片地址和正文所在的标签源代码。GNE在提取今日头条、网易新闻、游民星空、 观察者网、凤凰网、腾讯新闻、ReadHub、新浪新闻等数百个中文新闻网站上效果非常出色,几乎能够达到100%的准确率。

GeneralNewsExtractor(GNE)源码:github.com/kingname/Ge…

安装方式:

pip install --upgrade gne

使用方式也非常简单:

from gne import GeneralNewsExtractor
extractor = GeneralNewsExtractor()
html = '网站源代码'
result = extractor.extract(html)
print(result)

本项目取名为 抽取器 ,而不是 爬虫 ,是为了规避不必要的风险,因此,本项目的输入是 HTML源代码,输出是一个字典。请自行使用恰当的方法获取目标网站的 HTML。

超级好用,基本可以完美爬取任何网站的新闻!!!


笔者实验:以人民网新闻作为例子 Example1:

import pandas as pd
from gne import GeneralNewsExtractor
import requests

# 获取html
url = "http://edu.people.com.cn/n1/2021/0504/c1006-32094364.html"
rep = requests.get(url)
source = rep.content.decode("gbk",errors='ignore')
# 创建GNE提取器
extractor = GeneralNewsExtractor()
# 传入输入(html)得到结果
result = extractor.extract(source)
# 结果以{“title”,“author”,“publish_time”,“content”,“images”}的字典类型进行返回
print(result)

爬取如下图:

image.png

此外,笔者还在多个热门新闻门户网站进行尝试,基本成功抽取

实验代码 Example2:

import pandas as pd
from gne import GeneralNewsExtractor
import requests
import chardet

class NewsExtract(object):
    
    def __init__(self):
        pass
    
    def extract(self,url):
        # 读取链接
        rep = requests.get(url)
        # 获取网页编码
        encoding = chardet.detect(rep.content)["encoding"]
        # 解析网页源码
        source = rep.content.decode(encoding,errors='ignore')
        # 创建GNE提取器
        extractor = GeneralNewsExtractor()
        # 传入输入(html)得到结果
        result = extractor.extract(source)
        return result 

if __name__ == '__main__':
        news_website ={
        "01百度新闻":"https://news.cctv.com/2021/10/08/ARTIdfEmRcmTVug3xbAetmHw211008.shtml",
        "02新浪新闻":"https://news.sina.com.cn/c/2021-10-08/doc-iktzqtyu0280551.shtml",
        "03人民网":"http://opinion.people.com.cn/n1/2021/1008/c1003-32246575.html",
        "04澎湃新闻":"https://www.thepaper.cn/newsDetail_forward_14812232",
        "05新华网":"http://www.news.cn/politics/leaders/2021-10/07/c_1127935225.htm",
        "06腾讯新闻":"https://new.qq.com/omn/TWF20211/TWF2021100800473500.html",
        "08百度新闻":"http://baijiahao.baidu.com/s?id=1713042599973678893",
        "09凤凰新闻":"https://news.ifeng.com/c/8AAfop0xwa6",
        "10搜狐新闻":"https://www.sohu.com/a/493916920_114988?spm=smpc.news-home.top-news3.4.1633693367314ApmGjAj&_f=index_chan08news_8",
        }
    # 创建提取器
    ne = NewsExtract()
    # 暴力提取
    for idx,url in news_website.items():
        try:
            print(f"==={idx}:{url}===")
            info_news = ne.extract("http://edu.people.com.cn/n1/2021/0504/c1006-32094364.html")
            print(info_news)
            print()
        except:
            print(f"{idx}爬取失败")

上述尝试的网站都成功提取新闻内容!~

这样在面对多新闻门户信息爬取的过程中,可以使用GNE抽象掉对每个新闻网页提取规则撰写的步骤,只需要关注如何收集到更多更全的url,让这些url构成一个新闻url池。

⭐⭐⭐期待能有更多有趣的coding,深入交流~~~