输出结果为网址
#因为只有start的值不一样,所以我们可以采用格式化字符串%i来代替 u0='https://movie.douban.com/subject/26100958/comments?start=%i&limit=20&sort=new_score&status=P' u0 #获取5个页面网址,并把它保存到一个列表中 url_lst=[] for i in range(0,81,20): u0='https://movie.douban.com/subject/26100958/comments?start=%i&limit=20&sort=new_score&status=P' %i url_lst.append(u0) url_lst输出结果为:为5个网址
#访问网页 import requests #访问的工具包 import pandas as pd from bs4 import BeautifulSoup #解析的工具包 u1=url_lst[0]#提取第一个网址 #返回response[200]代表向网页请求成功 r=requests.get(u1) r输出结果为: <Response [200]>
#解析网页,会显示网页所有代码,我们就可以解析它的标签 soup=BeautifulSoup(r.text,'lxml') #例如我要去找到复仇者联盟4:终极之战短评这几个字,是h1的标签 soup.h1输出结果为:
输出结果为:
看过(221812) #所有的评论在这个大的div下面 div=soup.find('div',id='comments') div #构建获取页面URL的函数 def get_urls(n): urllst=[] for i in range(n): urllst.append('https://movie.douban.com/subject/26100958/comments?start=%i&limit=20&sort=new_score&status=P' %(i*20)) return urllst urllsts=get_urls(50) urllsts[:2]输出结果为:前两个页面的网址
# 构建网页信息获取函数 def get_data(urli): try: ri = requests.get(url = u) ri.encoding = 'utf-8' # 访问网页 soupi = BeautifulSoup(ri.text) # 解析网页 infor_lst = soupi.find('div',id="comments").find_all('div',class_="comment-item") # 获取所有招聘标签div datalsti = [] for infor in infor_lst[:]: dic = {} dic['评论者'] = infor.find('span',class_="comment-info").find('a').text dic['评分'] = int(infor.find('span',class_="comment-info").find_all('span')[1]['class'][0][-2:]) dic['评论时间'] = infor.find('span',class_="comment-time").text.replace(' ','').replace('\n','') dic['有用数量'] = int(infor.find('span',class_="votes").text) dic['评论内容'] = infor.find('p').text.replace('\n','') datalsti.append(dic) return datalsti except: return [] u = 'https://movie.douban.com/subject/26100958/comments?start=0&limit=20&sort=new_score&status=P' get_data(u)[:2]输出结果为:
df=pd.DataFrame(datalst) df.head() #数据分布分析 #评论字数的分析 df['评论字数']=df['评论内容'].str.len() df import matplotlib.pyplot as plt %matplotlib inline df['评论字数'] = df['评论内容'].str.len() plt.figure(figsize = (12,5)) plt.title('评论字数数据分布') df['评论字数'].hist(bins = 20,edgecolor = 'white') plt.grid(linestyle='--') #评论数量与有用数量的关系,用散点图来表示 plt.figure(figsize = (12,5)) plt.title('评论时间与有用数量关系') plt.scatter(df['评论时间'],df['有用数量'],alpha = 0.4) plt.xlabel('评论时间') plt.ylabel('有用数量') plt.grid(linestyle='--') #关键人物的分析 keyword='灭霸' n=0 for i in df['评论内容']: if keyword in i: n=n+1 print(n) #用DataFrame实现 len(df[df['评论内容'].str.contains('灭霸')]) #定义一个函数,去输出不同的人物在评论中出现的次数 def name_count1(namei): return len((df[df['评论内容'].str.contains(namei)])) print('函数构建成功!') name_count1('美队') #词频的出现次数 namelst=['美队','钢铁侠','灭霸','雷神','浩克','惊奇队长','奇异博士','死'] for i in namelst: print(i,name_count1(i))输出结果为: 美队 13 钢铁侠 17 灭霸 10 雷神 13 浩克 2 惊奇队长 10 奇异博士 3 死 22 最后做成词云图
