爬取思路:
前两天有网友让我帮忙做一个通过快递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学习问题。为便于交流,点击蓝色自己加入讨论解答资源基地