查看原文
其他

识别旅游“照骗”——看风景名胜是否名副其实

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

本文作者:邱    沣,河南大学经济学院

本文编辑:温和铭

技术总编:李婷婷

Stata&Python云端课程来啦!

       为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!!!Stata&Python特惠课程双双上线腾讯课堂~爬虫俱乐部推出了Python编程培训课程Stata基础课程Stata进阶课程Stata文本分析正则表达式网络爬虫基本字符串课程。报名课程即可加入答疑群,对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦。我们在这篇推文的最后提供了每门课程的课程二维码,大家有需要的话可以直接扫描二维码查看课程详情并进行购买哦~

导读

疫情的反复,寒潮的不期而至,是不是打乱了大家出门旅行的脚步?但再寒冷的冬天也终将被明媚的阳光融化,一场说走就走的旅行一定会如约而来!

“知者乐水,仁者乐山”,有人偏好山水之间的怡然自得,也有人偏爱霓虹绚烂的城市风光,或是巧夺天工的古代建筑,又或是穿梭时空的科技魅影。大家对于旅行都充满了美好的向往,当我们开始计划旅行时,往往我们都会打开互联网搜索一下,可前段时间发生的小红书踩雷事件,却在警示着我们互联网上“照骗”的虚假,提醒我们要擦亮双眼。



可以看出“照骗”果然是一门精妙的魔法,我们该怎么去识破它们呢?这时候我们就可以借用那些旅游过的或者说体验过的游客们的评论来看一看这些风景名胜是否真的名副其实。这里我们使用的是去哪儿旅行网站的游客评论来进行文本分析,看看这些景区们是否如他们宣传的一样引人入胜。这里的爬虫程序,我将用尽可能最简单的程序实现,接着一起看下去吧~

一、老君山

这张照片相信大家一定不陌生,悬崖之上的金顶大殿,这是老君山最负盛名的风景之一,那它是否如图所示的照片一样好看呢?接下来我们爬取游客们的评论看一看。

首先我们先找到去哪儿旅行网站中老君山景区的评论所在的网页地址,并寻找一下他们之间的规律。网址链接为https://travel.qunar.com/p-oi713299-laojunshanjingqu,进入之后下拉网页,发现共有100页评论,在我们点击查看第2页评论时,发现地址栏的链接并没有发生变化,说明该网页是动态加载的,需要寻找含有网页呈现信息的真实链接。


在这里,我们右击页数,选择在新的窗口页打开,会发现新的窗口页的链接与直接在原网页点击下一页时是不一样的(下图展示了第二页的情况),通过开发者模式也进一步验证,此时的链接(第二页为https://travel.qunar.com/p-oi713299-laojunshanjingqu-1-2?rank=0#lydp) 是真实链接,只需改变“?”前的数字就能控制页数。

接下来,我们进入网页源代码,发现我们所需要的评论就在网页源里,而且我们可以通过一系列的带有特殊属性的标签将其筛选出来,在这里我们可能会遇到两个小问题,第一个就是在有的网页中评论会分散在两行里,这就需要我们将其合并到一行中来,以便于后续的处理。第二个问题就是,有的评论过长导致在总评论这个页面中显示不全,要想全部看到评论内容需要点击阅读全部,这时就会进入一个新的网页,我们需要对这个新的网页进行爬虫拿到全部评论,然后用于补充第一次爬虫中缺失的评论。

所以,我们要进行两次爬虫,第一次爬虫拿到在总评论页面中可以显示完全的短评和那些过长评论相对应的“新网址”,第二次爬虫就是处理这些“新网址”,拿到全部的评论,最后进行合并。完整代码如下:
clear allforvalues p =1/100{ cap copy"https://travel.qunar.com/p-oi713299-laojunshanjingqu-1-`p'?rank=0#lydp" temp.txt,replace while _rc != 0 { sleep 5000 cap copy"https://travel.qunar.com/p-oi713299-laojunshanjingqu-1-`p'?rank=0#lydp" temp.txt,replace }infix strL v 1-100000 using temp.txt,clearforvalues i = `=_N'(-1)2 { //有些单元格中的信息在源代码中分布在不同的行里,将其进行合并 if index(v[`i'], "下一页") & !index(v[`i'], `"<div class="star-btm">"') { replace v = v + v[`i'] in `= `i' - 1' drop in `i' }}keep if index(v,`"<p class="first">"')split v, p(`"<p class="first">"')drop v v1sxpose, clearreplace _var1= ustrregexs(2) if ustrregexm(_var1,`"(<a class="seeMore" href=")(.*?)(" target="_blank">)"')replace _var1= ustrregexra(_var1, "<.*?>", "")gen _var2= _var1 if ustrregexm(_var1, "https")rename _var2 url save "老君山`p'.dta", replace}*分两次进行爬取:1-50、51-100clearlocal files:dir "." file "老君山*.dta"foreach file in `files'{ append using "`file'"}preservekeep _var1drop if ustrregexm(_var1, "https")rename _var1 评论save 一次爬虫.dta,replacerestorekeep url drop if url=="" //有的url为空 爬虫时需要跳过,这里删去save url.dta
**二次爬虫use url,clearlevelsof url, local(url)local i = 1foreach u in `url' { cap copy `"`u'"' "temp.txt", replace while _rc != 0 { sleep 5000 cap copy `"`u'"' "temp.txt", replace } clear set obs 1 //设置观测值数量为1 *将多行内容变为一行 gen v = fileread("temp.txt") split v,p("<!-- 评论的主体部分 -->") keep v2 split v2,p("<!-- 评论相关描述信息 -->") keep v21 replace v21 = ustrregexra(v21,"\s","",.) replace v21= ustrregexra(v21, "<.*?>", "") rename v21 评论 save "`i'.dta", replace local i = `i' + 1}clearlocal files: dir "." file "*.dta"foreach file in `files' { append using "`file'"}save 二次爬虫.dta,replace
**将两次爬虫的内容合并:append using 一次爬虫.dtasave 老君山评论.dta
(一)文本分析

