《少年的你》影评
本文作者:王碧琪
文字编辑:李钊颖
技术总编:李朋冲
重磅!!!为了大家能够更好地学习Python技术,以及应广大粉丝和往期学员的要求,2019年11月29日-12月1日,武汉字符串数据科技有限公司将在湖北武汉举办《第四期Python编程技术培训》。本次培训采用理论与案例相结合的方式,旨在帮助零基础学员轻松入门Python,由浅入深学习和掌握Python的编程技术,特别是网络数据抓取技术。目前正在火热招生中~
详细培训大纲及报名方式,请点击《2019年Python第四期培训招生》或点击文末阅读原文呦~
我们的目标是:获取《少年的你》这一电影评论的时间、链接、标题和内容。
通过如下几个步骤实现:
一次爬虫:单个页面评论的时间、链接、标题;
二次爬虫:单个页面评论的内容;
最后一个层次:获得多个页面的完整评论。
(一)单页面获取评论时间、链接、标题
clear
cap 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里
再运用正则表达式进行提取,得到评论发布时间。此处,我们使用preserve和restore是为了保留源代码以备后面提取评论链接和标题的操作。关于这一对命令的相关用法可以参见往期推文《preserve restore——stata的起死回生之术》。
preserve //保留原来的数据文件
keep if index(v,`"<span content=""') //保留包含<span content="的行
replace v=ustrregexra(v,"<.*?>","") //此处加“?”进入正则表达式的懒惰模式,把<>之间的内容替换为空
rename v time //重命名v为time
save time.dta,replace //保存为time.dta
restore //恢复到preserve之前的数据状态
time.dta内容如下:
keep if index(v,`"<h2><a href="') //保留包含<h2><a href="的行
split v,p(`"""') //用双引号作为分隔符分割
rename v2 url //重命名v2为url
split v3,p(">") //用>作为分隔符分割
split v32,p("<") //用<作为分隔符分割
rename v321 title //重命名v321为title
keep url title //保留url、title两个变量
merge using time //将当前数据和time进行合并
drop _merge //删除_merge
save "影评p1.dta",replace //保存为影评p1.dta
得到的数据文件如下:
(二)单页面获取20条评论内容
clear
cap 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 v2
replace v2 = ustrregexra(v2,"\s","",.) //删去v2中的空白符
replace v2 = ustrregexra(v2, "<.*?>", "",.) //把<>之间的内容替换为空
rename v2 content //将v2重命名为content
save "影评内容p1.dta",replace//保存为“影评内容p1.dta”
得到的数据文件如下:
(三)多页面获取完整评论内容
clear
cap 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文件。
打开其中一个如下:
我们将上述文件合并起来。
clear
local 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 v2
replace v2 = ustrregexra(v2,"\s","",.)
replace v2 = ustrregexra(v2, "<.*?>", "",.)
rename v2 content
merge using "影评.dta" //将当前数据和"影评.dta"合并
drop _merge
order (time url title content)
save "影评.dta",replace //保存为影评.dta
最后的数据文件部分如下:
至此我们就得到了《少年的你》这部电影在豆瓣网站上的所有评论了。最后,小编认为:虽然褒贬不一,但是这部电影逼着我们正视、重视校园霸凌现象。影片之中陈念的那句:“你们所有人,都是凶手”让人胆战心惊,当雪崩来临时每一片雪花都不是无辜的,这其中有学生的沉默、家庭的失护与失教、教育体制的冷漠和司法的无力。关于抑制校园霸凌现象,我们还有很长的路要走。
关于我们
微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。