登录
首页python新闻内容爬虫专用包newspaper详细教程
python新闻内容爬虫专用包newspaper详细教程
2020-03-26
收藏


<a href='/map/python/' style='color:#000;font-size:inherit;'>python</a>新闻内容爬虫专用包newspaper详细教程

作者 | CDA数据分析师


1、介绍newspaper包


Newspaper框架是Python爬虫框架中在GitHub上点赞排名第三的爬虫框架,适合抓取新闻网页。它的操作非常简单易学,即使对完全没了解过爬虫的初学者也非常的友好,简单学习就能轻易上手,因为使用它不需要考虑header、IP代理,也不需要考虑网页解析,网页源代码架构等问题。这个是它的优点,但也是它的缺点,不考虑这些会导致它访问网页时会有被直接拒绝的可能。


总得来说,Newspaper框架并不适用于实际工程类新闻信息爬取工作,框架不稳定,爬取过程中会有各种bug,例如获取不到url、新闻信息等,但对于想获取一些新闻语料的朋友不妨一试,简单方便易上手,且不需要掌握太多关于爬虫方面的专业知识。


newspaper的功能


  • 多线程文章下载框架
  • 新闻网址识别
  • 从html中提取文本
  • 从html中提取顶部图像
  • 从html中提取所有图像
  • 从文本中提取关键字
  • 从文本中提取摘要
  • 从文本中提取作者
  • Google趋势术语提取。
  • 使用10种以上语言(英语,中文,德语,阿拉伯语......)
  • ......


2、newspaper包示例教学


newspaper包并不是默认已安装的模块库,因此在第一次使用newspaper库前,需要先安装好newspaper库,通常可以说通过快捷键win+R,输入cmd,回车打开命令窗口,输入

pip install newspaper3k

进行安装,需要注意的是:需要安装的是newspaper3k而不是newspaper,因为newspaper是python 2的安装包,pip install newspaper 无法正常安装,请用python 3对应的 pip install newspaper3k正确安装。


2.1 单条新闻爬取示例


爬取单条新闻用到的是newspaper中的Article包,爬取指定网页的新闻内容,也就是当你想爬取某一篇新闻的内容,那么需要先获取它的网址,然后再以这个单一的网址作为目标来爬取内容。


<a href='/map/python/' style='color:#000;font-size:inherit;'>python</a>新闻内容爬虫专用包newspaper详细教程


下面以2019年12月6日南方网的一篇新闻《最短10分钟 广州南站直达市中心》作为例子进行说明。首先需要设定新闻的网址,然后使用Article函数,第一个参数是网址,第二个常用参数是语言language,中文是以字符串'ch'表示。然后在用download函数和parse函数对新闻进行加载已经解析,这两步执行完之后结果新闻所有内容就已经加载出来了,剩下来就是从中使用函数分解出自己需要的内容了。


## 用Article爬取单条新闻
from newspaper import Article
# 目标新闻网址
url = 'http://news.southcn.com/gd/content/2019-12/06/content_189723331.htm'
news = Article(url, language='zh')
news.download()        # 加载网页
news.parse()           # 解析网页
print('题目:',news.title)       # 新闻题目
print('正文:\n',news.text)      # 正文内容                                       
print(news.authors)     # 新闻作者
print(news.keywords)    # 新闻关键词
print(news.summary)     # 新闻摘要

# print(news.top_image) # 配图地址
# print(news.movies)    # 视频地址
# print(news.publish_date) # 发布日期
# print(news.html)      # 网页源代码


结果:

题目: 最短10分钟 广州南站直达市中心

正文:
 专家建议应在核心区内贯彻站城一体的建设理念,保障多层级地下空间的连续,对人流进行分层管理,明确南站要建以轨道交通为衔接的立体枢纽。

南方网讯 5日,《广州南站周边地区控制性详细规划深化》在广州市规委会会议上获得通过。该规划针对广州南站启用近10年来面临的问题进行全面梳理。规划提出,要在36平方公里的规划范围内,形成7大组团协同发展,打造高350米的站前地标建筑,对12条旧村将进行全面改造。

