zoukankan      html  css  js  c++  java
  • python3.6 使用newspaper库的Article包来快速抓取网页的文章或者新闻等正文

    我主要是用了两个方法来抽去正文内容,第一个方法,诸如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)+' ')
    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文件

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

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

    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] + ' ')
    out_data.write(data[1] + ' ')
    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)
    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就可以了
    ---------------------
    作者:lijiaqi0612
    来源:CSDN
    原文:https://blog.csdn.net/lijiaqi0612/article/details/81707128
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    小短文1-判别法浅谈
    高等代数半期考试
    让CNN跑起来,以下是调参的所有秘密
    杂谈
    自适应中值滤波器
    用色调,饱和度,亮度表示颜色
    用类处理彩色图像
    操作像素
    机器学习前言
    直方图均衡化
  • 原文地址:https://www.cnblogs.com/lixiaosong914/p/9836413.html
Copyright © 2011-2022 走看看