1.选一个自己感兴趣的主题。
2.网络上爬取相关的数据。
3.进行文本分析,生成词云。
4.对文本分析结果解释说明。
5.写一篇完整的博客,附上源代码、数据爬取及分析结果,形成一个可展示的成果。
网站:80电影天堂网站(http://www.80dyy.cc/80kehuan/index.html)
我预期是首先完成的爬取所有科幻片的演员的名字,然后分析出哪些演员的频率高,得知他在该网站的电影中的热门程度
分析网站,看的电影的标题和连接放在<li>标签里面的<dl>标签里,主要看代码部分的解释
爬取内容保存到数据库代码import requests
由于<dl>标签里 的连接只是后面那部分,所以使用了一条循环,补全链接
for names in soup.select('dl'): name = names.select('a')[0]['href'] addname = "http://www.80dyy.cc{}".format(name)
提取内容到数据库的代码:
import re from bs4 import BeautifulSoup from datetime import datetime import pandas import sqlite3 def getdetail(url): resd = requests.get(url) resd.encoding='gbk' soupd=BeautifulSoup(resd.text,'html.parser') namels={} #print(url) for names in soupd.select('.mtext'): namels['标题'] = names.select('li')[0].contents[0].text namels['链接']= url action= names.select('li')[1].text action = action.replace('\xa0',' ') namels["演员"] = action[3:len(action)+1] return(namels) def onepage(pageurl): res = requests.get(pageurl) res.encoding = 'gbk' soup = BeautifulSoup(res.text,'html.parser') namels = [] for names in soup.select('dl'): name = names.select('a')[0]['href'] #print(name) addname = "http://www.80dyy.cc{}".format(name) namels.append(getdetail(addname)) #break #这个用来停止循环,等一页的所有信息都完成后删去即可 return namels newst= [] zurl = 'http://www.80dyy.cc/80kehuan/' resd = requests.get(zurl) resd.encoding='gbk' soup=BeautifulSoup(resd.text,'html.parser') newst.extend(onepage(zurl)) for i in range(2,4): listurl='http://www.80dyy.cc/80kehuan/index{}.html'.format(i) newst.extend(onepage(listurl)) #print(newst) df = pandas.DataFrame(newst)
with sqlite3.connect("dyactiondb10.sqlite") as db: df.to_sql('dyactiondb108',con = db)
保存成功
保存到本地excel并查看excel表格:
df = pandas.DataFrame(newst) df.to_excel('dyaction.xlsx')
由上面得到的列表newst。接下来把列表的演员全部输出,并保存到text文件里。
df = pandas.DataFrame(newst) print(df["演员"])
由于文件内容过多,我选择先完成2个页面的输出:
处理成字符型数据:
df = pandas.DataFrame(newst) #print(df["演员"]) straction = " ".join(df["演员"]) print(straction)
输出的结果:
接下来,做词云统计。
把保存到text的文件先统计出现的次数,看有没有不相干的词语。
import jieba txt = open("ac1.txt","r",encoding='utf-8').read() ls = [] words = jieba.lcut(txt) counts = {} for word in words: ls.append(word) if len(word) == 1: continue else: counts[word] = counts.get(word,0)+1 items = list(counts.items()) items.sort(key = lambda x:x[1], reverse = True) for i in range(50): word , count = items[i] print ("{:<10}{:>5}".format(word,count))
结果:
接下来完成词云部分:
import jieba import WordCloud import matplotlib.pyplot as plt txt = open("ac1.txt","r",encoding='utf-8').read() wordlist = jieba.cut(text,cut_all=True) wl_split = "/".join(wordlist) mywc = WordCloud().generate(text) plt.imshow(mywc) plt.axis("off") plt.show()
分析出迈克尔、克里斯、约翰、威廉等词出现的次数最多。