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

    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)])
  • 相关阅读:
    03_线性表
    02_算法与数据结构
    01_python中内置类型的时间复杂度
    00_常见的时间复杂度
    03_docker导出和导入镜像
    09_创建mysql数据库的用户
    14_linux添加主机列表
    13_linux修改主机名
    12_centos7安装好后的网络设置
    00_使用pdb调试python代码
  • 原文地址:https://www.cnblogs.com/qq8675/p/8855975.html
Copyright © 2011-2022 走看看