一个完整的大作业

1.选一个自己感兴趣的主题。

2.网络上爬取相关的数据。

3.进行文本分析,生成词云。

4.对文本分析结果解释说明。

5.写一篇完整的博客,附上源代码、数据爬取及分析结果,形成一个可展示的成果。

  首先,本人本次选择要爬取的网站是http://www.gd.chinanews.com/index/gdsz.html--广东新闻网中的数据以及做本网站上标题的词频统计,形成的效果图可做初步的了解广东新闻网标题中大多数出现的用词。

第一步:我们把一条新闻的详情从新闻列表中拿出来,根据对详情新闻源代码的检查观察可以得到一条详细新闻的数据,代码如下:

def detail(url):
    r=requests.get(url)
    r.encoding='gb2312'
    s=BeautifulSoup(r.text,'html.parser')
    n={}
    n['t']=s.select('h2')[0].text#标题
    n['u']=url#链接
    return(n)
#print(detail('http://www.gd.chinanews.com/2017/2017-10-30/2/389835.shtml'))#详细一条新闻主页的标题和链接

 

效果图如图所示:

第二步,要获取广东新闻网中的所有新闻的详情内容,我们必须要获得所有新闻,由以下代码实现:

def page(p):
    re=requests.get(p)
    re.encoding='gb2312'
    soup=BeautifulSoup(re.text,'html.parser')
    newsls=[]
    for i in soup.select('li > .dd_bt'):
        if len(i.select('a')) > 0:
                newsls.append(detail('http://www.gd.chinanews.com'+i.select('a')[0]['href']))
    return(newsls)
#print(page('http://www.gd.chinanews.com/index/gdsz.html'))

newstotal=[]
newsurl='http://www.gd.chinanews.com/index/gdsz.html'
newstotal.extend(page(newsurl))#所有新闻
#print(newstotal)

实现效果如图所示:

 

第三步,我们可以将所有的新闻形成表格或者数据的形式保存下来,以便我们可以更好的使用,代码如下:

df=pandas.DataFrame(newstotal)
df.to_excel('new.xlsx')
with sqlite3.connect('new.sqlite') as db:
    df.to_sql('new',con=db)

效果如图:

第四步,在所有新闻的详情以字典在列表中生成之后,我们要做的是提取列表中的每一个字典中的某个数据,这里提取的是标题。代码如下:

for i in range(10):
    if i>0:
       if i>0:
        t=t+newstotal[i].get('t')
    else:
        t=newstotal[i].get('t')#返回10条标题形成的文本
for i in ',。:?!“”() ':
    t=t.replace(i,'')
title=list(jieba.cut(t))
#print(title)

实现的效果如图所示:

最后,我们将分词做词频统计,做成词云输出结果,代码如下:

k={}
keys=set(title)
for i in keys:
    k[i]=title.count(i)
wc=list(k.items())
wc.sort(key=lambda x:x[1],reverse=True)#字典返回列表并排序

mywc=WordCloud().generate_from_frequencies(k)    
plt.imshow(mywc)
plt.show()

 

效果图如图所示:

这就是整个广东新闻网中时政部分所有标题所做的词频分析,可以看出广州,中国,世界等词在时政标题中出现的频率较高,由此便可知道人们都在关注些什么。

完整的代码如下所示:

import requests
from bs4 import BeautifulSoup
import pandas
import sqlite3
import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt

def detail(url):
    r=requests.get(url)
    r.encoding='gb2312'
    s=BeautifulSoup(r.text,'html.parser')
    n={}
    n['t']=s.select('h2')[0].text#标题
    n['u']=url#链接
    return(n)
#print(detail('http://www.gd.chinanews.com/2017/2017-10-30/2/389835.shtml'))#详细一条新闻主页的标题和链接

def page(p):
    re=requests.get(p)
    re.encoding='gb2312'
    soup=BeautifulSoup(re.text,'html.parser')
    newsls=[]
    for i in soup.select('li > .dd_bt'):
        if len(i.select('a')) > 0:
                newsls.append(detail('http://www.gd.chinanews.com'+i.select('a')[0]['href']))
    return(newsls)
#print(page('http://www.gd.chinanews.com/index/gdsz.html'))

newstotal=[]
newsurl='http://www.gd.chinanews.com/index/gdsz.html'
newstotal.extend(page(newsurl))#所有新闻
#print(newstotal)
'''
df=pandas.DataFrame(newstotal)
#print(df.head())
#print(df['t'])

df.to_excel('new.xlsx')
with sqlite3.connect('new.sqlite') as db:
    df.to_sql('new',con=db)
'''
for i in range(10):
    if i>0:
       if i>0:
        t=t+newstotal[i].get('t')
    else:
        t=newstotal[i].get('t')#返回10条标题形成的文本
for i in ',。:?!“”() ':
    t=t.replace(i,'')
title=list(jieba.cut(t))
#print(title)
k={}
keys=set(title)
for i in keys:
    k[i]=title.count(i)
wc=list(k.items())
wc.sort(key=lambda x:x[1],reverse=True)#字典返回列表并排序

mywc=WordCloud().generate_from_frequencies(k)    
plt.imshow(mywc)
plt.show()

 

posted @ 2017-10-31 21:22  彭炜杰  阅读(286)  评论(0编辑  收藏  举报