规委会上,南站内外交通优化问题最受关注。专家建议应在核心区内贯彻站城一体的建设理念,保障多层级地下空间的连续,对人流进行分层管理,明确南站要建以轨道交通为衔接的立体枢纽。

为此,本轮规划在南站地区规划了9条轨道交通,规划轨道线路总长38.2公里,共设站点16座,轨道站点覆盖率达37.8%,核心区轨道交通站点覆盖率达100%。9条轨道交通分别是:3条城际轨道——广珠城际:广州南站—珠海;广佛环城际:广州南站—金融城—白云机场—佛山西站—广州南站;佛莞城际:佛山—广州南站—莞城。4条地铁——2号线:嘉禾望岗—广州南站;7号线:佛山北滘新城—广州南站—萝岗;22号线:南沙客运港—广州南站—白鹅潭—白云机场;佛山2号线:佛山西站—广州南站。2条有轨电车——南海新交通:广州南站—南海金融高新区;N2线:广州南站—大夫山—市桥—莲花山。

此外,规划提出要构建4条南站与广州中心城区快速连接的直达干道,只需10—20分钟就能从南站直达市中心。

南方日报记者 刘怀宇 通讯员 穗规资宣
[]
[]


除了常用到的正文和题目外,还可以获取新闻的作者、发布时间、摘要、关键词、图片链接、视频链接等等,但是并不能100%识别,很多新闻的作者,关键词和文章摘要都无法识别出来,发布时间,图片、视频链接就基本能识别出来。


如果文章没有指明使用的什么语言的时候,newspaper会尝试自动识别。世界上各国语言何其之多,newspaper也不能100%完美支持各种语言的,不过目前newspaper可以支持35种语言,基本上可以说能够覆盖时间上绝大多数国家和地区的新闻了。


通过newspaper.languages(),可以查看newspaper库支持的语言及其对应参数输入


>>> import newspaper
>>> newspaper.languages()    # 查看newspaper库支持的语言及其对应参数输入

Your available languages are:

input code      full name
  ar              Arabic
  be              Belarusian
  bg              Bulgarian
  da              Danish
  de              German
  el              Greek
  en              English
  es              Spanish
  et              Estonian
  fa              Persian
  fi              Finnish
  fr              French
  he              Hebrew
  hi              Hindi
  hr              Croatian
  hu              Hungarian
  id              Indonesian
  it              Italian
  ja              Japanese
  ko              Korean
  mk              Macedonian
  nb              Norwegian (Bokmål)
  nl              Dutch
  no              Norwegian
  pl              Polish
  pt              Portuguese
  ro              Romanian
  ru              Russian
  sl              Slovenian
  sr              Serbian
  sv              Swedish
  sw              Swahili
  tr              Turkish
  uk              Ukrainian
  vi              Vietnamese
  zh              Chinese


2.2 同网站下多条新闻爬取


单条新闻爬取的效率太低了,而且需要先行找到新闻的详细网址才可以爬取其中内容,如果是需要爬取某个网站或者多个网站的大量新闻,这样使用明显是不够的。newspaper可以通过构建新闻源,把整个新闻网站的所有新闻包含进来,然后再通过这个新闻源对新闻网站进行索引和爬取。以下以南方网为例,详细解读该如何使用newspaper库爬取多条新闻。


1、先构建新闻源


import newspaper
url = 'http://www.southcn.com/'      # 南方网
south_paper = newspaper.build(url, language='zh')    # 构建新闻源


2、文章缓存


默认情况下,newspaper缓存所有以前提取的文章,并删除它已经提取的任何文章。此功能用于防止重复的文章和提高提取速度。


>>> south_paper.size()   # 查看有多少链接
1838

>>> ## 在默认文章缓存的情况下过一段时间后再次
>>> url = 'http://www.southcn.com/'      # 南方网
>>> new_south_paper = newspaper.build(url, language='zh')    # 构建新的新闻源
>>> new_south_paper.size()
18