接下来我们对所获得的所有评论内容进行文本分析,绘制词云图,看看大家在评论里都说了些什么。

*分词处理*导出为txt文档use 老君山评论.dta,clearexport delimited using 评论.txt,replace *调用Python分词*!pip install jiebaclear allpythonimport jieba.possegword=[]with open(r"评论.txt",encoding="utf-8") as f: for i in f.readlines(): str=i word.append(str)jieba.load_userdict(r"dict.txt")with open("分词.txt","w",encoding="utf-8") as f2: for unit in word: seg_list = jieba.posseg.cut(unit) for word in seg_list: f2.write(word.word+" "+word.flag+"\n")end*分词结果导入Stata,并删除单字、缺失值、停用词import delimited using 分词.txt, clear encoding("utf-8")split v1,p(" ")drop v1rename (v11 v12) (keyword flag)drop if ustrlen(keyword) == 1 // 删除单字drop if keyword =="" //删除缺失值preserveimport delimited using 停用词表.txt, clear /// encoding("utf-8") varname(nonames)outsheet using 停用词表.txt, replace nonames noquotelevelsof v1, local(keyword)restoreforeach word in `keyword' { drop if keyword == "`word'" //删除停用词}*词频统计bysort keyword: gen frequency = _Ngsort -frequencyduplicates dropsave word,replace*在分词结果中只保留动词、名词和形容词并绘制词云图:use word,clearkeep if ustrregexm(flag, "^[anv]") keep in 1/300wordcloud keyword frequency using 词云.html, replace size(15 80) range(3840 2160)shellout 词云.html

得到如图所示的结果:

我们可以通过词云图简单看出老君山景区还是很受欢迎的,其中正面词汇的出现频率很高,游客们对于索道,缆车,栈道这些旅游设施的关注度很高,美景,金顶,漂亮,仙境这些积极的词汇时常出现在评论中,总体而言老君山还是名副其实的。
(二)情感分析

接下来为了进一步分析老君山的游客评论,我们选用百度智能云服务进行文本的情感分析,来看看这些评论到底是负面的多还是正向的多,进而以正向评论所占的比例来给老君山打一个“情感分”。

我们的思路很简单,先申请一个百度AIP,然后利用Python导入评论,借助百度智能云服务对评论的情感倾向打一个分数,智能云会给出正向情感倾向得分和其置信度得分,以及负向情感倾向得分和其置信度得分。比如我们先导入单个评论:

*单个评论情感分析pythonfrom aip import AipNlpimport reimport osmydir = "E:\法律制度\文本分析" ##加载路径os.chdir(mydir)""" 你的 APPID AK SK """APP_ID = '*****'API_KEY = '******'SECRET_KEY = '*******'client = AipNlp(APP_ID, API_KEY, SECRET_KEY)text = "东都洛阳有很多著名的旅游景点,老君山景区就是其中之一,很多游客不远万里慕名而来,在此打卡拍照留恋,大家快来看看吧!2020-06-14来自携程;小玉YY"client.sentimentClassify(text)end

利用这个办法我们就可以得到全部评论的情感倾向得分了,由于评论字数过多,处理起来对电脑要求较高,故这里我们筛选掉了100字以上的评论,进行处理。得到所有得分后,我们便可将正向情感倾向得分保留下来,加总求均值,便可得到一个简单的老君山“情感分”了!这里我们算出的得分是0.96397(满分1分),得分还是很高的。综合上文的文本分析,可以看出老君山不愧是享誉中外的风景名胜!
二、雁荡山

接下来我们再用同样的方法看另一个景区:东南第一山——雁荡山,作为三山五岳中以山水奇秀闻名的风景名胜,它是否经得起游客们评论的考验呢?
首先,爬取评论,制作词云图,看一下大家的关注点都在哪里?(这里与前文方法一致就不再赘述程序)

我们可以通过词云图简单看出雁荡山景区的评论中正面积极的词汇出现较少,中性词汇较多,比如:喜欢,好玩,漂亮等很少出现,反倒是一些地名,景点的名字频频出现。不过值得安慰的是,负面词汇几乎没有出现,总的来说,我们有理由怀疑“千倾带远堤,万里泻长汀”的雁荡山,是否名副其实。

接下来和上文类似,为了进一步分析雁荡山的游客评论,我们选用百度智能云服务进行文本的情感分析,进而以正向评论所占的比例来给雁荡山打一个“情感分”。这里我们算出的得分是0.89681(满分1分),相比于老君山,得分还是偏低的。毕竟在去哪儿网这种商业平台,景区的游客打分均值都是比较高的。

三、结语

在互联网的虚拟交互时代,我们每天都要面对各种加上滤镜的美食美景,而当我们乘兴而至,结果往往又败兴而归。在这种背景下,我的方法就简单提供了一种识别“照骗”的思路,帮助大家判断风景名胜是否名副其实。当然这种思路是很 naive 的,要想真正识别并量化评论的好坏,这还需要大量的工作要做,而且在虚幻的网络世界中,真实的评论如何获取和筛选也值得我们思考。

END

最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。


腾讯课堂课程二维码








            


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











往期推文推荐
        主成分分析的Python实现

正则表达式--贪婪模式

Seminar丨谁更重要:高管股权薪酬与财务报告欺诈DOS能量,超乎你想象!

爬虫实战丨走进哈利波特的魔法世界

数据集合并的新路子-frlink命令

Seminar丨附近的公司:利用卫星图像研究本地信息优势

线性同余法生成伪随机数 

[技能篇]多线程爬虫

“好哭”是衡量一部好电影的标准吗?

Stata&Python云端课程来啦!

带你了解Stata中的矩阵

Seminar|总统的朋友:政治关联与企业价值
爬虫实战 | 爬取中国天气网

爬虫实战 | 爬取东方财富网经济数据——以居民消费价格指数(CPI)为例

Seminar|媒体关联董事对融资和外部治理的影响神奇的组内交叉合并 PDF分章节转TXT并实现可视化——以胡景北知青日记1971至1978年为例

万物皆可开——shellout妙用

无处不在的系列配置项|从零开始的Pyecharts(三)

使用Python制作自动聊天机器人  

fillin一下,平衡回来~

order命令——快速改变变量顺序的利器 Ajax应用场景——以获取雪球网港股代码及公司名称为例

播放列表中的歌单排行 

在Stata中轻松运用program编写命令

Meta Analysis in Stata17      

芒果TV视频弹幕爬取之《我在他乡挺好的》

Stata中的判断神器——confirm命令

cngdf——名义GDP与实际GDP之间的摆渡船

最近《扫黑风暴》有点火爆!我从豆瓣评论中发现了这些……

随机森林-Random Forest 

复原之神--preserve&restore

关于我们 


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

   武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。



此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里
为作者署名,并有赏金分成。

2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众
号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。





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

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