闲来无事,写个脚本爬一下快递信息
- 多线程爬取:可以使用Python中的多线程或异步IO技术来加速爬取速度,提高效率。
- 自动识别快递公司:可以通过输入的快递单号自动识别快递公司,然后根据不同公司的网站结构来爬取相应的信息。
- 数据存储:可以将爬取的数据存储到数据库或者文件中,方便后续的分析和使用。
- 可视化展示:可以使用Python中的数据可视化库,将爬取的数据可视化展示出来,方便用户查看和分析。
- 自动重试:可以在网络连接不稳定或者请求失败时自动重试,提高爬取成功率。
- 验证码识别:当出现验证码时,可以使用Python中的验证码识别库,自动识别验证码并输入,避免手动输入验证码的麻烦。
import requests
from bs4 import BeautifulSoup
import threading
import time
import random
import os
import re
import json
from PIL import Image
import pytesseract
import pymongo
import matplotlib.pyplot as plt# 定义线程数和线程锁
thread_num = 10
lock = threading.Lock()# 定义快递公司列表和快递公司匹配正则表达式
express_companies = {"shunfeng": {"name": "顺丰速运","regex": "^SF\d{12}$"},"yuantong": {"name": "圆通速递","regex": "^[A-Za-z0-9]{12}$"},"zhongtong": {"name": "中通快递","regex": "^[A-Za-z0-9]{12}$"},"yunda": {"name": "韵达快递","regex": "^120\d{11}$"}
}# 定义MongoDB客户端
client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["express"]
collection = db["tracking_info"]# 定义请求头
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36"
}# 定义验证码识别函数
def recognize_captcha(captcha_path):image = Image.open(captcha_path)captcha = pytesseract.image_to_string(image)captcha = re.sub(r"\W", "", captcha)return captcha# 定义爬取函数
def crawl(tracking_number):# 自动识别快递公司company = Nonefor key, value in express_companies.items():if re.match(value["regex"], tracking_number):company = keybreakif not company:print(f"未知快递公司,快递单号为:{tracking_number}")returnprint(f"开始爬取 {express_companies[company]['name']} 的快递信息,快递单号为:{tracking_number}")# 发送请求url = f"https://www.sf-express.com/sf-service-web/service/bills/{tracking_number}"response = requests.get(url, headers=headers)# 验证码识别if "验证码" in response.text:print(f"需要输入验证码,快递单号为:{tracking_number}")# 提取验证码图片链接soup = BeautifulSoup(response.text, "html.parser")captcha_url = soup.select_one(".captcha img")["src"]captcha_path = f"./captcha/{tracking_number}.png"# 下载验证码图片response = requests.get(captcha_url, headers=headers)with open(captcha_path, "wb") as f:f.write(response.content)# 识别验证码captcha = recognize_captcha(captcha_path)# 删除验证码图片os.remove(captcha_path)# 构造请求参数data = {"captcha": captcha,"billNo": tracking_number}response = requests.post(url, headers=headers, data=data)# 解析网页内容并保存到MongoDBsoup = BeautifulSoup(response.text, "html.parser")status_list = soup.select(".status-list li")tracking_info = []for status in status_list:date = status.select_one(".date").text.strip()time = status.select_one(".time").text.strip()location = status.select_one(".location").text.strip()status_desc = status.select_one(".status-desc").text.strip()tracking_info.append({"date": date,"time": time,"location": location,"status_desc": status_desc})data = {"tracking_number": tracking_number,"company": express_companies[company]["name"],"tracking_info": tracking_info}collection.insert_one(data)print(f"{tracking_number} 的快递信息已保存到MongoDB")# 可视化展示dates = [info["date"] for info in tracking_info]times = [info["time"] for info in tracking_info]status_descs = [info["status_desc"] for info in tracking_info]plt.plot(dates, status_descs)plt.title(f"{express_companies[company]['name']} 快递单号:{tracking_number}")plt.xlabel("日期")plt.ylabel("快递状态")plt.xticks(rotation=45)plt.show()# 定义线程函数
def thread_func(tracking_numbers):for tracking_number in tracking_numbers:crawl(tracking_number)time.sleep(random.randint(1, 3))# 主函数
if __name__ == "__main__":# 读取快递单号with open("tracking_numbers.txt", "r") as f:tracking_numbers = f.read().splitlines()# 分配任务给线程threads = []for i in range(thread_num):start = i * len(tracking_numbers) // thread_numend = (i + 1) * len(tracking_numbers) // thread_numthread = threading.Thread(target=thread_func, args=(tracking_numbers[start:end],))threads.append(thread)# 启动线程for thread in threads:thread.start()# 等待线程结束for thread in threads:thread.join()# 输出爬取结果print("爬取完成")
这个代码实现了:
多线程爬取:通过定义线程数和线程锁来实现多线程爬取,加速爬取速度。
自动识别快递公司:通过定义快递公司列表和快递公司匹配的正则表达式来实现自动识别快递公司。
数据存储:通过连接MongoDB数据库,并定义数据结构,将爬取的快递信息保存到MongoDB中。
可视化展示:通过使用matplotlib库,将爬取的快递信息进行数据可视化展示。
自动重试:虽然没有在代码中体现,但是可以加入重试机制,当网络连接不稳定或者请求失败时自动重试。
验证码识别:当出现验证码时,通过下载验证码图片,使用pytesseract库进行验证码识别,自动输入验证码。
需要注意的是,这个示例代码只是一个简单的爬虫示例,实际的爬虫任务可能更加复杂。在实际的爬虫开发中,需要根据具体的场景和需求来选择使用哪些技术和工具来完成爬虫任务。
闲来无事,写个脚本爬一下快递信息相关推荐
- python 学习笔记 12 -- 写一个脚本获取城市天气信息
近期在玩树莓派,前面写过一篇在树莓派上使用1602液晶显示屏,那么可以显示后最重要的就是显示什么的问题了. 最easy想到的就是显示时间啊,CPU利用率啊.IP地址之类的.那么我认为呢,假设可以显示当 ...
- 教你如何用Python追踪快递信息!
本文讲解的是如何让python自动为你查询快递信息,并在物流发生更新或者到达指定地点时第一时间将物流推送至你的邮箱. 其实并不复杂,只需要两大步即可搞定: 1.爬取物流动态信息 2.将信息推送至邮箱 ...
- 教你如何用Python追踪快递信息
本文讲解的是如何让python自动为你查询快递信息,并在物流发生更新或者到达指定地点时第一时间将物流推送至你的邮箱. 其实并不复杂,只需要两大步即可搞定: 1.爬取物流动态信息 2.将信息推送至邮箱 ...
- python爬取网页信息
最近在学习python,发现通过python爬取网页信息确实方便,以前用C++写了个简单的爬虫,爬取指定网页的信息,代码随便一写都几百行,而要用python完成相同的工作,代码量相当少.前几天看到了一 ...
- shell写的检测linux系统硬件信息的脚本
前面用python写了一个检测windonws硬件信息的脚本,这里是很久之前用shell写的一个linux系统硬件信息检测脚本,可以对照看一下.检测内容基本一样:操作系统信息.内存.CPU.硬盘分区及 ...
- 爬虫爬取快递100网查快递信息
这个是爬静态网页巩固练习的第二个小小小小小小项目,爬快递100网站查快递信息,这个其实很简单,本身这个网站就已经把该做的能做的都做好了,只需要把特定的信息提取出来就可以了,本次代码的编写过程让我意识到 ...
- 利用脚本动态爬取网页信息
利用脚本动态爬取网页信息 编译环境:Jupyter Notebook (Anaconda3) 调用的包:selenium,webdrive,webdriver_manager 文章目录 利用脚本动态爬 ...
- java 爬取快递100 快递信息
目前有两个查询方式. 1. 通过 快递单号自动匹配快递公司 信息. 2. 通过 快递公司编码 和 快递单号 获取物流信息. Code ExpressSearchUtils - 快递查询工具类 impo ...
- python summary_利用python爬取新闻信息
简介 所谓爬虫,就是按照一定的规则,自动的从网络中抓取信息的程序或者脚本.万维网就像一个巨大的蜘蛛网,我们的爬虫就是上面的一个蜘蛛,不断的去抓取我们需要的信息.今天我们学习如何抓取网络数据,对数据进行 ...
最新文章
- ie8开发人员工具无法使用,按f12任务栏里出现任务,但是窗体不弹出
- JavaScript高级程序设计-读书笔记(6)
- RTMP协议发送H.264编码及AAC编码的音视频,实现摄像头直播
- python循环一百次_python循环
- 备份类型 事务日志_SQL SERVER备份策略
- SQL Server着眼于非数字数据类型
- OpenCV——CvMatchShapes函数
- python教程视频-私藏已久的7个Python视频教程
- 月薪三万,依然买不起房
- Kafka 源码环境搭建
- 天猫整站(简易版)SSM(十四)需要登录才能使用的功能
- 基于python爬虫下载网站在线视频
- 招商银行笔试题 公司年会
- 怎样把WORD表格转换成EXCEL
- video.js 视频播放插件使用
- linux桌面系统 5种经典的Linux桌面系统
- 一个新的项目:狼人杀
- 彻底解决烦人的win10更新
- 视图的概念、特点及使用
- python——列表
热门文章
- (附源码)spring boot社区疫苗接种管理系统 毕业设计 281442
- 负载均衡设备哪家好?最好是能适用于金融业的
- Canny算子实现边缘特征提取
- 数据中台即服务——数据中台的四大支柱
- MySQL Longtext字段优化记录(一)
- 华为自研CPU性能大爆发,新机Mate20代号“喜马拉雅”
- 利用ggplot画分组柱状图的方法
- Kriging 克里金算法Java实现
- 8张采用1280*1024计算机,一幅分辨率为1280*1024的8:8:8的RGB彩色图像,其容量大致为...
- 光栅化 Rasterization