标签:etl 文件中 读数 index count end date head attr
import requests
from bs4 import BeautifulSoup
from datetime import datetime
import re
import pandas
import sqlite3
import pymysql
from sqlalchemy import create_engine
#获取点击次数
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)
clickStr = requests.get(clickUrl).text
count = re.search("hits‘\).html\(‘(.*)‘\);", clickStr).group(1)
return count
#获取新闻详情
def getNewsDetail(newsurl):
resd=requests.get(newsurl)
resd.encoding=‘utf-8‘
soupd=BeautifulSoup(resd.text,‘html.parser‘)
# 2.将新闻数据结构化为字典的列表:
news={}
news[‘title‘]=soupd.select(‘.show-title‘)[0].text
#news[‘newsurl‘]=newsurl
info=soupd.select(‘.show-info‘)[0].text
news[‘dt‘]=datetime.strptime(info.lstrip(‘发布时间:‘)[0:19],‘%Y-%m-%d %H:%M:%S‘)
news[‘click‘] = int(getClickCount(newsurl))
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‘
# news[‘content‘]=soupd.select(‘.show-content‘)[0].text.strip()
#获取文章内容并写入到文件中
content=soupd.select(‘.show-content‘)[0].text.strip()
writeNewsContent(content)
return news
def getListPage(listPageUrl):
res=requests.get(listPageUrl)
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:
a=news.select(‘a‘)[0].attrs[‘href‘]
newsList.append(getNewsDetail(a))
return (newsList)
#1.将新闻的正文内容保存到文本文件。
def writeNewsContent(content):
f=open(‘gzccNews.txt‘,‘a‘,encoding=‘utf-8‘)
f.write(content)
f.close()
def getPageNumber():
ListPageUrl="http://news.gzcc.cn/html/xiaoyuanxinwen/"
res=requests.get(ListPageUrl)
res.encoding=‘utf-8‘
soup=BeautifulSoup(res.text,‘html.parser‘)
n = int(soup.select(‘.a1‘)[0].text.rstrip(‘条‘))//10+1
return n
newsTotal=[]
firstPage=‘http://news.gzcc.cn/html/xiaoyuanxinwen/‘
newsTotal.extend(getListPage(firstPage))
n=getPageNumber()
for i in range(n,n+1):
listUrl= ‘http://news.gzcc.cn/html/xiaoyuanxinwen/{}.html‘.format(i)
newsTotal.extend(getListPage(listUrl))
# 3. 安装pandas,用pandas.DataFrame(newstotal),创建一个DataFrame对象df.
df=pandas.DataFrame(newsTotal)
#4. 通过df将提取的数据保存到excel 文件。
df.to_excel("new.xlsx")
# 5. 用pandas提供的函数和方法进行数据分析:
# 提取包含点击次数、标题、来源的前6行数据
print(df.head(6))
# 提取‘学校综合办’发布的,‘点击次数’超过3000的新闻。
print(df[df[‘click‘]>3000])
# 提取‘国际学院‘和‘学生工作处‘发布的新闻。
sou=[‘国际学院‘,‘学生工作处‘]
print(df[df[‘source‘].isin(sou)])
# 进取2018年3月的新闻
df1 = df.set_index(‘dt‘)
print(df1[‘2018-03‘])
df3 = df1[‘2018-04-13 16:19:02‘:‘2018-04-12 14:01:24‘]
# 6. 保存到sqlite3数据库
with sqlite3.connect(‘gzccdb.sqlite‘)as db:
df3.to_sql(‘gzcc05‘,con=db,if_exists=‘replace‘)
# 7. 从sqlite3读数据
with sqlite3.connect(‘gzccdb.sqlite‘)as db:
df2 = pandas.read_sql_query(‘SELECT * FROM gzcc05‘,con=db)
# 8. df保存到mysql数据库
conn = create_engine(‘mysql+pymysql://root:@localhost:3306/gzccnew?charset=utf8‘)
pandas.io.sql.to_sql(df,‘gzccnew‘,con=conn,if_exists=‘replace‘)
标签:etl 文件中 读数 index count end date head attr
原文地址:https://www.cnblogs.com/cktcom/p/8868360.html