小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
高效的通用新闻文本提取器
面向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)
爬取如下图:
此外,笔者还在多个热门新闻门户网站进行尝试,基本成功抽取
实验代码 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,深入交流~~~