相隔一段时间后重新构建同一网站的新闻源,再查看新闻链接,发现只有18个了,说明在这一段时间内,新增/更新了18条新闻。如果不需要使用这个功能,可以使用memoize_articles参数选择退出此功能。


south_paper = newspaper.build(url,language='zh',memoize_articles = False)    # 构建新闻源


3、提取源类别


通过category_urls()可提取出源网站下所有的其他新闻网站链接,可以通过取出来的网站链接,建立更多的新闻源,从而获取跟多的新闻。


# 提取源类别
for category in south_paper.category_urls():
    print(category)


结果:


http://www.southcn.com/
http://pc.nfapp.southcn.com
http://culture.southcn.com
http://theory.southcn.com
http://creditgd.southcn.com
......


4、提取源新闻网站的品牌和描述


构建新闻源之后,可以直接查看其品牌名称和新闻网站的介绍。


# 提取源新闻网站的品牌和描述
print('品牌:',south_paper.brand)  # 品牌
print('描述:',south_paper.description) # 描述

品牌: southcn
描述: 南方网/南方新闻网是经中共广东省委,广东省人民政府批准建设的新闻宣传网站。南方网/南方新闻网由广东省委宣传部主办主管并作为南方报业传媒集团之成员单位,获国务院新闻办公室批准从事登载新闻业务并被确定为全国重点新闻网站之一。南方网/南方新闻网作为华南地区最大型的新闻融合平台,是国内外网民认识、了解广东最权威、最快捷的途径。



<a href='/map/python/' style='color:#000;font-size:inherit;'>python</a>新闻内容爬虫专用包newspaper详细教程



5、查看新闻链接


构建新闻源之后,还可以查看整个新闻源下的所有新闻链接及其数量,通过for循环,可以一一列出所有对应的新闻网页。这个与第三小点中的源类别不一样,源类别中提前的是新闻网站的主网页,每个主网页下有非常多新闻链接,而新闻链接是新闻源内的每一篇新闻报道的实际网址。


# 查看新闻源下面的所有新闻链接
for article in south_paper.articles:
    print(article.url)

len(south_paper.articles)      # 查看新闻链接的数量,与south_paper.size()一致


输出结果:


http://www.southcn.com/pc2018/nfrmt/node_384365.htm
http://www.southcn.com/pc2018/xczx/node_384360.htm
http://tech.southcn.com/t/2019-12/09/content_189747678.htm
http://tech.southcn.com/t/2019-12/09/content_189747668.htm
http://tech.southcn.com/t/2019-12/09/content_189747657.htm
...

1838


有一点需要注意的是,这1838条新闻链接中并不是全部链接都是对应着一篇新闻报道,有一些是只是新闻网站的子节点,子节点类似于一个新闻分类,里面装载这其他新闻的链接,它可能只有一个标题,没有新闻正文之类的内容。


例如新闻链接中的第一、第二条链接,其网址也和下面几条新闻报道的网址有着较明显的区别,第一条链接对应的是《》,在newspaper里能通过.title()函数取出它的名字,但因为它没有新闻正文,所以用.text()取出的会是空字符串。


6、提取单篇文章


既然newspaper库能够提取新闻源里的每篇新闻报道的网址链接,那么必然能够根据这个来爬取新闻的内容,下面我们以新闻链接中的第四条链接为例,提取其中的一篇新闻报道——《创新的佛山呼唤一条创新街》。


# 提前其中一篇文章
one_article = south_paper.articles[3]       # 选择第四条新闻链接
one_article.download()                      # 下载网页
one_article.parse()                         # 解析网页
print("标题:",one_article.title)
print("正文:",one_article.text)


输出结果:


标题: 创新的佛山呼唤一条创新街
正文: 钱塘江畔的杭州高新区,仅一公里长的物联网街集聚了海康威视、吉利汽车等数十家高科技企业的总部及研发部门。人才、技术、资金等创新要素在这个街区汇集。

钱塘江畔的杭州高新区,仅一公里长的物联网街集聚了海康威视、吉利汽车等数十家高科技企业的总部及研发部门。人才、技术、资金等创新要素在这个街区汇集。

