zoukankan      html  css  js  c++  java
  • Python爬取指定重量的快递价格

    [TOC]

    背景:现在这个时代,快递横飞。我们想寄一个快递,给出的选择也是多种多样的(根据快递的大小、送达的时间、寄送的距离及价格、公司服务质量,来选择不同的快递[物流]公司)。往往合适的事情选择合适的方式,这才是最完美的。

    需求:想寄一个大概 20 kg左右的包裹,不知道选择哪个快递公司最合适,有个各大快递公司快递信息以及价格目录表就爽歪歪了。

    思路:获取各大快递物流公司查询接口,传入寄件地和目的地,以及重量。解析查询的返回结果,打印相关信息就ok了。

    撸起袖子干,找到了一个各大快递公司运费价格查询的网址 快递窝(窃喜~~由于本人比较懒,省了好多事)

    一、获取查询接口

    F12 打开调试工具,选择NetWork选项,在对应输入框内输入相关信息,点击结果。查看 Request URL

    二、获取相关数据

    NetWork中查看 Form Data数据,分析数据所代表的含义

    三、编写爬虫脚本

    使用Python3.6编写脚本

    """
    @author  : zzw
    @time    : 2018/5/10 21:55
    @file    : queryprice.py
    """
    
    import urllib.request
    import urllib.parse
    import json
    import re
    import requests
    
    
    class QueryPrice(object):
        # 初始化: who 对应的快递公司id; weight寄出物品的重量kg
        def __init__(self, who, weight):
            self.who = int(who)
            self.weight = int(weight)
            self.url = "http://www.kuaidiwo.cn/freight/ajaxjg.php"
    
        # 获取服务器响应
        def get_response(self):
            headers = {
                'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) Chrome/63.0.3239.26 QQBrowser/10.0.1125.400'
            }
            data = {
                'expid': self.who,
                'provinceid': 9,    # 上海id
                'cityid': 155,      # 浦东id
                'toprovinceid': 1,  # 北京id
                'tocityid': 41,     # 朝阳id
                'weight': self.weight
            }
            # 使用requests 更加简洁
            html = requests.post(self.url, data, headers).text
            '''data = urllib.parse.urlencode(data, encoding='utf-8') # 将data数据编码为 utf-8
            req = urllib.request.Request(self.url, data, headers)  # 封装请求信息
            resp = urllib.request.urlopen(req)  # 发送请求
            html = resp.read().decode('utf-8') # 将utf-8解码为 Unicode
            '''
            # print(html)
            return html
    
        # 解析返回的结果
        def get_result(self):
            first = '上海浦东--> 北京朝阳  %dkg物品运费为:' % self.weight
            html = self.get_response()
            info = json.loads(html)
            if info['data'] and info['jg']:
                result1 = first + "%s 元	%s " % (info['jg'], info['data'][0]['name'])
                # print(result)
                return result1
            else:
                result2 = first + "{0} 元	未查询到此快递公司 id={1}".format(info['jg'], self.who)
                return str(result2)
    
    
    if __name__ == '__main__':
        prices = []
        for i in range(1, 50):
            q = QueryPrice(i, 20)
            result = q.get_result()
            price = int(re.findall(r'(d+)s元', result)[0])
            if price != 0:
                print(result)
                prices.append(price)
        print('最便宜价格为:%s 
    最贵的价格为:%s' % (min(prices), max(prices))) 
    

    四、查看查询效果

    查询的是前50个id(快递公司)的价格目录表,有些便宜的无法想象,有些贵的离谱。当然还是那句话,合适的服务合适的价格才是我们最合适的选择。
    写在最后: 虽然查询出了这么多快递公司,甚至还有些听都没听过,但是这些快递(物流)公司的的价格也有些偏差。这里又要说到一些快递公司的乱收取费用的事了,有些公司在官网连个明码标价的都没有,个别区域就看心情和情况收费。

  • 相关阅读:
    不要控制!
    【转】iframe页面跳转时,导致父页面滚动!该怎么解决?
    【转】XML 特殊字符处理
    【转】使用Log4Net进行日志记录
    【转】JS获取浏览器可视区域的尺寸
    【转】Winform程序未捕获异常解决方法 EventType clr20r3 P1
    【转】VMware Tools installation cannot be started manually while Easy Install is in progress.
    如何解决安装VMware后郑广电宽带客户端不能登录的问题?
    MVC中的M是ViewModel不是EntityModel!
    纸上原型--纸上草稿设计--简单高效的沟通方式!
  • 原文地址:https://www.cnblogs.com/zeo-to-one/p/9465176.html
Copyright © 2011-2022 走看看