1. 将新闻的正文内容保存到文本文件。
2. 将新闻数据结构化为字典的列表:
- 单条新闻的详情-->字典news
- 一个列表页所有单条新闻汇总-->列表newsls.append(news)
- 所有列表页的所有新闻汇总列表newstotal.extend(newsls)
3. 安装pandas,用pandas.DataFrame(newstotal),创建一个DataFrame对象df.
4. 通过df将提取的数据保存到csv或excel 文件。
5. 用pandas提供的函数和方法进行数据分析:
- 提取包含点击次数、标题、来源的前6行数据
- 提取‘学校综合办’发布的,‘点击次数’超过3000的新闻。
- 提取'国际学院'和'学生工作处'发布的新闻。
# -*- coding: UTF-8 -*-# -*- import requests import re import pandas import locale locale=locale.setlocale(locale.LC_CTYPE, 'chinese') from bs4 import BeautifulSoup from datetime import datetime url = "http://news.gzcc.cn/html/xiaoyuanxinwen/" res = requests.get(url) res.encoding = 'utf-8' soup = BeautifulSoup(res.text, 'html.parser') 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) clickUrl = "http://oa.gzcc.cn/api.php?op=count&id=9183&modelid=80".format(newId) return (int(requests.get(clickUrl).text.split('.html')[-1].lstrip("('").rstrip("');"))) #一篇新闻的详情 def getNewDetail(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 t = soupd.select('.show-info')[0].text[0:24].lstrip('发布时间:') news['dt'] = datetime.strptime(t, '%Y-%m-%d %H:%M:%S') if info.find('来源') > 0: news['source']=info[info.find('来源:'):].split()[0].lstrip('来源:') else: news['source']='none' news['content']= soupd.select('#content')[0].text.strip() writeNewsDetail(news['content']) news['click']=getClickCount(newsUrl) news['newsUrl']=newsUrl # print(news) # print(news['source']) return (news) # print(dt,title,newsUrl,source,click) #一个分页的全部新闻 def getListPage(ListPageUrl): res = requests.get(ListPageUrl) res.encoding = 'utf-8' soupd = BeautifulSoup(res.text, 'html.parser') newsList=[] for news in soup.select('li'): # print(news) if len(news.select('.news-list-title')) > 0: # t1 = news.select('.news-list-title')[0].text # d1 = news.select('.news-list-description')[0].text a = news.select('a')[0].attrs['href'] newsList.append(getNewDetail(a)) return(newsList) # 算出总页 def getPageN(): resn = requests.get(url) resn.encoding = 'utf-8' soupn = BeautifulSoup(resn.text, 'html.parser') n=int(soupn.select('.a1')[0].text.rstrip('条'))//10+1 return(n) newsTotal=[] firstPageUrl = 'http://news.gzcc.cn/html/xiaoyuanxinwen/' # getListPage(firstPageUrl) newsTotal.extend(getListPage(firstPageUrl)) # 输出总页 for i in range(2, 3): ListpageUrl='http://news.gzcc.cn/html/xiaoyuanxinwen/{}.html'.format(i) newsTotal.extend(getListPage(ListpageUrl)) print(newsTotal) df=pandas.DataFrame(newsTotal) # print(df) df.to_excel( "123.xlsx") # df.to_csv(gzccNews.csv) # print(df.dtypes ) #查看不同列数据类型 # print(df.head() ) #查看前几行数据类型 # print(df.tail(3) ) #查看后几行数据类型 # print(df.index) # print(df.columns) # print(df.values) # print(df[1:7]) print(df.head(6)) print(df[(df['click']>3000)&(df['source']=='学校综合办')]) sou=['国际学院','学生工作处'] print(df[df['source'].isin(sou)])