精华内容
下载资源
问答
  • 第二个方法是后面标红的,主要推荐用newspaper库 在导师公司,需要利用重度搜索引擎来最快的获取想要的内容,再建立语料库,于是我用python 的 beautifulsoup 和urllib 来抓取一些网页内容来...

    我主要是用了两个方法来抽去正文内容,第一个方法,诸如xpath,css,正则表达式,beautifulsoup来解析新闻页面的时候,总是会遇到这样那样各种奇奇怪怪的问题,让人很头疼。第二个方法是后面标红的,主要推荐用newspaper库

    在导师公司,需要利用重度搜索引擎来最快的获取想要的内容,再建立语料库,于是我用python 的 beautifulsoup 和urllib 来抓取一些网页内容来做训练语料。

    搜索关键词是 “人名 公司 说”,其实只要三步就可以完成,第一个是直接在百度主页上搜,然后先是在百度结果搜索页上的链接获取下来,第二个是进入结果搜索页主页面上的的那些链接,然后抓去正文内容,第三个就是将获取到的正文内容保存下来,对内容进行分词,比如在正文里面找到人说过的话,可以用说、表示、说到、曾经说、“  ”来判断,这些不做描述了,主要说一下抽取正文内容。

    提取链接

    通过网页源码,发现这些超链接都是在<div class = "main"> </div>标签之间(不同网站有不同的格式),用beautifulsoup来提取比较好,若用urllib容提取到其他url,不易区分。 例如下图

    代码如下: 

    #encoding=utf-8
    #coding=utf-8
    import urllib,urllib2  
    from bs4 import BeautifulSoup
    import re
    import os
    import string
     
     
    #得到url的list
    def get_url_list(purl):
        #连接
        req = urllib2.Request(purl,headers={'User-Agent':"Magic Browser"})
        page = urllib2.urlopen(req)  
        soup = BeautifulSoup(page.read())
        #读取标签
        a_div = soup.find('div',{'class':'main'})
        b_div = a_div.find('div',{'class':'left'})
        c_div = b_div.find('div',{'class':'newsList'})
        
        links4 = []
        #得到url的list
        for link_aa in c_div:
            for link_bb in link_aa:
                links4.append(link_bb.find('a'))
                
        links4 = list(set(links4))
        links4.remove(-1)
        links4.remove(None)
     
        return links4
     
    #从list中找到想要的新闻链接
    #找到要访问的下一个页面的url
    def get_url(links):
     
        url = []
        url2 = ''
        url3 = ''
        url4 = ''
        i = 0
     
        for link in links:
            if link.contents == [u'后一天']:
                continue
            
            #上一页  和  下一页 的标签情况比较复杂
            #取出“上一页”标签的url(貌似不管用)
            if str(link.contents).find(u'/> ') != -1:
                continue
     
            #取出“下一页”标签的url
            if str(link.contents).find(u' <img') != -1:
                url2 = link.get("href")
                i = 1
                continue
            
            if link.contents == [u'前一天']:
                url3 = link.get("href")
                continue
        
            url.append(link.get("href"))
     
        if(i == 1):
            url4 = url2
        else:
            url4 = url3
     
        return url , url4
     
    def main():
     
        link_url = []
        link_url_all = []
        link_url_all_temp = []
        next_url = ''
     
        #开始的url
        purl = 'http://news.ifeng.com/listpage/4550/20140903/1/rtlist.shtml'
        link_url = get_url_list(purl)
        link_url_all , next_url = get_url(link_url)
     
        #做了100次循环
        for i in range(100):
            link_url = get_url_list(next_url)
            link_url_all_temp , next_url = get_url(link_url)
            
            link_url_all = link_url_all + link_url_all_temp
     
        #将全部url存档
        path = 'd:\\url.txt'
        fp = open(path,'w')
        for link in link_url_all:
            fp.write(str(link)+'\n')
        fp.close()
        
    if __name__ == '__main__':
        main()
     
     
        
    

    但是!!!!这个方法并不好一点都不好 ,太不方便

    我们可以用python 的一个库 newspaper的Article包,直接抽取文章内容,不用再分析web页面上的什么diva,css啊

    from newspaper import Article
    url = 'http://news.ifeng.com/a/20180504/58107235_0.shtml'
    news = Article(url, language='zh')
    news .download()
    news .parse()
    print(news.text)
    print(news.title)
    # print(news.html)
    # print(news.authors)
    # print(news.top_image)
    # print(news.movies)
    # print(news.keywords)
    # print(news.summary)

    也可以直接导入包

    import newspaper
    news = newspaper.build(url, language='zh')
    article = news.articles[0]
    article.download()
    article.parse()
    print(article.text)

    我用到的是几代码为:

    第一段代码为获取结果搜索页的url链接,将这些链接保存到一个txt文件

    第二段代码是进入就过搜索页的链接,抽去正文内容

    这个方法比上一个真是好到爆,这个库包就是好用!!!强烈推荐

    1. def baidu_search(wd,pn_max,save_file_name):
      
          #百度搜索爬虫,给定关键词和页数以及存储到哪个文件中,返回结果去重复后的url集合
          url= "https://www.baidu.com/s"
          # url = "https://www.google.com.hk"
          # return_set = set()
          with open(save_file_name, 'a', encoding='utf-8') as out_data:
              for page in range(pn_max):
                  pn = page*10
      
                  querystring = {
                      "wd":wd,
                      "pn":pn,
                      "oq":wd,
                      "ie":"utf-8",
                      "usm":2,
                  }
      
                  headers = {
                      'pragma': "no-cache",
                      'accept-encoding': "gzip, deflate, br",
                      'accept-language': "zh-CN,zh;q=0.8",
                      'upgrade-insecure-requests': "1",
                      'user-agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36",
                      'accept': "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
                      'cache-control': "no-cache",
                      'connection': "keep-alive",
                      }
                  try:
                      response = requests.request("GET", url, headers = headers, params=querystring)
                      html=etree.HTML(response.text, parser=etree.HTMLParser(encoding='utf-8'))
                      # print(response.text)
                      titles=[]
                      titles_tags=html.xpath('//div[@id="content_left"]/div/h3/a')
                      for tag in titles_tags:
                          title=tag.xpath('string(.)').strip()
                          titles.append(title)
                      urls=html.xpath('//div[@id="content_left"]/div/h3/a/@href')
      
                      print(len(urls))
                      for data in zip(titles, urls):
                          # out_data.write(data[0] + ',' + data[1] + '\n')
                          out_data.write(data[1] + '\n')
                  except Exception as e:
                      print ("页面加载失败", e)
                      continue
      
      # def exc_search_content():
      #     url = "https://www.baidu.com/s"
      #     response = requests.request("GET", url)
      #     responser = requests.request("GET",response.url)
      #     html = etree.HTML(responser.content, parser=etree.HTMLParser(encoding='utf-8'))
      #     urls = html.xpath
      
      if __name__ == '__main__':
          wd = "马云 阿里巴巴 曾经说"
          pn = 4
          save_file_name = "save_url.txt"
          return_set = baidu_search(wd,pn,save_file_name)
    2. import urllib
      import re
      import os
      import string
      from bs4 import BeautifulSoup
      import logging
      from newspaper import Article
      
      urlLinks = []
      save_urls = 'save_url.txt'
      file = open(save_urls,'r')
      
      #读取之前保存的url
      for line in file:
          urlLinks.append(line)
      file.close()
      
      print(len(urlLinks))
      print(urlLinks)
      
      for link in urlLinks:
          try:
              news = Article(link.strip(), language = 'zh')
              news.download()
              news.parse()
              print(news.text)
              print('-------------------------------------------------------------------------------------------------------')
          except Exception as e:
              print("Error: 网页为404错误")

    现在说一下安装这个库,在settings配置环境,添加包newspaper的时候总是添加不进去。那就pip吧!

    于是打开命令行窗口,输入pip3 install --ignore-installed --upgrade newspaper3k,等待一会就安装好了。

    如果文章没有指明使用的什么语言的时候,Newspaper会尝试自动识别。

    或者现在python3版本用的都是newspaper3k,所以再pycharm左下角打开命令行直接输 pip install newspaper3k就可以了

     

    展开全文
  • GitHub:https://github.com/codelucas/newspaper Newspaper文档说明:https://newspaper.readthedocs.io/en/latest/ Newspaper快速入门:...
    • GitHub:https://github.com/codelucas/newspaper
    • Newspaper文档说明:https://newspaper.readthedocs.io/en/latest/

    • Newspaper快速入门:https://newspaper.readthedocs.io/en/latest/user_guide/quickstart.html

    Newspaper是一个python3库。

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

    安装

    pip3 install newspaper3k
    or 
    pip3 install --ignore-installed --upgrade newspaper3k
    

    如果文章没有指明使用的什么语言的时候,Newspaper会尝试自动识别。支持10多种语言并且所有的都是unicode编码。

    import time
    from newspaper import Article
    
    url = 'https://www.chinaventure.com.cn/news/78-20190819-347269.html'
    url='https://36kr.com/p/5237348'
    # 创建文章对象
    news = Article(url, language='zh')
    # 下载网页
    news.download()
    ## 网页解析
    news.parse()
    print("title=",news.title)# 获取文章标题
    print("author=", news.authors)   # 获取文章作者
    print("publish_date=", news.publish_date)   # 获取文章日期
    # 自然语言处理
    news.nlp()
    print('keywords=',news.keywords)#从文本中提取关键字
    print("summary=",news.summary)# 获取文章摘要
    # time.sleep(30)
    print("text=",news.text,"\n")# 获取文章正文
    
    print("movies=",news.movies)   # 获取文章视频链接
    print("top_iamge=",news.top_image)   # 获取文章顶部图片地址
    print("images=",news.images)#从html中提取所有图像
    print("imgs=",news.imgs)
    print("html=",news.html)#获取html
    

    也可以直接导入包,如果语言是一致的,也可以直接声明

    import newspaper
    
    url='http://www.coscocs.com/'
    '''注:文章缓存:默认情况下,newspaper缓存所有以前提取的文章,并删除它已经提取的任何文章。
    此功能用于防止重复的文章和提高提取速度。可以使用memoize_articles参数选择退出此功能。'''
    news = newspaper.build(url, language='zh', memoize_articles=False)
    article = news.articles[0]
    article.download()
    article.parse()
    print('text=',article.text)
    print('brand=',news.brand)  #提取源品牌
    print('description=',news.description) # 提取描述
    print("一共获取%s篇文章" % news.size())  # 文章的数目
    
    # 所有文章的url
    for article in news.articles:
        print(article.url)
    
    #提取源类别
    for category in news.category_urls():
        print(category)
    
    #提取源提要
    for feed_url in news.feed_urls():
        print(feed_url)
    
    

    注:文章缓存:默认情况下,newspaper缓存所有以前提取的文章,并删除它已经提取的任何文章。此功能用于防止重复的文章和提高提取速度。可以使用memoize_articles参数选择退出此功能。

    Requests和Newspaper结合解析正文

    import requests
    from newspaper import fulltext
    
    html = requests.get('https://www.washingtonpost.com/business/economy/2019/01/17/19662748-1a84-11e9-9ebf-c5fed1b7a081_story.html?utm_term=.26198c91916f').text
    text = fulltext(html)
    print(text)
    

    Google Trends信息

    import newspaper
    
    print(newspaper.languages())#获取支持的语言
    print(newspaper.hot())#hot()使用公共api返回谷歌上的热门词汇列表
    print(newspaper.popular_urls())#popular_urls()返回一个流行新闻源url列表
    

    多任务

    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) # (3*2) = 6 共6个线程
    
    news_pool.join()
    
    print(slate_paper.articles[10].html)
    

    python-readability

    github地址是:https://github.com/buriy/python-readability

    安装

    pip install requests
    pip install readability-lxml
    

    使用方式:

    import requests
    from readability import Document
    response = requests.get('https://news.163.com/18/1123/13/E1A4T8F40001899O.html')
    doc = Document(response.text)
    print doc.title()
    print doc.content()
    

    测试结果:正文提取范围太大,且乱码,不好用,拿到的正文部分,明显有问题。而且还有乱码问题。所以,不建议使用。

    参考:https://blog.csdn.net/weixin_41931602/article/details/81211253
    https://blog.csdn.net/Mr_Robert/article/details/85028327
    https://www.jianshu.com/p/1c12e0cc9a2e
    https://newsn.net/say/python-readability.html

    展开全文
  • 今天所介绍的 Readability 和 Newspaper的实现原理就是类似。 目前比较先进的是基于视觉信息的网页信息提取方法,通过浏览器接口或者内核对目标网页预渲染,然后基于网页的视觉规律提取网页数据记录。经典的...

    舆情爬虫是网络爬虫一个比较重要的分支,舆情爬虫往往需要爬虫工程师爬取几百几千个新闻站点。比如一个新闻页面我们需要爬取其标题、正文、时间、作者等信息,如果用传统的方式来实现,每一个站点都要配置非常多的规则,如果要维护一个几百上千的站点,那人力成本简直太高了。

    如果有一种方式可以在保证差不多的准确率的前提下,大幅提高提取效率的话,就需要用到智能文本提取了。

    本文首先介绍一下智能文本提取的基本原理,让大家对智能提取有基本的了解。然后介绍几个比较基础的工具包,准确率并不是很高,可以尝试一用。最后再介绍几篇比较前沿的技术供大家参考。

    智能文本提取

    目前来说,智能文本提取可以分为三类:

    • 基于网页文档内容的提取方法

    • 基于 DOM 结构信息的提取方法

    • 基于视觉信息的提取方法

    基于网页文档的提取方法将 HTML 文档视为文本进行处理,适用于处理含有大量文本信息且结构简单易于处理的单记录网页,或者具有实时要求的在线分析网页应用。这种方式主要利用自然语言处理相关技术实现,通过理解 文本语义、分析上下文、设定提取规则等,实现对大段网页文档的快速处理。其中,较为知名的方法有TSIMMIS、Web-OQL、Serrano、FAR-SW 和 FOREST,但这些方法由于通常需要人工的参与,且存在耗时长、效率低的弊端。

    基于 DOM 结构信息的方法将 HTML 文档解析为相应的 DOM 树,然后根据 DOM 树的语法结构创建提取规则, 相对于以前的方法而言有了更高的性能和准确率。W4F 和 XWRAP 将 HTML 文档解析成 DOM 树,然后通过组件化引导用户通过人工选择或者标记生成目标包装器代码。Omini、IEPAD 和 ITE 提取 DOM 树上的关键路径, 获取其中存在的重复模式。MDR 和 DEPTA 挖掘了页面中的数据区域,得到数据记录的模式。CECWS 通过聚类算法从数据库中提取出自同一网站的一组页面,并进行 DOM 树结构的对比,删除其中的静态部分,保留动态内容作为信息提取的结果。虽然此类方法相对于上一类方法 具有较高的提取精度,且克服了对大段连续文本的依赖, 但由于网页的 DOM 树通常较深,含有大量 DOM 节点, 因此基于 DOM 结构信息的方法具有较高的时间和空间消耗。目前来说,大部分原理还是基于 DOM 节点的文本密度、标点符号密度等计算的,其准确率还是比较可观的。今天所介绍的 Readability 和 Newspaper 的库的实现原理就是类似。

    目前比较先进的是基于视觉信息的网页信息提取方法,通过浏览器接口或者内核对目标网页预渲染,然后基于网页的视觉规律提取网页数据记录。经典的 VIPS 算法首先从 DOM 树中提取出所有合适的页面区域,然后根据这些页面和分割条重新构建 Web 页面的语义结构。作为对 VIPS 的拓展,ViNT、ViPER、ViDE 也成功利用了网页的视觉特征来实现数据提取。CMDR 为通过神经网络学习多记录型页面中的特征,结合基于 DOM 结构信息的 MDR 方法,挖掘社区论坛页面的数据区域。与上述方法不同,VIBS 将图像领域的 CNN 卷积神经网络运用于网页的截图,同时通过类 VIPS 算法生成视觉块,最后结合两个阶段的结果识别网页的正文区域。另外还有最新的国内提出的 VBIE 方法,基于网页视觉的基础上改进,可以实现无监督的网页信息提取。

    以上内容主要参考自论文:《王卫红等:基于可视块的多记录型复杂网页信息提取算法》,算法可从该论文参考文献查阅。

    下面我们来介绍两个比较基础的工具包 Readability 和 Newspaper 的用法,这两个包经我测试其实准确率并不是很好,主要是让大家大致对智能解析有初步的理解。后面还会介绍一些更加强大的智能化解析算法。

    Readability

    Readability 实际上是一个算法,并不是一个针对某个语言的库。其主要原理就是计算了 DOM 的文本密度,另外根据一些常见的 DOM 属性如 id、class 等计算了一些 DOM 的权重,最后分析得到了对应的 DOM 区块,进而提取出具体的文本内容。

    现在搜索 Readability 其实已经找不到了,取而代之的是一个 JavaScript 工具包,叫做 mercury-parser,据我所知应该是 Readability 不维护了,换成了 mercury-parser。后者现在也做成了一个 Chrome 插件,大家可以下载使用一下。

    回归正题,这次主要介绍的是 Python 的 Readability 实现,现在其实有很多开源版本,本文选取的是 https://github.com/buriy/python-readability,是基于最早的 Python 版本的 Readability 库 https://github.com/timbertson/python-readability 二次开发的,现在已经发布到了 PyPi,大家可以直接下载安装使用。

    安装很简单,通过 pip 安装即可:

    pip3 install readability-lxml

    安装好了之后便可以通过导入 readability 使用了,下面我们随便从网上找一个新闻页面,比如:https://tech.163.com/19/0909/08/EOKA3CFB00097U7S.html,其页面截图如下:

    我们的目的就是它的正文、标题等内容。下面我们用 Readability 试一下,示例如下:

    import requests
    from readability import Document
    
    url = 'https://tech.163.com/19/0909/08/EOKA3CFB00097U7S.html'
    html = requests.get(url).content
    doc = Document(html)
    print('title:', doc.title())
    print('content:', doc.summary(html_partial=True))

     在这里我们直接用 requests 库对网页进行了请求,获取了其 HTML 页面内容,赋值为 html。

    然后引入了 readability 里的 Document 类,使用 html 变量对其进行初始化,然后我们分别调用了 title 方法和 summary 方法获得了其标题和正文内容。

    这里 title 方法就是获取文章标题的,summary 就是获取文章正文的,但是它获取的正文可能包含一些 HTML 标签。这个 summary 方法可以接收一个 html_partial 参数,如果设置为 True,返回的结果则不会再带有 <html><body> 标签。

    看下运行结果:

    title: 今年iPhone只有小改进?分析师:还有其他亮点_网易科技
    content: <div><div class="post_text" id="endText">           
                        <p class="otitle">
                            (原标题:Apple Bets More Cameras Can Keep iPhone Humming)
                        </p>
                        <p class="f_center"><img alt="今年iPhone只有小改进?分析师:还有其他亮点" src="http://cms-bucket.ws.126.net/2019/09/09/d65ba32672934045a5bfadd27f704bc1.jpeg"/><span>图示:苹果首席执行官蒂姆·库克(Tim Cook)在6月份举行的苹果全球开发者大会上。</span></p><p>网易科技讯 9月9日消息,据国外媒体报道,和过去的12个年头一样,新款
    ... 中间省略 ...
                        <p>苹果还即将推出包括电视节目和视频游戏等内容的新订阅服务。分析师表示,该公司最早可能在本周宣布TV+和Arcade等服务的价格和上线时间。</p><p>Strategy Analytics的尼尔·莫斯顿(Neil Mawston)表示,可穿戴设备和服务的结合将是苹果业务超越iPhone的关键。他说,上一家手机巨头诺基亚公司在试图进行类似业务转型时就陷入了困境之中。(辰辰)</p><p><b>相关报道:</b></p><p><a href="https://tech.163.com/19/0908/09/EOHS53RK000999LD.html" target="_self" urlmacroreplace="false">iPhone 11背部苹果Logo改为居中:为反向无线充电</a></p><p><a href="https://tech.163.com/19/0907/08/EOF60CBC00097U7S.html" target="_self" urlmacroreplace="false">2019年新iPhone传言汇总,你觉得哪些能成真</a>  </p><p/>
                            <p/>
                            <div class="ep-source cDGray">
                                <span class="left"><a href="http://tech.163.com/"><img src="https://static.ws.126.net/cnews/css13/img/end_tech.png" alt="王凤枝" class="icon"/></a> 本文来源:网易科技报道  </span>
                                <span class="ep-editor">责任编辑:王凤枝_NT2541</span>
                            </div>
                    </div> 
    </div>

    可以看到,标题提取是正确的。正文其实也是正确的,不过这里还包含了一些 HTML 标签,比如 <img><p> 等,我们可以进一步通过一些解析库来解析。

    看下源码吧,比如提取标题的方法:

    def normalize_entities(cur_title):
        entities = {
            u'\u2014':'-',
            u'\u2013':'-',
            u'&mdash;': '-',
            u'&ndash;': '-',
            u'\u00A0': ' ',
            u'\u00AB': '"',
            u'\u00BB': '"',
            u'&quot;': '"',
        }
        for c, r in entities.items():
            if c in cur_title:
                cur_title = cur_title.replace(c, r)
    
        return cur_title
    
    def norm_title(title):
        return normalize_entities(normalize_spaces(title))
    
    def get_title(doc):
        title = doc.find('.//title')
        if title is None or title.text is None or len(title.text) == 0:
            return '[no-title]'
    
        return norm_title(title.text)
    
     def title(self):
        """Returns document title"""
        return get_title(self._html(True))

    title 方法实际上就是调用了一个 get_title 方法,它怎么做的?实际上就是用了一个 XPath 只解析了 <title> 标签里面的内容,别的没了。如果没有,那就返回 [no-title]

    def summary(self, html_partial=False):
        ruthless = True
        while True:
            self._html(True)
            for i in self.tags(self.html, 'script', 'style'):
                i.drop_tree()
            for i in self.tags(self.html, 'body'):
                i.set('id', 'readabilityBody')
            if ruthless:
                self.remove_unlikely_candidates()
            self.transform_misused_divs_into_paragraphs()
            candidates = self.score_paragraphs()
    
            best_candidate = self.select_best_candidate(candidates)
    
            if best_candidate:
                article = self.get_article(candidates, best_candidate,
                                           html_partial=html_partial)
            else:
                if ruthless:
                    ruthless = False
                    continue
                else:
                    article = self.html.find('body')
                    if article is None:
                        article = self.html
            cleaned_article = self.sanitize(article, candidates)
            article_length = len(cleaned_article or '')
            retry_length = self.retry_length
            of_acceptable_length = article_length >= retry_length
            if ruthless and not of_acceptable_length:
                ruthless = False
                continue
            else:
                return cleaned_article

    这里我删除了一些冗余的调试的代码,只保留了核心的代码,其核心实现就是先去除一些干扰内容,然后找出一些疑似正文的 candidates,然后再去寻找最佳匹配的 candidates 最后提取其内容返回即可。

    然后再找到获取 candidates 方法里面的 score_paragraphs 方法,又追踪到一个 score_node 方法,就是为每一个节点打分的,其实现如下:

    def score_node(self, elem):
        content_score = self.class_weight(elem)
        name = elem.tag.lower()
        if name in ["div", "article"]:
            content_score += 5
        elif name in ["pre", "td", "blockquote"]:
            content_score += 3
        elif name in ["address", "ol", "ul", "dl", "dd", "dt", "li", "form", "aside"]:
            content_score -= 3
        elif name in ["h1", "h2", "h3", "h4", "h5", "h6", "th", "header", "footer", "nav"]:
            content_score -= 5
        return {
            'content_score': content_score,
            'elem': elem
        }

    这什么意思呢?你看如果这个节点标签是 div 或者 article 等可能表征正文区块的话,就加 5 分,如果是 aside 等表示侧栏的内容就减 3 分。这些打分也没有什么非常标准的依据,可能是根据经验累积的规则。

    另外还有一些方法里面引用了一些正则匹配来进行打分或者替换,其定义如下:

    REGEXES = {
        'unlikelyCandidatesRe': re.compile('combx|comment|community|disqus|extra|foot|header|menu|remark|rss|shoutbox|sidebar|sponsor|ad-break|agegate|pagination|pager|popup|tweet|twitter', re.I),
        'okMaybeItsACandidateRe': re.compile('and|article|body|column|main|shadow', re.I),
        'positiveRe': re.compile('article|body|content|entry|hentry|main|page|pagination|post|text|blog|story', re.I),
        'negativeRe': re.compile('combx|comment|com-|contact|foot|footer|footnote|masthead|media|meta|outbrain|promo|related|scroll|shoutbox|sidebar|sponsor|shopping|tags|tool|widget', re.I),
        'divToPElementsRe': re.compile('<(a|blockquote|dl|div|img|ol|p|pre|table|ul)', re.I),
        #'replaceBrsRe': re.compile('(<br[^>]*>[ \n\r\t]*){2,}',re.I),
        #'replaceFontsRe': re.compile('<(\/?)font[^>]*>',re.I),
        #'trimRe': re.compile('^\s+|\s+$/'),
        #'normalizeRe': re.compile('\s{2,}/'),
        #'killBreaksRe': re.compile('(<br\s*\/?>(\s|&nbsp;?)*){1,}/'),
        'videoRe': re.compile('https?:\/\/(www\.)?(youtube|vimeo)\.com', re.I),
        #skipFootnoteLink:      /^\s*(\[?[a-z0-9]{1,2}\]?|^|edit|citation needed)\s*$/i,
    }

    比如这里定义了 unlikelyCandidatesRe,就是不像 candidates 的 pattern,比如 foot、comment 等等,碰到这样的标签或 pattern 的话,在计算分数的时候都会减分,另外还有其他的 positiveRe、negativeRe 也是一样的原理,分别对匹配到的内容进行加分或者减分。

    这就是 Readability 的原理,是基于一些规则匹配的打分模型,很多规则其实来源于经验的累积,分数的计算规则应该也是不断地调优得出来的。

    另外其他的就没了,Readability 并没有提供提取时间、作者的方法,另外此种方法的准确率也是有限的,但多少还是省去了一些人工成本。

    Newspaper

    另外还有一个智能解析的库,叫做 Newspaper,提供的功能更强一些,但是准确率上个人感觉和 Readability 差不太多。

    这个库分为 Python2 和 Python3 两个版本,Python2 下的版本叫做 newspaper,Python3 下的版本叫做 newspaper3k,这里我们使用 Python3 版本来进行测试。

    其 GitHub 地址是:https://github.com/codelucas/newspaper,官方文档地址是:https://newspaper.readthedocs.io。

    在安装之前需要安装一些依赖库,可以参考官方的说明:https://github.com/codelucas/newspaper#get-it-now。

    安装好必要的依赖库之后,就可以使用 pip 安装了:

    pip3 install newspaper3k

    安装成功之后便可以导入使用了。

    下面我们先用官方提供的实例来过一遍它的用法,官方提供的示例是使用了这个链接:https://fox13now.com/2013/12/30/new-year-new-laws-obamacare-pot-guns-and-drones/,其页面截图如下:

    官方示例

    下面用一个实例来感受一下:

    from newspaper import Article
    
    url = 'https://fox13now.com/2013/12/30/new-year-new-laws-obamacare-pot-guns-and-drones/'
    article = Article(url)
    article.download()
    # print('html:', article.html)
    
    article.parse()
    print('authors:', article.authors)
    print('date:', article.publish_date)
    print('text:', article.text)
    print('top image:', article.top_image)
    print('movies:', article.movies)
    
    article.nlp()
    print('keywords:', article.keywords)
    print('summary:', article.summary)

     

    这里从 newspaper 库里面先导入了 Article 这个类,然后直接传入 url 即可,首先需要调用它的 download 方法,将网页爬取下来,否则直接进行解析会抛出错误的。

    但我总感觉这个设计挺不友好的,parse 方法不能判断下,如果没执行 download 就自动执行 download 方法吗?如果不 download 其他的不什么都干不了吗?

    好的,然后我们再执行 parse 方法进行网页的智能解析,这个功能就比较全了,能解析 authors、publish_date、text 等等,除了正文还能解析作者、发布时间等等。

    另外这个库还提供了一些 NLP 的方法,比如获取关键词、获取文本摘要等等,在使用前需要先执行以下 nlp 方法。

    最后运行结果如下:

    authors: ['Cnn Wire']
    date: 2013-12-30 00:00:00
    text: By Leigh Ann Caldwell
    
    WASHINGTON (CNN) — Not everyone subscribes to a New Year’s resolution, but Americans will be required to follow new laws in 2014.
    
    Some 40,000 measures taking effect range from sweeping, national mandates under Obamacare to marijuana legalization in Colorado, drone prohibition in Illinois and transgender protections in California.
    
    Although many new laws are controversial, they made it through legislatures, public referendum or city councils and represent the shifting composition of American beliefs.
    ...
    ...
    Colorado: Marijuana becomes legal in the state for buyers over 21 at a licensed retail dispensary.
    
    (Sourcing: much of this list was obtained from the National Conference of State Legislatures).
    top image: https://localtvkstu.files.wordpress.com/2012/04/national-news-e1486938949489.jpg?quality=85&strip=all
    movies: []
    keywords: ['drones', 'national', 'guns', 'wage', 'law', 'pot', 'leave', 'family', 'states', 'state', 'latest', 'obamacare', 'minimum', 'laws']
    summary: Oregon: Family leave in Oregon has been expanded to allow eligible employees two weeks of paid leave to handle the death of a family member.
    Arkansas: The state becomes the latest state requiring voters show a picture ID at the voting booth.
    Minimum wage and former felon employmentWorkers in 13 states and four cities will see increases to the minimum wage.
    New Jersey residents voted to raise the state’s minimum wage by $1 to $8.25 per hour.
    California is also raising its minimum wage to $9 per hour, but workers must wait until July to see the addition.

    这里省略了一些输出结果。

    可以看到作者、日期、正文、关键词、标签、缩略图等信息都被打印出来了,还算是不错的。

    但这个毕竟是官方的实例,肯定是好的,我们再测试一下刚才的例子,看看效果如何,网址还是:https://tech.163.com/19/0909/08/EOKA3CFB00097U7S.html,改写代码如下:

    from newspaper import Article
    
    url = 'https://tech.163.com/19/0909/08/EOKA3CFB00097U7S.html'
    article = Article(url, language='zh')
    article.download()
    # print('html:', article.html)
    
    article.parse()
    print('authors:', article.authors)
    print('title:', article.title)
    print('date:', article.publish_date)
    print('text:', article.text)
    print('top image:', article.top_image)
    print('movies:', article.movies)
    
    article.nlp()
    print('keywords:', article.keywords)
    print('summary:', article.summary)

    这里我们将链接换成了新闻的链接,另外在 Article 初始化的时候还加了一个参数 language,其值为 zh,代表中文。

    然后我们看下运行结果:

    Building prefix dict from /usr/local/lib/python3.7/site-packages/jieba/dict.txt ...
    Dumping model to file cache /var/folders/1g/l2xlw12x6rncs2p9kh5swpmw0000gn/T/jieba.cache
    Loading model cost 1.7178938388824463 seconds.
    Prefix dict has been built succesfully.
    authors: []
    title: 今年iPhone只有小改进?分析师:还有其他亮点
    date: 2019-09-09 08:10:26+08:00
    text: (原标题:Apple Bets More Cameras Can Keep iPhone Humming)
    
    图示:苹果首席执行官蒂姆·库克(Tim Cook)在6月份举行的苹果全球开发者大会上。
    
    网易科技讯 9月9日消息,据国外媒体报道,和过去的12个年头一样,新款iPhone将成为苹果公司本周所举行年度宣传活动的主角。但人们的注意力正转向需要推动增长的其他苹果产品和服务。
    ...
    ...
    Strategy Analytics的尼尔·莫斯顿(Neil Mawston)表示,可穿戴设备和服务的结合将是苹果业务超越iPhone的关键。他说,上一家手机巨头诺基亚公司在试图进行类似业务转型时就陷入了困境之中。(辰辰)
    
    相关报道:
    
    iPhone 11背部苹果Logo改为居中:为反向无线充电
    
    2019年新iPhone传言汇总,你觉得哪些能成真
    top image: https://www.163.com/favicon.ico
    movies: []
    keywords: ['trust高级投资组合经理丹摩根dan', 'iphone', 'mawston表示可穿戴设备和服务的结合将是苹果业务超越iphone的关键他说上一家手机巨头诺基亚公司在试图进行类似业务转型时就陷入了困境之中辰辰相关报道iphone', 'xs的销售疲软状况迫使苹果在1月份下调了业绩预期这是逾15年来的第一次据贸易公司susquehanna', 'xs机型发布后那种令人失望的业绩重演iphone', '今年iphone只有小改进分析师还有其他亮点', 'more', 'xr和iphone', 'morgan说他们现在没有任何真正深入的进展只是想继续让iphone这款业务继续转下去他乐观地认为今年发布的新款手机将有足够多的新功能为一个非常成熟的产品增加额外的功能让火车继续前进这种仅限于此的态度说明了苹果自2007年发布首款iphone以来所面临的挑战iphone销售占苹果公司总营收的一半以上这让苹果陷入了一个尴尬的境地既要维持核心产品的销量另一方面又需要减少对它的依赖瑞银ubs今年5月份对8000名智能手机用户进行了相关调查其发布的年度全球调查报告显示最近iphone在人脸识别技术等方面的进步并没有引起一些消费者的共鸣他们基本上都认为苹果产品没有过去几年那么独特或者惊艳品牌也没有过去几年那么有吸引力很多人使用老款手机的时间更长自己认为也没有必要升级到平均售价949美元的新款iphone苹果需要在明年销售足够多的iphone以避免像去年9月份iphone', 'keep', '原标题apple']
    summary: (原标题:Apple Bets More Cameras Can Keep iPhone Humming)图示:苹果首席执行官蒂姆·库克(Tim Cook)在6月份举行的苹果全球开发者大会上。网易科技讯 9月9日消息,据国外媒体报道,和过去的12个年头一样,新款iPhone将成为苹果公司本周所举行...亚公司在试图进行类似业务转型时就陷入了困境之中。(辰辰)相关报道:iPhone 11背部苹果Logo改为居中:为反向无线充电2019年新iPhone传言汇总,你觉得哪些能成真

    中间正文很长省略了一部分,可以看到运行时首先加载了一些中文的库包,比如 jieba 所依赖的词表等等。

    解析结果中,日期的确是解析对了,因为这个日期格式的的确比较规整,但这里还自动给我们加了东八区的时区,贴心了。作者没有提取出来,可能是没匹配到 来源 两个字吧,或者词库里面没有,标题、正文的提取还算比较正确,也或许这个案例的确是比较简单。

    另外对于 NLP 部分,获取的关键词比较迷,长度有点太长了。summary 也有点冗余。

    另外 Newspaper 还提供了一个较为强大的功能,就是 build 构建信息源。官方的介绍其功能就是构建一个新闻源,可以根据传入的 URL 来提取相关文章、分类、RSS 订阅信息等等。

    我们用实例感受一下:

    import newspaper
    
    source = newspaper.build('http://www.sina.com.cn/', language='zh')
    for category in source.category_urls():
        print(category)
    
    for article in source.articles:
        print(article.url)
        print(article.title)
    
    for feed_url in source.feed_urls():
        print(feed_url)

    在这里我们传入了新浪的官网,调用了 build 方法,构建了一个 source,然后输出了相关的分类、文章、RSS 订阅等内容,运行结果如下:

    http://cul.news.sina.com.cn
    http://www.sina.com.cn/
    http://sc.sina.com.cn
    http://jiangsu.sina.com.cn
    http://gif.sina.com.cn
    ....
    http://tj.sina.com.cn
    http://travel.sina.com.cn
    http://jiaoyi.sina.com.cn
    http://cul.sina.com.cn
    https://finance.sina.com.cn/roll/2019-06-12/doc-ihvhiqay5022316.shtml 
    经参头版:激发微观主体活力加速国企改革
    http://eladies.sina.com.cn/feel/xinli/2018-01-25/0722/doc-ifyqwiqk0463751.shtml 
    我们别再联系了
    http://finance.sina.com.cn/roll/2018-05-13/doc-ihamfahx2958233.shtml 
    新违约时代到来!违约“常态化”下的市场出清与换血
    http://sports.sina.com.cn/basketball/2019worldcup/2019-09-08/doc-iicezzrq4390554.shtml 
    罗健儿26分韩国收首胜
    ...
    http://travel.sina.com.cn/outbound/pages/2019-09-05/detail-iicezzrq3622449.shtml 
    菲律宾海滨大道 夜晚让人迷离
    http://travel.sina.com.cn/outbound/pages/2016-08-19/detail-ifxvcnrv0334779.shtml  
    关岛 用双脚尽情享受阳光与海滩
    http://travel.sina.com.cn/domestic/pages/2019-09-04/detail-iicezzrq3325092.shtml 
    秋行查干浩特草原
    http://travel.sina.com.cn/outbound/pages/2019-09-03/detail-iicezueu3050710.shtml 
    白羊座的土豪之城迪拜
    http://travel.sina.com.cn/video/baidang/2019-08-29/detail-ihytcitn2747327.shtml 
    肯辛顿宫藏着维多利亚的秘密
    http://cd.auto.sina.com.cn/bdcs/2017-08-15/detail-ifyixias1051586.shtml 

    可以看到它输出了非常多的类别链接,另外还有很多文章列表,由于没有 RSS 订阅内容,这里没有显示。

    下面把站点换成我的博客:https://cuiqingcai.com,博客截图如下:

    博客截图

    看看运行结果:

    https://cuiqingcai.com
    https://cuiqingcai.com
    

    似乎不太行啊,一篇文章都没有,RSS 也没有,可见其功能还有待优化。

    Newspaper 的基本用法介绍到这里,更加详细的用法可以参考官方文档:https://newspaper.readthedocs.io。个人感觉其中的智能解析可以用用,不过据我的个人经验,感觉还是很多解析不对或者解析不全的,

    以上便是 Readability 和 Newspaper 的介绍。

    其他方案

    另外除了这两个库其实还有一些比较优秀的算法,由于我们处理的大多为中文文档,所以一些在中文上面的研究是比较有效的,在这里列几个值得借鉴的中文论文供大家参考:

    • 洪鸿辉等,基于文本及符号密度的网页正文提取方法

    • 梁东等,基于支持向量机的网页正文内容提取方法

    • 王卫红等,基于可视块的多记录型复杂网页信息提取算法

    今天还看到一位大佬「青南」根据上面第一篇论文所实现的 GeneralNewsExtractor,GitHub 地址为:https://github.com/kingname/GeneralNewsExtractor,经测试准确率还不错,比 Readability 和 Newspaper 的解析效果要好。我也跟作者进行了交流,后续可能还会基于其他的 Feature 或依赖于视觉化的方法进行优化,大家可以关注下,谢谢!

    作者:华为云享专家 崔庆才

     

    展开全文
  • 首先在获取具体新闻的资源地址的时候,我是用的requests来做的,遇到了如下错误: requests.exceptions.SSLError: HTTPSConnectionPool(host=‘med.sina.com’, port=443): Max retries exceeded with url: /...

    今天在写一个爬取新闻的爬虫时,遇到了SSLError。首先在获取具体新闻的资源地址的时候,我是用的requests库来做的,遇到了如下错误:

    requests.exceptions.SSLError: HTTPSConnectionPool(host=‘med.sina.com’, port=443): Max retries exceeded with url: /article_list_-1_1_1_3804.html (Caused by SSLError(SSLError(“bad handshake: Error([(‘SSL routines’, ‘tls_process_server_certificate’, ‘certificate verify failed’)])”)))

    在我求助百度之后,得知只要在请求时加一个参数verify=False,意思是不验证CA证书,代码如下。

    request.get(url=url,verify=False)
    

    此时它会报一个warning如下:

    InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
    InsecureRequestWarning)

    如果不想显示这个warining可以在代码最开始加以下代码:

    # 关掉 不验证CA证书的风险提醒
    requests.packages.urllib3.disable_warnings()
    

    此时,写完代码准备开跑的我发现在调用第三方库newspaper里的Aritcle类里的download()方法时,又报了刚刚相同的错误。查了下资料,nespaper底层也是依赖requests的。那这就好办了,查看源码,找到调用requests的方法,重写这个方法,代码如下:

    from newspaper import Article, network
    from newspaper import Config
    # 重写newspaper里的Article类,解决requests 的 ssl error
    class MyArticle(Article):
    
        @staticmethod
        def send_request(url, config=None, response=None):
            """Consolidated logic for http requests from newspaper. We handle error cases:
            - Attempt to find encoding of the html by using HTTP header. Fallback to
              'ISO-8859-1' if not provided.
            - Error out if a non 2XX HTTP response code is returned.
            """
            config = config or Configuration()
            useragent = config.browser_user_agent
            timeout = config.request_timeout
            proxies = config.proxies
            headers = config.headers
    
            if response is not None:
                return _get_html_from_response(response)
    
            response = requests.get(
                url=url, **get_request_kwargs(timeout, useragent, proxies, headers), verify=False)
    
            html = _get_html_from_response(response)
    
            if config.http_success_only:
                # fail if HTTP sends a non 2XX response
                response.raise_for_status()
    
            return html
    
        def download(self, input_html=None, title=None, recursion_counter=0):
            """Downloads the link's HTML content, don't use if you are batch async
            downloading articles
    
            recursion_counter (currently 1) stops refreshes that are potentially
            infinite
            """
            if input_html is None:
                try:
                    html = self.send_request(self.url, self.config)
                except requests.exceptions.RequestException as e:
                    self.download_state = ArticleDownloadState.FAILED_RESPONSE
                    self.download_exception_msg = str(e)
                    # log.debug('Download failed on URL %s because of %s' %
                    #           (self.url, self.download_exception_msg))
                    return
            else:
                html = input_html
    
            if self.config.follow_meta_refresh:
                meta_refresh_url = extract_meta_refresh(html)
                if meta_refresh_url and recursion_counter < 1:
                    return self.download(
                        input_html=network.get_html(meta_refresh_url),
                        recursion_counter=recursion_counter + 1)
    
            self.set_html(html)
            self.set_title(title)
    
    
    

    写完手工!!!

    展开全文
  • by 程序员野客1 简介newspaper 框架是一个主要用来提取新闻内容及分析的 Python 爬虫框架,更确切的说,newspaper 是一个 Python ,但这个由第三方开发。newspaper 主要具有如下几个特点:比较简洁速度较快支持...
  • 一、框架介绍Newspaper是一个python3,但是Newspaper框架并不适用于实际工程类新闻信息爬取工作,框架不稳定,爬取过程中会有各种bug,例如获取不到url、新闻信息等,但对于想获取一些新闻语料的朋友不妨一试,简单...
  • 还在辛辛苦苦的查找网页规律,写正则或者其他方式去匹配文本内容吗?...这就是今天给大家介绍的库,newspaper库! newspaper python3.x安装: pip install newspaper3k python2.7安装: pip install news...
  • :newspaper: :fire: 该存储包含应用程序的REST API。 :sparkles: :fire: 产品特点 :newspaper: 在我们的应用程序中编写和编辑您的代码。 :sparkles: 进行测验以改善您的DSA基础知识。 :rocket: 使用我们...
  • Newspaper是目前国外销量排名第一的新闻杂志类Wordpress主题,此主题中文汉化版升级到了最新版本V8.8,新版本改进挺大的,把原来的多功能插件集成到了TC编辑器插件中,添加了一些新的功能和选项,有需要的可以更新到...
  • Newspaper3k框架:文章的抓取和管理

    千次阅读 2018-12-16 10:11:01
    Newspaper是一个python3。 注:Newspaper框架并不适用于实际工程类新闻信息爬取工作,框架不稳定,爬取过程中会有各种bug,例如获取不到url、新闻信息等,但对于想获取一些新闻语料的朋友不妨一试,简单方便易...
  • Newspaper可以用来提取新闻、文章和内容分析。使用多线程,支持10多种语言等。 作者从requests的简洁与强大得到灵感,使用python开发的可用于提取文章内容的程序。
  • 思路 ...通过newspaper库提取相应的文本内容,关于newspaper库的使用方法可以参考这里 代码 # -*- coding: utf-8 -*- # !/usr/bin/env python # Time: 2019/5/9 18:57 # Author: sty # Fil...
  • 引入库2.newspaper库使用3.获取下一个新闻的链接三、完整代码四、参考 前言 网络爬虫方法形形色色,咱们今天搞点简单的,使用newspaper第三方库直接爬取,当然其中也遇到一些问题,毕竟每个新闻网站的结果略有不用...
  • 此存储包含生成我的个人RSS feed的代码。 它托管在。 该代码本身不是通用的,并且对于我的用例而言是个性化的,但是它可能会成为有趣的灵感。 我还。 它是如何工作的? 建立网站 RSS提要由脚本生成。 它: 存储...
  • breakfast 657 afternoon 655 clothes 652 bedroom 646 dad 646 girl 645 ...newspaper 641 water 641 big 640 canada 638 bed 636 comes 636 try 636 night 636 sun 635 paper 635 notice 634 larg
  • 最近三月份沉迷于股票操作,基友打球又催的慌 结果!...scrapy,newspaper一类的框架和肯定是要了解的; urllib,多线程等也是必备的; 爬虫类型: 通用网络爬虫(全网爬虫,性能要求高...
  • :newspaper: 布局 在Figma中开发并实现 :globe_with_meridians: 技术: ... :blue_book: : 下一步 React.JS 感慨 :warning_selector: 错误: :warning_selector: 开发中 :crystal_ball: 未来的实现 一个...
  • 最近三月份沉迷于股票操作...先总结了一下:scrapy,newspaper一类的框架和肯定是要了解的;urllib,多线程等也是必备的;爬虫类型:通用网络爬虫(全网爬虫,性能要求高)聚焦网络爬虫(特定信息,特定人群服务...
  • pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple newspaper3k --trusted-host=pypi.tuna.tsinghua.edu.cn --trusted-host=files.pythonhosted.org pip3 install -i ...
  • 嗨,我是Lhamu :waving_hand: 我是数据科学家和终身学习者! :thinking_face: :magnifying_glass_tilted_right: :open_book: ... :rolled-up_newspaper: 最新博客文章 :large_blue_diamond: :hig
  • 因为课业要求,搭建一个简单的搜索引擎,找了一些...页面中文文章内容的爬取用了newspaper3k这个包(如果页面里面文章字数过多,需要设置一下超时时间,不然会报错)defarticle(url):try:a=Article(url,language="zh")...
  • <p>I have been tasked with overlaying a photo on to a newspaper-esque image where the photo is of a person and they are meant to be the photo on the front of a newspaper. <p>I used codeigniter image ...
  • :newspaper: 通过使用JavaScript编写并由GitHub Actions Service执行的脚本在 Trending 上获取每日趋势存储信息。 技术领域 检查文件以获取更多信息。 执照 根据麻省理工学院(MIT)许可授权,版权所有:copyright...

空空如也

空空如也

1 2 3 4
收藏数 68
精华内容 27
关键字:

newspaper库