查看原文
其他

查什么攻略?百行 Python 代码告诉你国庆哪些景点爆满!

zone7 CSDN 2018-10-26

作者 | zone7

责编 | 郭芮

举国欢庆的国庆节马上就要到来了,你想好去哪里看人山人海了吗?还是窝在家里充电学习呢?说起国庆,塞车与爆满这两个词必不可少,但是如果能提前知道哪些景点爆满就不用人挤人地去凑热闹了。本文即用 Python 抓取了有关国庆出行方面的数据,希望给你的假期提供些帮助。

一开始,笔者以为要抓取出行方面的数据挺简单,直接去看看携程旅游、马蜂窝这类网站看看有没有数据抓取就好。但是实际上这些网站并没有比较好的格式化数据供我们抓取(当然或许是我没找到办法......)。但是出行肯定会查找相关的出行攻略,那么关键词就是一个突破口,可以查询百度指数来看看哪些景点被查询的次数最多,那么就可以大概知道哪些景点会爆满了。


统计结果


此次的统计结果只是从侧面反映景点爆满的问题,未必是完全准确的,仅供参考。此次统计的景点共有 100 个:

不出意外,桂林、三亚、泰山的搜索量都是杠杠的,这第一梯队的地方能不去就别去了,去了也是人山人海的,爆满是无疑的了。

第二梯队的搜索量也不差,日均搜索量还是上万的,谨慎行动。

第三梯队下来就可以考虑考虑,为了避免不必要的塞车与等待,建议大家还是待在家里吧......

第四梯队应该没太大的问题,建议出去溜达溜达。

都到第五梯队了,就可以放心地玩耍了。经历了那么多的烦心事,是该好好放飞一下自己了。


爬虫技术分析及具体实现


本次爬取过程中用的的数据工具如下:

  • 请求库:selenium

  • HTML 解析:使用正则匹配

  • 数据可视化:pyecharts

  • 数据库:MongoDB

  • 数据库连接:pymongo

首先是选取爬虫来源,携程与马蜂窝没有结构化的数据,我们就换一种思路。首先是想到百度指数,如图:

但是分析源代码之后,你就会发现问题了......它的数据都是以图片展示的,你不能直接获取到源码。考虑到国庆马上就要到来,我换了一个指数平台,转战搜狗指数,这个平台可以直接获取到源数据,关键是还有微信热度可以爬取。当然,你执意要使用百度指数也是有方法的,抓取到数据之后,使用图像识别来识别文中的数据即可,这里就不展开了。

关于数据清洗方面,这里筛选了数据量过小和数据量异常大的景点:

# 这是数据展示的代码片段
def show_data(self):
    for index in range(5):
        queryArgs = {"day_avg_pv": {"$lt"100000}}
        rets = self.zfdb.national_month_index.find(queryArgs).sort("day_avg_pv", pymongo.DESCENDING).limit(10).skip(index*10)
        atts = []
        values = []
        file_name = "top" + str(index * 10) + "-" + str((index + 1) * 10) + ".html"
        for ret in rets:
            print(ret)
            atts.append(ret["address"])
            values.append(ret["day_avg_pv"])
        self.show_line("各景点 30 天内平均搜索量", atts, values)
        os.rename("render.html", file_name)

由于篇幅原因,这就只展示部分主要代码:

# 这是数据爬取的代码片段
def get_index_data(self):
    try:
        for url in self.get_url():
            print("当前地址为:" + url)
            self.browser.get(url)
            self.browser.implicitly_wait(10)
            ret = re.findall(r'root.SG.data = (.*)}]};', self.browser.page_source)
            totalJson = json.loads(ret[0] + "}]}")
            topPvDataList = totalJson["topPvDataList"]
            infoList = totalJson["infoList"]
            pvList = totalJson["pvList"]
            for index, info in enumerate(infoList):
                for pvDate in pvList[index]:
                    print("index => "+str(index)+"地址 => "+info["kwdName"] + "日期 => " + str(pvDate["date"]) + " => " + str(pvDate["pv"]) + " => " + str(
                        info["avgWapPv"]) + " => " + str(info["kwdSumPv"]["sumPv"]) + " => ")
                    self.zfdb.national_day_index.insert({
                        "address": info["kwdName"],  # 地名
                        "date": pvDate["date"],  # 日期
                        "day_pv": pvDate["pv"],  # 日访问量
                    })
                self.zfdb.national_month_index.insert({
                    "address": info["kwdName"],  # 地名
                    "day_avg_pv": info["avgWapPv"],  # 平均访问量
                    "sum_pv": info["kwdSumPv"]["sumPv"],  # 总访问量
                })
    except :
        print("exception")

整篇爬虫文章分析到这里就结束了。最后祝大家假期愉快,不用写代码。

作者:zone7,一只爱折腾的后端攻城狮,爱写作爱分享。

声明:本文首发于公众号 zone7,作者投稿,版权归对方所有。

微信改版了,

想快速看到CSDN的热乎文章,

赶快把CSDN公众号设为星标吧,

打开公众号,点击“设为星标”就可以啦!


征稿啦

CSDN 公众号秉持着「与千万技术人共成长」理念,不仅以「极客头条」、「畅言」栏目在第一时间以技术人的独特视角描述技术人关心的行业焦点事件,更有「技术头条」专栏,深度解读行业内的热门技术与场景应用,让所有的开发者紧跟技术潮流,保持警醒的技术嗅觉,对行业趋势、技术有更为全面的认知。

如果你有优质的文章,或是行业热点事件、技术趋势的真知灼见,或是深度的应用实践、场景方案等的新见解,欢迎联系 CSDN 投稿,联系方式:微信(guorui_1118,请备注投稿+姓名+公司职位),邮箱(guorui@csdn.net)。

推荐阅读:

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

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