zoukankan      html  css  js  c++  java
  • 数据结构化与保存

    
    

    1. 将新闻的正文内容保存到文本文件。

    
    

    2. 将新闻数据结构化为字典的列表:

    
    
    • 单条新闻的详情-->字典news
    • 一个列表页所有单条新闻汇总-->列表newsls.append(news)
    • 所有列表页的所有新闻汇总列表newstotal.extend(newsls)
    
    

    3. 安装pandas,用pandas.DataFrame(newstotal),创建一个DataFrame对象df.

    
    

    4. 通过df将提取的数据保存到csv或excel 文件。


    import
    requests from bs4 import BeautifulSoup from datetime import datetime import re import pandas # 将新闻的正文内容保存到文本文件。 def writeNewsDetail(content): f = open('gzccNews.txt', 'a',encoding='utf-8') f.write(content) f.close() #一篇新闻的点击次数 def getClickCount(newsUrl): newId = re.search('\_(.*).html', newsUrl).group(1).split('/')[1] clickUrl = "http://oa.gzcc.cn/api.php?op=count&id={}&modelid=80".format(newId) return (int(requests.get(clickUrl).text.split('.html')[-1].lstrip("('").rstrip("');"))) #一篇新闻的全部信息 def getNewsDetail(newsUrl): resd = requests.get(newsUrl) resd.encoding = 'utf-8' soupd = BeautifulSoup(resd.text, 'html.parser') # 打开新闻详情页并解析 news ={} news['title'] = soupd.select('.show-title')[0].text info = soupd.select('.show-info')[0].text news['dt'] = datetime.strptime(info.lstrip('发布时间:')[0:19], '%Y-%m-%d %H:%M:%S') if info.find('来源:') > 0: # 来源: news['source'] = info[info.find('来源:'):].split()[0].lstrip('来源:') else: news['source'] = 'none' if info.find('作者:') > 0: # 作者: news['author'] = info[info.find('作者:'):].split()[0].lstrip('作者:') else: news['author'] = 'none' if info.find('摄影:') > 0: # 摄影: news['photograph'] = info[info.find('摄影:'):].split()[0].lstrip('摄影:') else: news['photograph'] = 'none' if info.find('审核:') > 0: # 审核: news['auditing'] = info[info.find('审核:'):].split()[0].lstrip('审核:') else: news['auditing'] = 'none' news['content'] = soupd.select('.show-content')[0].text.strip() writeNewsDetail(news['content']) news['click'] = getClickCount(newsUrl) news['newsUrl'] = newsUrl return(news) #一个列表页的全部新闻 def getListPage(pageUrl): res = requests.get(pageUrl) res.encoding = 'utf-8' soup = BeautifulSoup(res.text, 'html.parser') newsList = [] for news in soup.select('li'): if len(news.select('.news-list-title')) > 0: newsUrl = news.select('a')[0].attrs['href'] # 链接 newsList.append(getNewsDetail(newsUrl)) return(newsList) # 新闻列表页的总页数 def getPageN(): res = requests.get('http://news.gzcc.cn/html/xiaoyuanxinwen/') res.encoding = 'utf-8' soup = BeautifulSoup(res.text, 'html.parser') n = int(soup.select('.a1')[0].text.rstrip('')) return (n // 10 + 1) newsTotal = [] firstPageUrl = 'http://news.gzcc.cn/html/xiaoyuanxinwen/' newsTotal.extend(getListPage(firstPageUrl)) n = getPageN() for i in range(n, n+1): listPageUrl = 'http://news.gzcc.cn/html/xiaoyuanxinwen/{}.html'.format(i) newsTotal.extend(getListPage(listPageUrl)) dt =pandas.DataFrame(newsTotal) dt.to_excel("news.xlsx") print(dt)

    5. 用pandas提供的函数和方法进行数据分析:

    • 提取包含点击次数、标题、来源的前6行数据
    • 提取‘学校综合办’发布的,‘点击次数’超过3000的新闻。
    • 提取'国际学院'和'学生工作处'发布的新闻。
    # 提取包含点击次数、标题、来源的前6行数据
    print(df[['click','title','sources']].head(6))
     
    # 提取‘学校综合办’发布的,‘点击次数’超过3000的新闻。
    print(df[(df['click']>3000)&(df['sources']=='学校综合办')])
     
    # 提取'国际学院'和'学生工作处'发布的新闻。
    sou = ['国际学院','学生工作处']
    print(df[df['sources'].isin(sou)])
  • 相关阅读:
    Atitit.ati orm的设计and架构总结 适用于java c# php版
    Atitit.ati dwr的原理and设计 attilax 总结 java php 版本
    Atitit.ati dwr的原理and设计 attilax 总结 java php 版本
    Atitit. 软件设计 模式 变量 方法 命名最佳实践 vp820 attilax总结命名表大全
    Atitit. 软件设计 模式 变量 方法 命名最佳实践 vp820 attilax总结命名表大全
    Atitit 插件机制原理与设计微内核 c# java 的实现attilax总结
    Atitit 插件机制原理与设计微内核 c# java 的实现attilax总结
    atitit.基于  Commons CLI 的命令行原理与 开发
    atitit.基于  Commons CLI 的命令行原理与 开发
    atitit.js 与c# java交互html5化的原理与总结.doc
  • 原文地址:https://www.cnblogs.com/bjdx1314/p/8857335.html
Copyright © 2011-2022 走看看