数据结构化与保存
1. 将新闻的正文内容保存到文本文件。
1
2
3
4
|
def writeNewsDatail(content): f = open ( 'gzccnews1.txt' , 'a' ,encoding = 'utf-8' ) f.write(content) f.close() |
2. 将新闻数据结构化为字典的列表:
- 单条新闻的详情-->字典news
- 一个列表页所有单条新闻汇总-->列表newsls.append(news)
- 所有列表页的所有新闻汇总列表newstotal.extend(newsls)
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
import
pandas
import
requests
import
re
from
bs4
import
BeautifulSoup
from
datetime
import
datetime
def
writeNewsDatail(content):
f
=
open
(
'gzccnews1.txt'
,
'a'
,encoding
=
'utf-8'
)
f.write(content)
f.close()
#dui
# 获取新闻点击次数
def
getNewsId(url):
#dui
newsId
=
re.findall(r
'\_(.*).html'
, url)[
0
][
-
4
:]
clickUrl
=
'http://oa.gzcc.cn/api.php?op=count&id={}&modelid=80'
.
format
(newsId)
clickRes
=
requests.get(clickUrl)
# 利用正则表达式获取新闻点击次数
clickCount
=
int
(re.search(
"hits'\).html\('(.*)'\);"
, clickRes.text).group(
1
))
return
clickCount
def
getNewsDetail(newsUrl):
#dui
# 读取新闻细节
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
# info相关内容
news[
'dt'
]
=
datetime.strptime(info.lstrip(
'发布时间:'
)[
0
:
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'
]
=
soupd.select(
".show-content"
)[
0
].text.strip()
# 正文
news[
'count'
]
=
getNewsId(newsUrl)
news[
'newsUrl'
]
=
newsUrl
return
(news)
def
getListPage(pageUrl):
#dui
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(
'.a1'
)[
0
].text.rstrip(
'条'
))
return
(n
/
/
10
+
1
)
newsTotal
=
[]
n
=
getPageN()
p
=
[
2
, n]
for
i
in
p:
listPageUrl
=
"http://news.gzcc.cn/html/xiaoyuanxinwen/{}.html"
.
format
(i)
print
(listPageUrl)
newsTotal.extend(getListPage(listPageUrl))
for
news
in
newsTotal:
print
(news)
3. 安装pandas,用pandas.DataFrame(newstotal),创建一个DataFrame对象df.
12import
pandas
df
=
pandas.DataFrame(newsTotal)
4. 通过df将提取的数据保存到csv或excel 文件。
1df.to_excel(
"0416.xlsx"
)
5. 用pandas提供的函数和方法进行数据分析:
- 提取包含点击次数、标题、来源的前6行数据
- 提取‘学校综合办’发布的,‘点击次数’超过3000的新闻。
- 提取'国际学院'和'学生工作处'发布的新闻。
123
print
(df[[
'count'
,
'title'
,
'source'
]][
0
:
6
])
print
(df[(df[
'count'
]>
3000
)&(df[
'source'
]
=
=
'学校综合办'
)])
print
(df[(df[
'source'
]
=
=
'国际学院'
)|(df[
'source'
]
=
=
'学生处'
)])