查看原文
其他

《少年的你》影评

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:王碧琪

文字编辑:李钊颖

技术总编:李朋冲


重磅!!!为了大家能够更好地学习Python技术,以及应广大粉丝和往期学员的要求,2019年11月29日-12月1日,武汉字符串数据科技有限公司将在湖北武汉举办《第四期Python编程技术培训》。本次培训采用理论与案例相结合的方式,旨在帮助零基础学员轻松入门Python,由浅入深学习和掌握Python的编程技术,特别是网络数据抓取技术。目前正在火热招生中~

详细培训大纲及报名方式,请点击《2019年Python第四期培训招生》或点击文末阅读原文呦~


最近,《少年的你》热播,小编听说口碑(四字弟弟)不错也去看了一下,结果发现不虚此行。关于校园霸凌,中国电影此前或多或少也有涉及,但从未有一部青春片,如此直观深刻地揭开了校园中这一敏感黑暗的角落。也许我们都经历过校园霸凌,或是欺凌者,抑或被欺凌者,又或是旁观者,我们在其中又扮演了什么样的角色?学校、老师、家长和社会,又都有怎样的行为和思想动机?透过大荧幕呈现出来的这一社会现实,让我们产生了深深的代入感,我们既是观影者,又都是影中人。希望这部电影可以像《我不是药神》推动落实抗癌药降价保供措施一样,也促进社会对于校园霸凌的关注以及相关立法的形成。
影院里,可以听到很多人的深呼吸,甚至于哭泣,大家也都有感触。那最后的评价又会是怎样的呢?今天让我们一起来用Stata来看看《少年的你》的豆瓣影评。在往期推文《Python爬取豆瓣电影评论并生成词云图(一)》中,我们用Python获取了《复仇者联盟3》的评论,本文将使用Stata实现部分相似的功能。

 

我们的目标是:获取《少年的你》这一电影评论的时间、链接、标题和内容。

通过如下几个步骤实现:

一次爬虫:单个页面评论的时间、链接、标题;

二次爬虫:单个页面评论的内容;

最后一个层次:获得多个页面的完整评论。

 

(一)单页面获取评论时间、链接、标题

我们找到目标网页,网址是:https://movie.douban.com/subject/30166972/reviews。

我们发现共有5488条评论,默认评论每页显示20条,网页链接规律可以参见推文《Python爬取豆瓣电影评论并生成词云图(一)》,所以我们把第一页的链接改为:https://movie.douban.com/subject/30166972/reviews?=0

 

首先,创建目标文件夹,并且将源代码拷贝下来,保存到temp.txt中,然后读入到Stata中等待处理。
clearcap mkdir "D:/豆瓣影评" //创建目标文件夹cd "D:/豆瓣影评" //更改当前工作路径到此文件夹copy "https://movie.douban.com/subject/30295905/reviews?start=0" temp.txt,replace //把网页源代码拷贝到temp.txt中infix strL v 1-100000 using temp.txt, clear //读入到当前dta里


接着,我们寻找评论发布时间的位置规律,发现它在带有“<spancontent=”的行里。



再运用正则表达式进行提取,得到评论发布时间。此处,我们使用preserve和restore是为了保留源代码以备后面提取评论链接和标题的操作。关于这一对命令的相关用法可以参见往期推文《preserve restore——stata的起死回生之术》。

preserve //保留原来的数据文件keep if index(v,`"<span content=""') //保留包含<span content="的行replace v=ustrregexra(v,"<.*?>","") //此处加“?”进入正则表达式的懒惰模式,把<>之间的内容替换为空rename v time //重命名v为timesave time.dta,replace //保存为time.dtarestore //恢复到preserve之前的数据状态

time.dta内容如下



然后,我们寻找评论完整内容对应的链接,以及评论的标题所在的位置规律,发现评论链接和标题都在包含“<h2><ahref=”的行里。



