查看原文
其他

去哪儿网攻略爬取——跟我一起去大理吧

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

本文作者:石   艳,中南财经政法大学统计与数学学院

本文编辑:杨婉清

技术总编:王子一

Stata&Python云端课程来啦!

为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!!!Stata&Python特惠课程双双上线腾讯课堂~原价2400元的Python编程培训课程,现在仅需100元,详情请查看推文《Python云端课程福利大放送!0基础也能学~》。关于Stata,爬虫俱乐部推出了系列课程,内容包括字符串函数、正则表达式、爬虫专题和文本分析,可以随心搭配,价格美丽,物超所值,更多信息可查看Stata系列推文《与春天有个约会,爬虫俱乐部重磅推出正则表达式网络课程!》《与春天有个约会,爬虫俱乐部重磅推出基本字符串函数网络课程》等。变的是价格,不变的是课程质量和答疑服务。对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦!


DATA导言

由于疫情的突然爆发,大家去年上半年的生活应该都在宅家抗疫,下半年大概会被封闭在校,而今年由于疫情的缓和,在已经过去的五一假期和端午假期期间,就有不少人选择去旅游来补偿自己,现在又正值暑假和毕业季,朋友圈天天都是美食美景,看的真是心痒难耐,于是小编选择了自己最近非常想去的云南,看看别人的攻略玩法,来为自己的规划提供建议。

网页分析

本文选择的是“去哪儿”网站的攻略栏目,在攻略栏目下的首页选择自己想去的旅游地点即可看到相关的攻略,以云南省为例,网址链接为https://travel.qunar.com/p-sf297541-yunnan,在网页底部可以发现共有100页,每页10篇攻略,如果全部抓取,可得1000篇攻略。在每一篇攻略中,可以发现文章标题、文章链接、作者、途经、形程、阅读量、点赞量、评论量这些信息,初步打算抓取这些信息。同时点击第2页时,发现地址栏的链接并没有发生变化,说明该网页是动态加载的,需要寻找含有网页呈现信息的真实链接。


