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)+'\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就可以了

猜你喜欢

转载自blog.csdn.net/lijiaqi0612/article/details/81707128