数据结构化和保存
1 2 3 4 | def writeNewsDetails(contents): f = open ( 'gzccnews.txt' , 'a' , encoding = 'utf-8' ) f.write(contents) f.close() |
2. 将新闻数据结构化为字典的列表:
- 单条新闻的详情-->字典news
- 一个列表页所有单条新闻汇总-->列表newsls.append(news)
- 所有列表页的所有新闻汇总列表newstotal.extend(newsls)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | import requests from bs4 import BeautifulSoup from datetime import datetime import re import pandas import openpyxl import sqlite3 url = "http://news.gzcc.cn/html/xiaoyuanxinwen/" res = requests.get(url); res.encoding = "utf-8" soup = BeautifulSoup(res.text, "html.parser" ); def writeNewsDetails(contents): f = open ( 'gzccnews.txt' , "a" ,encoding = "utf-8" ) f.write(contents) f.close() def getClickCount(newUrl): newsId = re.findall( "\_(.*).html" ,newUrl)[ 0 ].split( "/" )[ - 1 ]; res = requests.get( "http://oa.gzcc.cn/api.php?op=count&id= {}&modelid=80" . format (newsId)) return int (res.text.split( ".html" )[ - 1 ].lstrip( "('" ).rsplit( "');" )[ 0 ]) #获取新闻详情 def getNewDetails(newsDetailUrl): detail_res = requests.get(newsDetailUrl) detail_res.encoding = "utf-8" detail_soup = BeautifulSoup(detail_res.text, "html.parser" ) news = {} news[ 'title' ] = detail_soup.select( ".show-title" )[ 0 ].text info = detail_soup.select( ".show-info" )[ 0 ].text news[ 'date_time' ] = datetime.strptime(info.lstrip( '发布时间:' )[: 19 ], "%Y-%m-%d %H:%M:%S" ) if info.find( '来源:' )> 0 : news[ 'source' ] = info[info.find( "来源:" ):].split()[ 0 ].lstrip( '来源:' ) else : news[ 'source' ] = 'none' news[ 'content' ] = detail_soup.select( "#content" )[ 0 ].text writeDetailNews(news[ 'content' ]) news[ 'click' ] = getClickCount(newsDetailUrl) return news # print(news) # 获取总页数 def getPageN(url): res = requests.get(url) res.encoding = 'utf-8' soup = BeautifulSoup(res.text, 'html.parser' ) return int (soup.select( ".a1" )[ 0 ].text.rstrip( "条" )) / / 10 + 1 # 获取新闻一页的所有信息 def getListPage(url): newsList = [] for news in soup.select( "li" ): if len (news.select( ".news-list-title" ))> 0 : #排除为空的li # time = news.select(".news-list-info")[0].contents[0].text # title = news.select(".news-list-title")[0].text # description = news.select(".news-list-description")[0].text detail_url = news.select( 'a' )[ 0 ].attrs[ 'href' ] newsList.append(getNewDetails(detail_url)) return newsList newsTotal = [] totalPageNum = getPageN(url) firstPageUrl = "http://news.gzcc.cn/html/xiaoyuanxinwen/" newsTotal.extend(getListPage(firstPageUrl)) for num in range (totalPageNum,totalPageNum + 1 ): listpageurl = "http://news.gzcc.cn/html/xiaoyuanxinwen/{}.html" . format (num) getListPage(listpageurl) print (newsTotal) |
3. 安装pandas,用pandas.DataFrame(newstotal),创建一个DataFrame对象df.
1 2 | df = pandas.DataFrame(newsTotal) print (df) |
4. 通过df将提取的数据保存到csv或excel 文件。
1 | df.to_excel( 'gzcss.xlsx' ) |
5. 用pandas提供的函数和方法进行数据分析:
- 提取包含点击次数、标题、来源的前6行数据
- 提取‘学校综合办’发布的,‘点击次数’超过3000的新闻。
- 提取'国际学院'和'学生工作处'发布的新闻。
- 进取2018年3月的新闻
1 2 3 4 5 6 7 8 9 10 | print (df[[ 'title' , 'clickCount' , 'source' ]][: 6 ]) print (df[(df[ 'clickCount' ]> 3000 )&(df[ 'source' ] = = '学校综合办' )]) sou = [ '国际学院' , '学生工作处' ] print (df[df[ 'source' ].isin(sou)]) # 进取2018年3月的新闻 df1 = df.set_index( 'time' ) print (df1[ '2018-03' ]) |
6. 保存到sqlite3数据库
import sqlite3
with sqlite3.connect('gzccnewsdb.sqlite') as db:
df3.to_sql('gzccnews05',con = db, if_exists='replace')
7. 从sqlite3读数据
with sqlite3.connect('gzccnewsdb.sqlite') as db:
df2 = pandas.read_sql_query('SELECT * FROM gzccnews05',con=db)
print(df2)
8. df保存到mysql数据库
安装SQLALchemy
安装PyMySQL
MySQL里创建数据库:create database gzccnews charset utf8;
import pymysql
from sqlalchemy import create_engine
conn = create_engine('mysql+pymysql://root:root@localhost:3306/gzccnews?charset=utf8')
pandas.io.sql.to_sql(df, 'gzccnews', con=conn, if_exists='replace')
MySQL里查看已保存了数据。(通过MySQL Client或Navicate。)
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 内存占用高分析
· .NET Core GC计划阶段(plan_phase)底层原理浅谈
· .NET开发智能桌面机器人:用.NET IoT库编写驱动控制两个屏幕
· 用纯.NET开发并制作一个智能桌面机器人:从.NET IoT入门开始
· 一个超经典 WinForm,WPF 卡死问题的终极反思
· 支付宝事故这事儿,凭什么又是程序员背锅?有没有可能是这样的...
· 在线客服系统 QPS 突破 240/秒,连接数突破 4000,日请求数接近1000万次,.NET 多
· C# 开发工具Visual Studio 介绍
· 在 Windows 10 上实现免密码 SSH 登录
· C#中如何使用异步编程