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'

        }

1234567891011

新建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)

123456789101112

再创建GetInfo方法用来执行爬虫程序,num传参用来接收快递单号。

用post请求来获取快递公司ID,返回一个字典类型的字符串。提取comCode的方法可能有些不专业,如果大家有更优雅的方法记得告诉我 。

获取temp值这块花了点时间。我查看了JQuery代码,看到math.random()时我有些吃不太准。最后推测是和comCode有关,所以就用random库山寨了一个,结果还真的成功了……

返回的也是字典类型的字符串。不知道大家会怎么提出数据,我是用正则匹配,不知道有没有更好的方法?

if __name__ == '__main__':

    num = str(input("请输入运单号:"))

    kd = KuaiDi100()

    kd.GetInfo(num)

1234

为了单独使用方便,做了个“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)

1234567891011121314151617181920212223242526272829303132333435

基于上述代码,大家后续可以继续优化。比如加个代理池什么的,或者做一些快递单号返回值的判断,用多线程来提高一下效率等等。

本人非码农专业,自学python也没多久,有不对的地方或者有好的建议还请各位前辈耐心指教,谢谢。

近期有很多朋友通过私信咨询有关Python学习问题。为便于交流,点击蓝色自己加入讨论解答资源基地

你可能感兴趣的:(Python简单实现爬取快递物流实时信息!到了及时提醒!)