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