在攻略底部的页数上面是隐藏一个链接的,右击页数,选择在新的窗口页打开,会发现新的窗口页的链接与直接在原网页点击下一页时是不一样的(下图展示了第二页的情况),通过开发者模式也进一步验证,此时的链接(第二页为https://travel.qunar.com/p-sf297541-yunnan-gaikuang-2#lydp)是真实链接,只需改变“#”前的数字就能控制页数。


找到链接后,我们以第一页为例,查看信息所在的模块,可以发现信息所在比较规整,使用BeautifulSoup进行网页解析,提取带有特殊属性的标签文本内容即可。

下面代码展示第一页第一篇攻略的信息提取(BeautifulSoup解析完网页的基础上),其他页面的信息提取只需循环即可。

li_List = soup.find_all('li',class_='list_item') #soup为解析完的对象title = li_List[0].find('h3').text #标题url = li_List[0].h3.a['href'] #链接user = li_List[0].find('span',class_='user_name').text # 作者date = li_List[0].find('span',class_='date').text # 出发日期days = li_List[0].find('span',class_='days').text #历时tuj = li_List[0].find_all('p',class_='places')[0].text #途经xingc = li_List[0].find_all('p',class_='places')[1].text #行程view = li_List[0].find('span',class_='icon_view').span.text #阅读量love = li_List[0].find('span',class_='icon_love').span.text #点赞数comment = li_List[0].find('span',class_='icon_comment').span.text #评论数print(title,url,user,date,days,tuj,xingc,sep='\n')print(view,love,comment)

完整代码如下:

import requestsfrom bs4 import BeautifulSoupimport time
headers = { 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36',}

info = []for i in range(0,100): print('正在抓取第%s页'%(i+1)) url = 'https://travel.qunar.com/p-sf297541-yunnan-gaikuang-%s#lydp'%(i+1) r = requests.get(url=url, headers=headers) r.encoding = 'utf8' soup = BeautifulSoup(r.text,'html.parser') li_List = soup.find_all('li',class_='list_item') for j in range(0,10): try: com={} com['title'] = li_List[j].find('h3').text #标题 com['url'] = li_List[j].h3.a['href'] #链接 com['user'] = li_List[j].find('span',class_='user_name').text # 作者 com['date'] = li_List[j].find('span',class_='date').text # 出发日期 com['days'] = li_List[j].find('span',class_='days').text #历时 com['tuj'] = li_List[j].find_all('p',class_='places')[0].text #途经 com['xingc'] = li_List[j].find_all('p',class_='places')[1].text #行程 com['view'] = li_List[j].find('span',class_='icon_view').span.text #阅读量 com['love'] = li_List[j].find('span',class_='icon_love').span.text #点赞数 com['comment'] = li_List[j].find('span',class_='icon_comment').span.text #评论数 except: pass info.append(com) time.sleep(4)print('抓取完毕')
结果展示

将得到的数据转为DataFrame的形式,进行一定的处理,首先删除掉缺失值,其次观察抓取下来的阅读量是以“万”为单位的,统一成点赞量、评论量的单位,最后分别寻找阅读量、点赞量、评论量最高的三篇攻略,看是否有相同之处。

import pandas as pdimport redf = pd.DataFrame(info)df = df.dropna().reset_index(drop=True) #重新设置索引df['view'] = df['view'].apply(lambda x: float(re.sub('万','',str(x)))*10000 if str(x).find('万')!=-1 else float(x)) #统一单位df.head()

  • 阅读量最高(84.4万)的攻略为:“人均1300 昆明-丽江九天毕业游”,行程:“金马碧鸡坊>祥云美食城>昆明鑫煌酒店>海埂公园>聂耳墓>滇池>丽江古城区梦之居客栈”,所用时间为8天;

  • 点赞量最高(99)的攻略为:“去大理~一次荡涤心灵的旅行~”,行程:“才村>大理机场>大理站>洱海>苍山>大理海天一客栈>大理才村问海听涛客栈>才村码头”,所用时间为8天;

  • 评论量最高(94)的攻略为:“漫步在大理的“风花雪月”间”,行程:“云南小粒咖啡>大理古城>苍山>五华楼>复兴路>洋人街>四方街>下关>大理站”,所用时间为4天。

由此可见,受到大多数人赞同的云南旅游时间为4~8天,而大理是必不可少的地点,让我们阅读攻略,准备齐全,也去感受一次云南的风花雪月吧。

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



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

往期推文推荐 

"有你才有团"——Stata爬取王者荣耀英雄海报

  爬虫实战|嚣张的徽州宴老板娘错在哪?

如何获取衡量股民情绪的指标?|东方财富股吧标题爬虫

利用Python构建马科维茨有效边界

rangestat,让统计量灵活滚动起来!

听说这样做立项成功率更高哦

如何处理缺失值?这一篇搞定!

  善用dataex命令,高效沟通你我他

  用Markdown制作简历,强力助力你的求职季

大数据下的大学分数线排行榜,快来围观!

《觉醒年代》—带你回到百年前

用Stata画的三维图很奇怪怎么办?

如何随机生成满足特定数据特征的新变量?

爬取无法翻页网页——自然科学基金项目及可视化

爬取京东评论数据进行情感分类

Stata与音乐之间的酷炫连接

这些年,爬虫俱乐部走出的博士们!
         看这里,近五年各校高被引论文上榜名单!

高校经管类核心期刊发文排行榜

疯狂的科研创新加速器——Stata!

  可盐可甜,“粽”有所爱,快来pick你最爱的粽子吧!

  好玩有趣的手绘图形库——cutecharts

  爬虫实战|摩尔庄园微博话题讨论

  一季度财报出炉,哪些公司最烧钱?

  一季度财报出炉,哪些公司最赚钱?

  技能篇 | 图片合并大法

  批量空气质量数据文件合并分析

  Stata17之日期时间新功能

  Stata17之Lasso新功能


关于我们 


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



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

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



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

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