• 数据结构化与保存


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

    def writeNewsDetail(content):# 将新闻的正文内容保存到文本文件。
        f=open('gzccNews.txt','a',encoding='utf-8')
        f.write(content)
        f.close()
    

      

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

    • 单条新闻的详情-->字典news
    • 一个列表页所有单条新闻汇总-->列表newsls.append(news)
    • 所有列表页的所有新闻汇总列表newstotal.extend(newsls)
    • import re
      import requests
      import pandas
      from bs4 import BeautifulSoup
      from datetime import datetime
      
      def writeNewsDetail(content):# 将新闻的正文内容保存到文本文件。
          f=open('gzccNews.txt','a',encoding='utf-8')
          f.write(content)
          f.close()
      
      def getClickCount(url):
          newId=re.findall(r'\_(.*).html',url)[0][-4:]
          clickUrl = 'http://oa.gzcc.cn/api.php?op=count&id=8249&modelid=80'.format(newId)
          clickRes = requests.get(clickUrl)
          clickCount = int(re.search("hits').html('(.*)');", clickRes.text).group(1))
          return clickCount
      #将获取新闻详情的代码定义成一个函数 def getNewDetail(newsUrl):
      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:
              source = info[info.find('来源:'):].split()[0].lstrip('来源:')
          else:
              source = 'none'
          if info.find('作者:') > 0:
              source = info[info.find('作者:'):].split()[0].lstrip('作者:')
          else:
              source = 'none'
          news['content']=soupd.select('.show-content')[0].text.strip()
      
          # writeNewsDetail(content)
          news['click'] = getClickCount(newsUrl)
          news['newsUrl']=newsUrl
          return (news)
      
      def getNewsList(pageUrl):
        res=requests.get(pageUrl)
        res.encoding = 'utf-8'
        soup = BeautifulSoup(res.text, 'html.parser')
        for news in soup.select('li'):
          if len(news.select('.news-list-title'))>0:
              # print(news.select('.news-list-title'))
              #t=news.select('.news-list-title')[0].text#取标题
              #dt=news.select('.news-list-info')[0].contents[0].text#取日期
              newsUrl=news.select('a')[0].attrs['href']#取链接
              getNewsDetail(newsUrl)
              break
      
      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('#pages a')[0].text.rstrip('条'))
          return (n // 10 + 1)
          # return n
      #将新闻数据结构化为字典的列表:
      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))
      for news in newsTotal:
        print(news)
      

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

    • df = pandas.DataFrame(newsTotal)
      

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

    •   df.to_excel('gzcc456.xlsx')
      

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

      • 提取包含点击次数、标题、来源的前6行数据
      • 提取‘学校综合办’发布的,‘点击次数’超过3000的新闻。
      • 提取'国际学院'和'学生工作处'发布的新闻。
      • # 用pandas提供的函数和方法进行数据分析:
          # 提取包含点击次数、标题、来源的前6行数据
          print(df[['click', 'title', 'sources']].head(6))
        
          # 提取‘学校综合办’发布的,‘点击次数’超过3000的新闻。
          print(df[(df['click'] > 3000) & (df['sources'] == '学校综合办')])
        
          # 提取'国际学院'和'学生工作处'发布的新闻。
          sou = ['国际学院', '学生工作处']
          print(df[df['sources'].isin(sou)])
        

          

  • 相关阅读:
    「THUWC 2017」随机二分图(概率+容斥+状压dp(记忆化搜索实现))
    「THUWC 2017」在美妙的数学王国中畅游(泰勒展开+高中导数+lct)
    「PKUSC2018」神仙的游戏(border性质+NTT)
    「PKUWC2018」猎人杀(概率+容斥+分治NTT)
    [USACO19OPEN]Valleys P && JZOJ 6525【2020.4.1模拟】Valleys (并查集+平面图欧拉公式):
    iOS学习笔记32-iCloud入门
    iOS学习笔记31-从图册获取图片和视频
    iOS学习笔记30-系统服务(三)蓝牙
    iOS学习笔记29-系统服务(二)通讯录
    iOS学习笔记28-系统服务(一)短信和邮件
  • 原文地址:https://www.cnblogs.com/sewhen/p/8858027.html
Copyright © 2020-2023  润新知