__author__ = "wangheyang"
import re
import sys, io
import warnings
warnings.filterwarnings("ignore")
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf8')
import pymongo
from airtest.core.api import *
from airtest.core.android.android import *
from airtest.cli.parser import cli_setup
from poco.drivers.android.uiautomation import AndroidUiautomationPoco
class AirTestTrain():
def __init__(self):
# 本地表,留完整备份
client = pymongo.MongoClient()
self.coll = client.get_database('crawler').get_collection('crawler_train_12306_list')
self.exists_list = self.coll.distinct("搜索车次") + self.coll.distinct("search_id")
# 线上mongo链接
self.mongo = pymongo.MongoClient('mongodb://miotech-crawler:Mi0Tech2020@10.120.80.56:27018/admin')
self.tieyou_coll = self.mongo["crawler"]["crawler_tieyou_train_num"] # 铁友总id数据
self.train_id_list = self.tieyou_coll.distinct("train_id", {"start_with_num": "G"})
# 两个目标表
self.train_12306_info = self.mongo["crawler"]["crawler_train_12306_info"]
self.train_12306_station = self.mongo["crawler"]["crawler_train_12306_station"]
self.poco = AndroidUiautomationPoco()
# self.train_id_list = ["G1104"]
if not cli_setup():
auto_setup(__file__, logdir=True,
devices=["android://127.0.0.1:5037/emulator-5554?cap_method=MINICAP&touch_method=MAXTOUCH&", ])
def input_no(self, train_no):
for i in train_no:
self.poco(text=i).click()
def main(self):
start_app("com.MobileTicket")
# # 进入时刻表信息
self.poco(text="时刻表").click()
for search_id in self.train_id_list:
print(search_id)
if search_id in self.exists_list:
continue
time_old = time.time()
try:
input_key = self.poco(textMatches='.*车次号.*')
# if not input_key:
# break
input_key.click()
time.sleep(0.3) # 等待一秒钟确保输入焦点在正确的位置
self.input_no(search_id)
self.poco(text="确认").click()
self.poco(text="查询").click()
time.sleep(0.3)
# 特殊情况处理
if self.poco(textMatches=".*未查询到该车次.*"):
self.coll.insert_one({"搜索车次": search_id, "日期": "未查询到该车次", "入库时间": int(time.time())})
self.poco(name="com.android.systemui:id/back").click()
continue
time.sleep(0.3)
# 特殊情况处理
if self.poco(text="查看其它车次"):
self.coll.insert_one(
{"搜索车次": search_id, "日期": "列车运输组织调整,本日不开行", "入库时间": int(time.time())})
self.poco(text="查看其它车次").click()
continue
# 查找起始站到终点站信息
info = ""
infos = self.poco("trainStatusMsg").children()
for info_ in infos:
if not info_.attr("text"):
for i in info_.children():
if "到达" in i.attr('text'):
info = i.attr('text')
info_data = dict()
yunxingxinxi = dict()
data = re.findall("(\d+月\d+日,.*?),(\d+时\d+分),从(.*?)出发,(\d+时\d+分),到达(.*?),(历时.*)", info)
for match in data:
month_day = match[0]
time_departure = match[1]
departure = match[2]
time_arrival = match[3]
destination = match[4]
duration = match[5]
yunxingxinxi["日期"] = month_day
yunxingxinxi["出发时间"] = time_departure
yunxingxinxi["出发地点"] = departure
yunxingxinxi["到达时间"] = time_arrival
yunxingxinxi["目的地"] = destination
yunxingxinxi["历时"] = duration
self.poco(textMatches=".*G.*经停站.*").swipe([0, -0.45])
current_node = self.poco("trainStatusMsg").sibling("android.view.View").child()[0]
print("-------------")
train_chexiang = dict()
train_jingting_list1 = list()
cheliangxinxi = dict()
element = self.poco(textMatches="展开")
for i in element:
if i.attr("pos")[0] == 0.48333333333333334:
i.click()
for i in current_node.children():
if i.attr("text"):
if i.attr("name") == "android.view.View":
train_attr = i.attr("text")
if "经停站" in train_attr:
info_data["结果车次"] = train_attr.replace("经停站", "")
elif "停留" in train_attr:
train_jingting_list1.append(train_attr)
elif "," in train_attr:
train_attr_key = train_attr.split(",")[0]
train_attr_value = train_attr.split(",")[1]
cheliangxinxi[train_attr_key.strip() + "车"] = train_attr_value.strip()
else:
info_data["车型"] = train_attr
else:
for ii in i.children():
if not ii.attr("text") and ii.attr('name') == 'android.view.View':
if ii.child():
train_chexiang_key, train_chexiang_value = ii.children().attr("text").split("车 ",
1)
train_chexiang[train_chexiang_key] = train_chexiang_value
info_data["车厢信息"] = train_chexiang
info_data["运行信息"] = yunxingxinxi
info_data["车辆信息"] = cheliangxinxi
info_data["经停站信息"] = train_jingting_list1
info_data["搜索车次"] = search_id
info_data["入库时间"] = int(time.time()*1000)
info_data["更新时间"] = int(time.time()*1000)
print(info_data)
time_new = time.time()
time_s = time_new - time_old
info_data["所用时间"] = time_s
self.save_(info_data)
self.coll.insert_one(info_data)
except Exception as e:
print(e)
self.poco(name="android.widget.Button", text="返回").click()
time.sleep(0.3)
def save_(self, data):
# 车辆信息入库
my_data = dict()
my_data["train_num"] = data.get("结果车次")
my_data["train_model"] = data.get("车型")
speed = data.get("车辆信息").get("最高时速车")
my_data["speed"] = float(speed.replace("km/h", "")) if speed else None
my_data["origin"] = data.get("运行信息").get("出发地点")
my_data["destination"] = data.get("运行信息").get("目的地")
result = list()
for k, v in data.get("车厢信息", {}).items():
seat_class, capacity = v.split(" ")
if "/" in seat_class:
seat_class_list = seat_class.split("/")
capacity_list = capacity.split("/")
if len(seat_class_list) == 2:
if len(capacity_list) == 2:
for index, seat_class in enumerate(seat_class_list):
cabin_info_dict = dict()
cabin_info_dict["index"] = k
cabin_info_dict["capacity"] = capacity_list[index].strip()
cabin_info_dict["seat_class"] = seat_class.strip()
result.append(cabin_info_dict)
else:
for index, seat_class in enumerate(seat_class_list):
cabin_info_dict = dict()
cabin_info_dict["index"] = k
cabin_info_dict["capacity"] = capacity_list[0].strip()
cabin_info_dict["seat_class"] = seat_class.strip()
result.append(cabin_info_dict)
else:
cabin_info_dict = dict()
cabin_info_dict["index"] = k
cabin_info_dict["capacity"] = capacity.strip()
cabin_info_dict["seat_class"] = seat_class.strip()
result.append(cabin_info_dict)
my_data["cabin_info"] = result
my_data["update_at"] = data.get("更新时间")
my_data["insert_at"] = data.get("入库时间")
self.train_12306_info.insert_one(my_data) # 车辆信息入库
# 停靠站信息
my_data_station = dict()
my_data_station["train_num"] = data.get("结果车次")
station_list = list()
stations = data.get("经停站信息")
if stations:
for station in stations:
station_list.append(station.split("到达")[1].split(",")[0])
my_data_station["station_info"] = station_list
my_data_station["update_at"] = data.get("更新时间")
my_data_station["insert_at"] = data.get("入库时间")
self.train_12306_station.insert_one(my_data_station) # 停靠站点信息
if __name__ == '__main__':
AirTestTrain12306 = AirTestTrain()
AirTestTrain12306.main()
airtest
最新推荐文章于 2024-06-12 14:09:15 发布