python爬取百度新闻数据,python爬取新闻网站内容

大家好,本文将围绕python爬取百度新闻数据展开说明,python爬取新闻网站内容是一个很多人都想弄明白的事情,想搞清楚python爬取文章内容需要先了解以下几个事情。

Python爬取新闻信息,分词统计并画词云

中国新闻网,是知名的中文新闻门户网站,也是全球互联网中文新闻资讯最重要的原创内容供应商之一。依托中新社遍布全球的采编网络,每天24小时面向广大网民和网络媒体,快速、准确地提供文字、图片、视频等多样化的资讯服务仿写文章软件


分析页面内容:首先,打开中国新闻网的页面可以看到,导航栏里已经有很多的分类标签选项。但是,可以跳转的标签并不全是按照新闻的内容进行分类的。
首页导航栏
例如,标签中的“金融”、“汽车”和“体育”是按照内容划分,但是“国际”、“港澳”和“台湾”是按照新闻的来源地划分的。这样的划分内容并不统一。

为了将新闻按照内容分类,需要将实时发布的新闻内容提取出来,按照文本语义信息进行统一的划分。

滚动新闻页面
这里,发现在中国新闻网的滚动新闻栏目中,可以看到实时发布的最新新闻汇总。并且可以在网页中获取到实时发布的新闻分类标签新闻标题。点击链接之后,可以跳转到相应的详情页面,从而获取到更详细的内容文本。
例如:

新闻详情页面示例

分析网页源码:在滚动新闻页面源码中可以看到headers的内容。将它作为请求的请求头添加进爬虫中,可以模拟浏览器访问网站。
滚动新闻页面的headers
在终端打印出获取到的网页源码。可以看到,新闻的题目和标签可以从源码中得到。

终端输出
但是这一步得到的resp还是一个字符串,为了方便对网页内容进行解析,需要将字符串转换为网页结构化数据,方便地查找HTML标签以及其中的属性和内容。

观察到网页的HTML结构,并将上一步得到的HTML格式字符串转换为一个BeautifulSoup对象。这样就可以通过标签找到对应的内容。
源码分析

信息筛选和存储:接下来要将网页中我们需要的内容筛选出来。
注意到信息在网页中是按照类名标题时间,三个板块去展示的,存取的内容也分为这三部分。
新闻内容分析
使用 正则表达式 对获取到的字符串进行匹配。我们可以得到一个
将得到的信息放入到文本中。

滚动页面可以翻页,爬取一共10页的信息将会得到1250条新闻信息。将这些新闻信息放在字典里,存入excel表格。
存储新闻信息
注意到不同的新闻类别会有不同的数量,我们将爬取到的不同内容的新闻的标签统计如下:
不同标签的数量
可以看到,其中“国内”、“财经”和“社会”为主体的新闻发表的次数最多。还有很多内容发表的次数非常少,如“IT”、“军事”。

同时,将所有新闻标题的内容进行整合。用jieba库进行分词,用wordcloud库绘制出词云展示图:
词云图

可以看到,“中国”一词在新闻标题中出现的次数最多,其次还有“国际”、“发展”等等。

import requests
from bs4 import BeautifulSoup
import re

import xlwt

import jieba
import wordcloud

def req():
    url_head = "http://www.chinanews.com/scroll-news/"
    
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
    }

    all_news = []
    news_list = [[] for i in range(20)]
    id2tp = { }
    id = {}
    cnt = 0
    txt = " "
    for i in range(10):
        url = url_head + "news" + str(i+1) + ".html"
        resp = requests.get(url=url, headers=headers) 
        resp = resp.content.decode('utf-8', 'ignore') # 不加第二个参数ignore会报错 忽略掉一些utf编码范围外的不知名字符
        #print(resp)
        
        soup = BeautifulSoup(resp, 'html.parser')
        
        news = soup.select('body #content #content_right .content_list ul li')
        #print(news)
        for new in news:
            new = new.text
            if new == '': 
                continue

            ti = re.compile("[0-9][0-9]:[0-9][0-9]")
            date = re.compile("[0-9]{1,2}\-[0-9]{1,2}")
            #print(new)
            time = new[-10:]
            new = ti.sub('', new)
            new = date.sub('', new)
            lm = new[1:3]
            
            if len(lm.strip()) == 1:
                lm = "IT"
            bt = new.split(']')[1].replace(' ', '')
            txt = txt + " " + bt
            if lm not in id.keys():
                id[lm] = cnt
                id2tp[cnt] = lm
                cnt += 1
            all_news.append({
                "lm": lm,
                "bt": bt,
                "time": time
            })
    print(len(all_news))
    print(id)
    #print(id2tp)
    workbook = xlwt.Workbook() #注意Workbook的开头W要大写
    
    sheet1 = workbook.add_sheet('sheet1',cell_overwrite_ok=True)

    sheet1.write(0, 0, "lm")
    sheet1.write(0, 2, "bt")
    sheet1.write(0, 4, "time")
    for idx, dictionary in enumerate(all_news):
        news_list[id[dictionary["lm"]]].append(dictionary["bt"])
        sheet1.write(idx + 1, 0, dictionary["lm"])
        sheet1.write(idx + 1, 2, dictionary["bt"])
        sheet1.write(idx + 1, 4, dictionary["time"])
    workbook.save('news.xls')

    for i in range(13):
        print(id2tp[i], len(news_list[i]))

    w=wordcloud.WordCloud(width=1000, font_path='chinese.ttf', height=700, background_color='white')
    lis = jieba.lcut(txt)
    # 人为设置一些停用词
    string = " ".join(lis).replace('的', '').replace('在', '').replace('为', '').replace('是', '').replace('有', '').replace('和', '')
    print(string)
    w.generate(string)
    w.to_file("news.png")

if __name__ == "__main__":
    
    req()
    # test()
    

猜你喜欢

转载自blog.csdn.net/mynote/article/details/132611994