当前位置: 首页 > 后端技术 > Python

用Python了解最炫的国漫《雾山五行》

时间:2023-03-26 16:26:27 Python

看动漫的朋友应该知道,最近出了一部神漫《雾山五行》。不到24小时,就登上了B站热搜榜首。豆瓣评分9.5,可见其受欢迎程度。就打斗场面而言,说是最亮眼的动漫也不为过。当然,唯一不足的就是集数。有点短,只有3集。这里有一些动画供您欣赏。看完动画你是不是觉得我说的是最亮眼的动漫不是骗人的。接下来,我们就来爬取一些评论,看看大家对这部动漫的看法。这里我们选择哔哩哔哩、微博和豆瓣。一个抓取数据的平台。爬取B站我们先爬取B站的弹幕数据,动画链接为:https://www.bilibili.com/bangumi/play/ep331423,弹幕链接为:http://comment.bilibili.com/186803402.xml,爬取代码如下:url="http://comment.bilibili.com/218796492.xml"req=requests.get(url)html=req.contenthtml_doc=str(html,"utf-8")#改为utf-8#解析soup=BeautifulSoup(html_doc,"lxml")results=soup.find_all('d')contents=[x.textforxinresults]#保存结果dic={"contents":contents}df=pd.DataFrame(dic)df["contents"].to_csv("bili.csv",encoding="utf-8",index=False)如果你不知道如何抓取B站的弹幕数据大家可以看看:爬取B站的弹幕。然后我们将爬取的弹幕数据生成词云,代码实现如下:defjieba_():#打开评论数据文件content=open("bili.csv","rb").read()#jiebaword_list=jieba.cut(content)words=[]#过滤掉的词stopwords=open("stopwords.txt","r",encoding="utf-8").read().split("\n")[:-1]forwordinword_list:ifwordnotinstopwords:words.append(word)globalword_cloud#用逗号分隔单词word_cloud=','.join(words)defcloud():#打开词云背景imagecloud_mask=np.array(Image.open("bg.png"))#定义词云的一些属性wc=WordCloud(#背景图片分割颜色为白色background_color='white',#背景图案mask=cloud_mask,#显示最大字数max_words=500,#显示中文font_path='./fonts/simhei.ttf',#最大字号max_font_size=60,repeat=True)globalword_cloud#词云函数x=wc.generate(word_cloud)#生成词云图image=x.to_image()#显示词云图image.show()#保存词云图wc.to_file('cloud.png')jieba_()cloud()看效果:抓取微博,然后抓取的微博评论日本动画片理论上,我们选择的爬取目标是巫山五行官博置顶这条微博的评论数据,如图:爬取代码实现如下:urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)#抓取一页评论defget_one_page(url):headers={'User-agent':'Mozilla/5.0(WindowsNT6.1;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/78.0.3880.4Safari/537.36','Host':'weibo.cn','Accept':'application/json,text/plain,*/*','Accept-Language':'zh-CN,zh;q=0.9','Accept-Encoding':'gzip,deflate,br','Cookie':'owncookie','DNT':'1','Connection':'keep-alive'}#获取网页htmlresponse=requests.get(url,headers=headers,verify=False)#爬取成功ifresponse.status_code==200:#返回值为html文档,传递给解析函数returnresponse.textreturnNone#解析并保存评论信息defsave_one_page(html):comments=re.findall('(.*?)',html)forcommentincomments[1:]:result=re.sub('<.*?>','',评论)如果'reply@'不在结果中:withopen('wx_comment.txt','a+',encoding='utf-8')asfp:fp.write(result)foriinrange(50):url='https://weibo.cn/comment/Je5bqpmCn?uid=6569999648&rl=0&page='+str(i)html=get_one_page(url)print('抓取第%d页评论'%(i+1))save_one_page(html))time.sleep(3)对爬取微博评论不熟悉的朋友可以参考:爬取微博评论同样的方法,我们还是生成评论的词云,看看效果:爬取豆瓣最后我们爬取豆瓣动画的评论数据,动画的豆瓣地址为:https://movie.douban.com/subject/30395914/,爬取实现代码如下:defspider():url='https://accounts.douban.com/j/mobile/login/basic'headers={"User-Agent":'Mozilla/4.0(compatible;MSIE8.0;WindowsNT6.0;Trident/4.0)'}#评论URL,为了动态翻页,开始后加一个格式化数字,短评论页有20条数据,20条每页添加数据url_comment='https://movie.douban.com/subject/30395914/comments?start=%d&limit=20&sort=new_score&status=P'data={'ck':'','name':'用户名','password':'密码','记住':'false','ticket':''}session=requests.session()session.post(url=url,headers=headers,data=data)#初始化4个列表保存用户名,星级和时间,评论textusers=[]stars=[]times=[]content=[]#抓取500条,每页20条,这也是豆瓣给iinrange(0,500,20)的上限:#getHTMLdata=session.get(url_comment%i,headers=headers)#状态码200表成功print('th',i,'page','statuscode:',data.status_code)#暂停0-1秒,防止IP被封time.sleep(random.random())#parseHTMLselector=etree.HTML(data.text)#使用xpath获取单个页面的所有评论评论=选择器。xpath('//div[@class="comment"]')#遍历所有评论,获取评论中评论的详细信息:#获取用户名user=comment.xpath('.//h3/span[2]/a/text()')[0]#获取星级star=comment.xpath('.//h3/span[2]/span[2]/@class')[0][7:8]#获取时间date_time=comment.xpath('.//h3/span[2]/span[3]/@title')#某时间为空,需要判断是否len(date_time)!=0:date_time=date_time[0]date_time=date_time[:10]else:date_time=None#获取评论文本comment_text=comment.xpath('.//p/span/text()')[0].strip()#将所有信息添加到列表users.append(user)stars.append(star)times.append(date_time)content.append(comment_text)#包裹comment_dic={'user':users,'star':stars,'time':times,'comments':content}#转换成DataFrame格式comment_df=pd.DataFrame(comment_dic)#保存数据comment_df.to_csv('db.csv')#单独保存评论comment_df['comments'].to_csv('comment.csv',index=False)spider()不熟悉爬取豆瓣评论的可以参考:Crawl豆瓣评论看生成词云效果:源码在上面公众号后台回复200804获取。