爬虫小案例:快递一键查询

通过https://www.kuaidi100.com/来获取数据

# 快递一键查询:通过https://www.kuaidi100.com/来获取数据

import requests,random
from datetime import datetime

flag = True

# 返回时间属于周几
def get_week_day(timestr):
    day = datetime.strptime(timestr, '%Y-%m-%d %H:%M:%S').weekday()

    week_day_dict = {
        0: '星期一',
        1: '星期二',
        2: '星期三',
        3: '星期四',
        4: '星期五',
        5: '星期六',
        6: '星期天',
    }
    return week_day_dict[day]

# 查询快递公司
def query_comCode(postid):
    url = 'https://www.kuaidi100.com/autonumber/autoComNum'
    headers = {
        "origin": "https://www.kuaidi100.com",
        "referer": "https://www.kuaidi100.com/",
        "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36 OPR/65.0.3467.78 (Edition Baidu)",
    }
    # 请求参数
    params = {
        'resultv2': '1',
        'text': postid
    }
    res = requests.get(url, params=params, headers=headers)
    result = False
    if res.status_code == 200:
        json_comCode = res.json()
        # print(json_comCode)
        if 'auto' in json_comCode:
            if len(json_comCode['auto']) <= 0:
                print('快递公司识别错误!请检查快递单号是否输入正确!')
            else:
                # print(json_comCode['auto'])
                for comCode in json_comCode['auto']:
                    # print(comCode['comCode'])
                    # 查询快递进度
                    result = query_progress(comCode['comCode'], postid)
                    if result:
                        break
        else:
            print('遇到错误了:{}'.format(json_comCode))

    else:
        print('查询快递公司:拒绝访问!')

    return result

# 查询快递进度
def query_progress(type = '', postid = ''):
    url = "https://www.kuaidi100.com/query"
    headers = {
        "origin": "https://www.kuaidi100.com",
        "referer": "https://www.kuaidi100.com/",
        "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36 OPR/65.0.3467.78 (Edition Baidu)",
    }
    # 请求参数
    params = {
        'type': type,
        'postid': postid,
        # 'temp': '0.13014571059333613',
        'temp': str(random.random()),
        'phone': ''
    }
    res = requests.get(url, params=params, headers=headers)
    if res.status_code == 200:
        json_data = res.json()
        # print(json_data)
        if json_data['status'] != '200':
            return False
        else:
            # print(json_data['data'])
            return json_data['data']
    else:
        print('查询快递进度:拒绝访问!')

# 打印查询记录
def print_result(result):
    # 倒叙
    result.reverse()

    result2 = []
    pre_week_str = ""
    for item in result:
        # 获取时间点是周几
        cur_week_str = get_week_day(item['ftime'])
        if pre_week_str != cur_week_str:
            pre_week_str = cur_week_str
            show_week_str = pre_week_str
        else:
            show_week_str = ""
        # 增加周几提示
        result2.append('{}{}:{}'.format(item['ftime'], " " + show_week_str, item['context']))

    # 倒叙
    result2.reverse()
    for item in result2:
        print(item)

def again():
    global flag
    inputtext = input('是否要继续查询(输入 n/N:退出程序)')
    if inputtext in ['n', 'N']:
        flag = False

def main():
    # result = query_comCode('73119782411952')
    # result = query_comCode('1222')
    while flag:
        postid = input('请输入快递单号:')
        result = query_comCode(postid)
        if result:
            print_result(result)
        else:
            print('抱歉,暂无查询记录')
        again()
    print('感谢使用,程序已退出!')

main()

 

 

 

posted @ 2020-01-09 14:34  KeenLeung  阅读(928)  评论(0编辑  收藏  举报