“创新街区”这一集生活与创新于一体,高端研发机构、企业集群、孵化器汇集的城市经济空间,正以其物理空间的紧凑性、交通的通达性、技术的网络互动性等优势,逐步走进大众视野。

近年来,创新街区在全球得到蓬勃发展。在国外,纽约硅巷、剑桥肯戴尔广场等街区成为科技型中小企业集聚地的典型样本;在国内,北京中关村、深圳华强北等同样是创新创业资源最为密集的特色街区。

一定程度上说,创新街区是介乎创新龙头企业与高新园区的中间态,是创新集聚从“点”到“面”的龙门一跃。

杭州物联网街是一个典型案例。作为杭州高新区的主导产业,物联网产业的核心技术集聚正是从这条街起步。随着海康威视、大华股份等一批龙头企业率先迁入,一批产业链上下游企业迅速涌入物联网街,行业先进技术与高端人才逐步聚集。

当产业集聚发展到一定水平,街区的城市化建设也随之加速。当地不少企业员工表示,5年前物联网街两旁还是一片空地。如今,物联网街的发展已高度现代化,学校、医院、商场等生活配套十分齐全。

而另一个制造业中心佛山,拥有美的、格兰仕等一批创新龙头企业,三龙湾、佛山高新区等重大创新平台也正在稳步崛起,不缺创新的“点”与“面”。然而,具有一定影响力的高水平创新街区在佛山却暂时未能涌现。

早在2013年,佛山高新区就提出要打造科技一条街,探索金融和科技产业的创新融合,用10余个科技创新载体的密集建设,为佛高区打造科创新城积蓄力量。同在2013年,佛山提出要打造民间金融街,为产业发展提供金融支撑。如今,这些创新街区的雏形已现,但对标国际国内一流水平,其辐射力与集聚力仍有待提高。

一个创新街区的形成离不开政府、企业与人才三大主体。一个成熟的创新街区往往能让创新创业企业获得更多知识溢出,让高端人才获得更好的生活体验,让地方政府从中获取更多综合效益。

佛山在这一领域不缺资源、不缺平台,更不缺希望和未来。借鉴杭州物联网街的发展经验,佛山可通过强化规划引领突出产业功能分区,形成主业突出、分工协作、科学有序的平台格局。同时,用好用活政策工具,鼓励龙头企业发挥创新带动作用,引导上下游全产业链创新要素形成集聚。更重要的是,佛山可立足产业基础发挥优势,加速推进“城产人”融合发展,完善高端人才工作生活的配套。依托这一系列有力有效的作为,我们期待,在创新的佛山找到全新的创新街区。


7、提取新闻源下所有新闻内容



通过for循环,可以将新闻报道一篇一篇的进行加载并解析,将其内容爬取出来,因为newspaper库是属于比较简单粗暴的访问网页进行爬取,出现拒绝访问的可能性还是很大的,所以还必须得使用try试错。


import pandas as pd         # 导入pandas
news_title = []
news_text = []
news = south_paper.articles
for i in range(len(news)):    # 以新闻链接的长度为循环次数
    paper = news[i]
    try :
        paper.download()
        paper.parse()
        news_title.append(paper.title)     # 将新闻题目以列表形式逐一储存
        news_text.append(paper.text)       # 将新闻正文以列表形式逐一储存
    except:
        news_title.append('NULL')          # 如果无法访问,以NULL替代
        news_text.append('NULL')          
        continue

# 建立数据表存储爬取的新闻信息
south_paper_data = pd.DataFrame({'title':news_title,'text':news_text})
south_paper_data


输出结果(部分):


<a href='/map/python/' style='color:#000;font-size:inherit;'>python</a>新闻内容爬虫专用包newspaper详细教程


从结果来看,newspaper此次的爬取还是非常成功的,没有出现404被拒绝访问的情况,顺利的把所有新闻报道都爬取下来了。


数据分析咨询请扫描二维码

上一篇
下一篇
客服在线
立即咨询