我们对其进行分割、替换等处理,得到评论链接和评论标题。
keep if index(v,`"<h2><a href="') //保留包含<h2><a href="的行split v,p(`"""') //用双引号作为分隔符分割rename v2 url //重命名v2为urlsplit v3,p(">") //用>作为分隔符分割split v32,p("<") //用<作为分隔符分割rename v321 title //重命名v321为titlekeep url title //保留url、title两个变量
之后,我们将之前保存的time.dta与当前数据文件横向合并起来,即可得到单个网页的评论时间、链接和标题。
merge using time //将当前数据和time进行合并drop _merge //删除_mergesave "影评p1.dta",replace //保存为影评p1.dta


得到的数据文件如下:



(二)单页面获取20条评论内容

我们使用(一)中生成的影评p1.dta中的url进行依次爬取,获得评论的内容。
首先我们创建目标文件夹,并把影评p1.dta放到Stata中,以便后续使用url这一变量。
clearcap mkdir "D:/豆瓣影评/二次爬虫" //创建目标文件夹cd "D:/豆瓣影评/二次爬虫" //更改当前工作路径到此文件夹use "D:\豆瓣影评\影评p1.dta",clear

然后我们进入每一个url进行抓取,因为要进行多次爬取,为了防止ip被封、网速过慢等爬取失败的情况出现,我们让程序爬取失败之后休息一下再进行第二次爬取。

gen v=""forvalues i=1/`=_N'{    replace v=fileread(url) in `i' //把网页源代码拷贝到v中 while filereaderror(v[`i'])!=0 { sleep 5000 //休息5000毫秒 replace v=fileread(url) in `i' } }split v,p(`"<div id="link-report">"' `"<div class="copyright">"') //把v按照指定分隔符分割keep v2replace v2 = ustrregexra(v2,"\s","",.) //删去v2中的空白符replace v2 = ustrregexra(v2, "<.*?>", "",.) //把<>之间的内容替换为空rename v2 content //将v2重命名为contentsave "影评内容p1.dta",replace//保存为“影评内容p1.dta”


得到的数据文件如下:



(三)多页面获取完整评论内容

首先我们判断一下共有多少页豆瓣影评,此处我们对源代码进行分析,并利用正则表达式抓取到页码数。
clearcap mkdir "D:/豆瓣影评"cd "D:/豆瓣影评"infix strL v 1-100000 using temp.txt, clear keep if index(v,`"<span class="thispage" data-total-page="') replace v=ustrregexs(0) if ustrregexm(v,"(\d+)") //共有多少页评论


然后定义第一个循环,将所有页面对应的一层爬虫文件即评论对应的url、title、time保存下来。

local p=v[1]forvalues i=1/`p'{ local j=(`i'-1)*20 //定义评论对应的数字编码 cap copy "https://movie.douban.com/subject/30166972/reviews?start=`j'" temp.txt,replace infix strL v 1-100000 using temp.txt,clear
preserve keep if index(v,`"<span content=""') replace v=ustrregexra(v,"<.*?>","") rename v time save time.dta,replace restore keep if index(v,`"<h2><a href="') split v,p(`"""') rename v2 url split v3,p(">") split v32,p("<") rename v321 title keep url title
merge using time drop _merge save "影评`i'.dta",replace //第i条评论对应的url、title、time保存为影评i.dta  }

结果生成了284个dta文件。

打开其中一个如下:



我们将上述文件合并起来。

clearlocal files:dir "." file "影评*.dta"foreach file in `files'{ append using "`file'" //把上面生成的影评i.dta合并起来 }save "影评.dta",replace


得到的影评.dta部分如下:



然后我们进行二次爬虫,进入每一个url里,得到每条评论的内容(程序和(二)中相同)。之后再将数据文件合并起来,得到最终的目标文件。

gen v="" forvalues i=1/`=_N'{ replace v=fileread(url) in `i' while filereaderror(v[`i'])!=0 { sleep 5000 //休息5000毫秒 replace v=fileread(url) in `i' } }split v,p(`"<div id="link-report">"' `"<div class="copyright">"')keep v2replace v2 = ustrregexra(v2,"\s","",.)replace v2 = ustrregexra(v2, "<.*?>", "",.)rename v2 contentmerge using "影评.dta" //将当前数据和"影评.dta"合并drop _mergeorder (time url title content)save "影评.dta",replace  //保存为影评.dta


最后的数据文件部分如下:



至此我们就得到了《少年的你》这部电影在豆瓣网站上的所有评论了。最后,小编认为:虽然褒贬不一,但是这部电影逼着我们正视、重视校园霸凌现象。影片之中陈念的那句:“你们所有人,都是凶手”让人胆战心惊,当雪崩来临时每一片雪花都不是无辜的,这其中有学生的沉默、家庭的失护与失教、教育体制的冷漠和司法的无力。关于抑制校园霸凌现象,我们还有很长的路要走。



对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐

集合常用方法小结

实战演练-爬取深交所年报

      重建“通天塔” —— Unicode编码与解码
输出分组描述性统计表的利器——report
字典常用操作小结
XPath Helper助XPath爬虫一臂之力
查找变量?用“codebook”!
distinct命令用法一览
Stata数据分析技术应用培训
玩转Python之“手把手”教你爬数据(一)
玩转Python之“手把手”教你爬数据(二
labelsof和labelbook介绍
Statalist上的“火云邪神”
爬虫实战程序的函数封装
Zipfile(二)
利用collapse命令转化原始数据
Stata中的数值型

关于我们

微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存