“五一”出游堪比春运

78 阅读2分钟

最近2天“五一”假期火车票正式开售,作为春节以来第一个真正意义上的小长假,“五一”旅游市场火爆程度受到市场密切关注。根据多家在线旅游平台数据显示,“五一”火车票“卖爆了”。 “五一”抢火车票堪比春运,多条热门线路火车票秒空,旅游订单同比增长超2000%,值得一提的是,近期凭借烧烤出圈的淄博在“五一”假期期间有望成为“顶流”。多个在线旅游平台“五一”期间高铁热门目的地榜单,淄博均位列前十。4月14日、15日两天,“淄博”火车票搜索增幅位居全国第一。不仅是火车票难抢,现在机票,景点门票,酒店预订都越来越难抢到了。现在已经成为了想去哪里玩而是哪里还可以去玩的地步了。 “五一”出游热城市,景点肯定是大家的首选,但是太热门的地方可能玩的不会很尽兴,因为都是人挤人。。作为网络索引擎组成之一。爬虫可以有效的帮助我们搜索和爬取有用的信息,减少很多的烦恼,比如这里我们可以通过python对马蜂窝数据的搜集和爬取整理出一份适合出游又很比较冷门的景点,这样可以给大家出游前有更多的选择。 直接用爬虫程序访问网站会返回521, 因为网站采用了js加密反爬. 其实就是一个js逆向问题, 我们看到的是521, 实际上是进行了三次访问. 每次访问需要带上上一次的cookie。不仅有js逆向网站还限制ip的多次访问,所以这里我们的解决办法就是爬虫程序加上优质代理ip并带上cookie一起去爬取。实现过程如下:

  #! -*- encoding:utf-8 -*-
        import base64            
        import sys
        import random

        PY3 = sys.version_info[0] >= 3

        def base64ify(bytes_or_str):
            if PY3 and isinstance(bytes_or_str, str):
                input_bytes = bytes_or_str.encode('utf8')
            else:
                input_bytes = bytes_or_str

            output_bytes = base64.urlsafe_b64encode(input_bytes)
            if PY3:
                return output_bytes.decode('ascii')
            else:
                return output_bytes

        class ProxyMiddleware(object):                
            def process_request(self, request, spider):
                # 代理服务器(产品官网 www.16yun.cn)
                proxyHost = "t.16yun.cn"
                proxyPort = "31111"

                # 代理验证信息
                proxyUser = "16IFRWCZ"
                proxyPass = "254565"

                # [版本>=2.6.2](https://docs.scrapy.org/en/latest/news.html?highlight=2.6.2#scrapy-2-6-2-2022-07-25)无需添加验证头,会自动在请求头中设置Proxy-Authorization     
                request.meta['proxy'] = "http://{0}:{1}@{2}:{3}".format(proxyUser,proxyPass,proxyHost,proxyPort)

                # 版本<2.6.2 需要手动添加代理验证头
                # request.meta['proxy'] = "http://{0}:{1}".format(proxyHost,proxyPort)
                # request.headers['Proxy-Authorization'] = 'Basic ' +  base64ify(proxyUser + ":" + proxyPass)                    

                # 设置IP切换头(根据需求)
                # tunnel = random.randint(1,10000)
                # request.headers['Proxy-Tunnel'] = str(tunnel)

                # 每次访问后关闭TCP链接,强制每次访问切换IP
                request.header['Connection'] = "Close"