欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python简单实现爬取快递物流实时信息

程序员文章站 2022-04-09 16:33:26
Python爬取快递物流信息:爬取思路:代码分解:完整代码:爬取思路:前两天有网友让我帮忙做通过快递100查快递物流信息的爬虫。研究了一下,发现实现起来不是很复杂,整理成文档并share给大家。大体思路就是,输入运单号后从服务器获取快递公司对应的ID号,然后拼接出新的请求地址来获取相关信息。代码分解:class KuaiDi100(): def __init__(self): self.comCode = "" self.temp = ""...

Python爬取快递物流信息:

爬取思路:

前两天有网友让我帮忙做一个通过快递100这个网站查快递物流信息的爬虫。研究了一下,发现实现起来不是很复杂,在此整理成文档并share给大家。
爬取思路:输入运单号后从服务器获取快递公司对应的ID号,然后拼接出新的请求地址来获取相关信息。


代码分解:

class KuaiDi100():
    def __init__(self):
        self.comCode = ""
        self.temp = ""
        self.url = r"https://www.kuaidi100.com/autonumber/autoComNum?"
        self.headers = {
            'Origin': 'https://www.kuaidi100.com',
            'Referer': 'https://www.kuaidi100.com/?from=openv',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36',
            'X-Requested-With': 'XMLHttpRequest'
        }

新建KuaiDi100类,初始类方法创建comCode和temp两个变量。comCode用来接收服务器返回的快递公司id,temp在请求物流信息时会用到。
headers里需要把’X-Requested-With’: 'XMLHttpRequest’加上。

def GetInfo(self, num):
        self.num = num
        self.form_data = {
            'text': self.num
        }
        ret = requests.post(self.url, headers=self.headers, data=self.form_data)
        find_com = (ret.text.split(",")[2])
        self.comCode = find_com[find_com.find('comCode') + 10:-1]
        self.temp = random.random()
        self.kuaidi_url = 'https://www.kuaidi100.com/query?type={0}&postid={1}&temp={2}&phone='.format(self.comCode, self.num, str(self.temp))
        ret1 = requests.get(self.kuaidi_url, headers=self.headers)
        print(ret1.text)

再创建GetInfo方法用来执行爬虫程序,num传参用来接收快递单号。
用post请求来获取快递公司ID,返回一个字典类型的字符串。提取comCode的方法可能有些不专业,如果大家有更优雅的方法记得告诉我 。
获取temp值这块花了点时间。我查看了JQuery代码,看到math.random()时我有些吃不太准。最后推测是和comCode有关,所以就用random库山寨了一个,结果还真的成功了……
返回的也是字典类型的字符串。不知道大家会怎么提出数据,我是用正则匹配,不知道有没有更好的方法?

if __name__ == '__main__':
    num = str(input("请输入运单号:"))
    kd = KuaiDi100()
    kd.GetInfo(num)

为了单独使用方便,做了个“if __name__ == ‘__main__’”。
结束。


完整代码:

import requests
import random

class KuaiDi100():
    def __init__(self):
        self.comCode = ""
        self.temp = ""
        self.url = r"https://www.kuaidi100.com/autonumber/autoComNum?"
        self.headers = {
            'Origin': 'https://www.kuaidi100.com',
            'Referer': 'https://www.kuaidi100.com/?from=openv',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36',
            'X-Requested-With': 'XMLHttpRequest'
        }



    def GetInfo(self, num):
        self.num = num
        self.form_data = {
            'text': self.num
        }
        ret = requests.post(self.url, headers=self.headers, data=self.form_data)
        find_com = (ret.text.split(",")[2])
        self.comCode = find_com[find_com.find('comCode') + 10:-1]
        self.temp = random.random()
        self.kuaidi_url = 'https://www.kuaidi100.com/query?type={0}&postid={1}&temp={2}&phone='.format(self.comCode, self.num, str(self.temp))
        ret1 = requests.get(self.kuaidi_url, headers=self.headers)
        print(ret1.text)


if __name__ == '__main__':
    num = str(input("请输入运单号:"))
    kd = KuaiDi100()
    kd.GetInfo(num)

基于上述代码,大家后续可以继续优化。比如加个代理池什么的,或者做一些快递单号返回值的判断,用多线程来提高一下效率等等。
本人非码农专业,自学python也没多久,有不对的地方或者有好的建议还请各位前辈耐心指教,谢谢。

本文地址:https://blog.csdn.net/ayowa021/article/details/114001893