两个py文件交互使用,我电脑上运行没问题,运行该程序会在D盘创建一个xiaomi.json用于保存相应的数据,免得下次使用还要获取一次,里面数据获取速度根据自己的网速决定,requests爬虫都要考虑到速度,下载链接可以用于迅雷、idm、ndm等,不对下载速度做保证。
import wx import os import sys import json from 爬系统 import requests_xiaomi, requests_root, requests_num, requests_url def on_restart_click(self, event): if hasattr(sys, 'frozen'): executable = sys.executable else: executable = sys.executable os.execl(executable, executable, *sys.argv) def get_mid_string(html, start_str, end): try: start = html.find(start_str) if start >= 0: start += len(start_str) end = html.find(end, start) if end >= 0: return html[start:end].strip() except: return None file_path = r'D:\xiaomi.json' if not os.path.exists(file_path): requests_xiaomi(file_path) jixing_list = [] with open(file_path, 'r', encoding='utf-8') as f: stored_paragraphs = json.load(f) for i in range(0, 10000): try: jixing_list.append(stored_paragraphs[i]['机型']) except IndexError: break device_versions = {item["机型"]: item["系统版本"] for item in stored_paragraphs} class Frame(wx.Frame): url = '' def __init__(self): wx.Frame.__init__(self, None, title='', size=(580, 300), name='frame', style=541072384) self.启动窗口 = wx.Panel(self) self.Centre() vbox = wx.BoxSizer(wx.VERTICAL) self.组合框1 = wx.ComboBox(self.启动窗口, value='', pos=(115, 59), name='comboBox1', choices=jixing_list, style=wx.CB_DROPDOWN | wx.EXPAND) self.组合框1.Bind(wx.EVT_TEXT, self.on_text_changed) self.组合框1.Bind(wx.EVT_COMBOBOX, self.on_combobox_select) self.组合框1.Bind(wx.EVT_COMBOBOX_DROPDOWN, self.组合框1_弹出列表项) self.组合框1.Bind(wx.EVT_COMBOBOX_CLOSEUP, self.组合框1_收起列表项) self.组合框1.SetSize((147, 22)) # 设置宽度为147 vbox.Add(self.组合框1, proportion=0, flag=wx.ALL | wx.EXPAND, border=10) self.ignore_text_change = False self.组合框2 = wx.ComboBox(self.启动窗口, value='', pos=(115, 98), name='comboBox2', choices=[], style=16) self.组合框2.SetSize((147, 22)) self.组合框2.Bind(wx.EVT_COMBOBOX_DROPDOWN, self.组合框2_弹出列表项) self.组合框2.Bind(wx.EVT_COMBOBOX, self.组合框2_选中列表项) self.标签1 = wx.StaticText(self.启动窗口, size=(39, 16), pos=(32, 63), label='机型', name='staticText', style=2321) self.标签2 = wx.StaticText(self.启动窗口, size=(56, 16), pos=(23, 101), label='某国系统', name='staticText', style=2321) self.标签3 = wx.StaticText(self.启动窗口, size=(101, 24), pos=(2, 140), label='开发板/稳定版', name='staticText', style=2321) self.组合框3 = wx.ComboBox(self.启动窗口, value='', pos=(115, 137), name='comboBox3', choices=[], style=16) self.组合框3.SetSize((147, 22)) self.组合框3.Bind(wx.EVT_COMBOBOX_CLOSEUP, self.组合框3_收起列表项) self.标签4 = wx.StaticText(self.启动窗口, size=(80, 24), pos=(12, 178), label='系统版本号', name='staticText', style=2321) self.组合框4 = wx.ComboBox(self.启动窗口, value='', pos=(115, 174), name='comboBox4', choices=[], style=16) self.组合框4.SetSize((147, 22)) self.组合框4.Bind(wx.EVT_COMBOBOX_CLOSEUP, self.组合框4_收起列表项) self.编辑框1 = wx.TextCtrl(self.启动窗口, size=(248, 215), pos=(296, 25), value='下载链接', name='text', style=wx.TE_MULTILINE|wx.TE_WORDWRAP|wx.TE_READONLY) self.按钮1 = wx.Button(self.启动窗口, size=(80, 32), pos=(172, 212), label='确认', name='button') self.按钮1.Bind(wx.EVT_BUTTON, self.按钮1_按钮被单击) self.按钮2 = wx.Button(self.启动窗口, size=(80, 32), pos=(81, 211), label='刷新', name='button') self.按钮2.Bind(wx.EVT_BUTTON, self.按钮2_按钮被单击) self.标签5 = wx.StaticText(self.启动窗口,size=(79, 24),pos=(1, 215),label='刷新json文件',name='staticText',style=2321) def 组合框1_收起列表项(self, event): self.ignore_text_change = False def 组合框1_弹出列表项(self, event): self.组合框1.AppendItems(jixing_list) def on_text_changed(self, event): if self.ignore_text_change: return text = self.组合框1.GetValue().lower() matched_options = [option for option in jixing_list if text in option.lower()] self.ignore_text_change = True self.组合框1.Set(matched_options) self.组合框1.SetValue(text) self.组合框1.SetInsertionPointEnd() self.ignore_text_change = False def on_combobox_select(self, event): self.ignore_text_change = True selected_value = self.组合框1.GetStringSelection() self.组合框1.SetValue(selected_value) def 组合框2_弹出列表项(self, event): self.组合框2.Clear() self.组合框2.SetItems(list(device_versions.get(self.组合框1.GetValue()))) def 组合框2_选中列表项(self, event): phone = self.组合框1.GetValue() contry = self.组合框2.GetValue() self.组合框3.SetItems(requests_root(file_path,phone, contry)) def 组合框3_收起列表项(self, event): phone = self.组合框1.GetValue() contry = self.组合框2.GetValue() banben_root = self.组合框3.GetValue() version_list = requests_num(file_path,phone, contry, banben_root) if version_list: self.组合框4.SetItems(version_list[0]) def 组合框4_收起列表项(self, event): phone = self.组合框1.GetValue() contry = self.组合框2.GetValue() banben_root = self.组合框3.GetValue() text =requests_num(file_path,phone, contry, banben_root)[1]#[0] #print(text) if self.组合框3.GetValue() not in "稳定版": url1 = 'https://xiaomirom.com/download/' + get_mid_string(text, '/download/', '-stable-') + '-weekly-' + self.组合框4.GetValue().strip() + '/#china-recovery' else: url1 = 'https://xiaomirom.com/download/' + get_mid_string(text, '/download/','-stable-') + '-stable-' + self.组合框4.GetValue().strip() + '/#china-recovery' self.url = requests_url(url1) def 按钮1_按钮被单击(self, event): self.编辑框1.SetValue("\n\n".join(self.url)) def 按钮2_按钮被单击(self, event): requests_xiaomi(file_path) on_restart_click(self, event) class myApp(wx.App): def OnInit(self): self.frame = Frame() self.frame.Show(True) return True if __name__ == '__main__': app = myApp() app.MainLoop()
import requests from lxml import html,etree import json import os import re import sys from bs4 import BeautifulSoup req = requests.session() def on_restart_click(self, event): if hasattr(sys, 'frozen'): executable = sys.executable else: executable = sys.executable os.execl(executable, executable, *sys.argv) def get_rom_url(file_path,device_name, version_name): with open(file_path, 'r', encoding='utf-8') as f: data = json.load(f) for device in data: if device["机型"] == device_name: return device["系统版本"].get(version_name, "版本名未找到") return "机型未找到" def requests_xiaomi(file_path): data = [] a = req.get('https://xiaomirom.com/series/') a.encoding = 'utf-8' tree = html.fromstring(a.content) for i in range(1, 1000): jixing = tree.xpath(f'/html/body/section/div/div[2]/div[1]/div[1]/dl/dt[{i}]/a/text()') if not jixing: break jixing_name = jixing[0].strip() version_list = {} for a in range(1, 10): xitongbanben = tree.xpath(f'/html/body/section/div/div[2]/div[1]/div[1]/dl/dd[{i}]/a[{a}]/text()') xitong_url = tree.xpath(f'/html/body/section/div/div[2]/div/div[1]/dl/dd[{i}]/a[{a}]/@href') if not xitongbanben: break version_list[xitongbanben[0].strip()] = xitong_url[0].strip() data.append({"机型": jixing_name, "系统版本": version_list}) with open(file_path, 'w', encoding='utf-8') as json_file: json.dump(data, json_file, ensure_ascii=False, indent=4) def requests_root(file_path,phone, country): with open(file_path, 'r', encoding='utf-8') as f: data = json.load(f) url = None for item in data: if item["机型"] == phone: system_versions = item["系统版本"] if country in system_versions: url = system_versions[country] break if not url: return None req = requests.session() a = req.get(url) a.encoding = 'utf-8' tree1 = html.fromstring(a.content) no_root = tree1.xpath( '/html/body/section/div[1]/div/div/div[2]/section/div/div/div[1]/div/div/ul/li[1]/a/span/text()') root = tree1.xpath('/html/body/section/div[1]/div/div/div[2]/section/div/div/div[2]/div/div/ul/li[2]/a/span/text()') if root and int(root[0]) != 0: root_list=['稳定版', '开发版/内测版'] else: root_list=['稳定版'] return root_list xitong_root=[] def requests_num(file_path,phone, country,banban_root): req = requests.session() #print(get_rom_url(phone,country)) a = req.get(get_rom_url(file_path,phone,country)) a.encoding = 'utf-8' parse_html = etree.HTML(a.text) c = parse_html.xpath('//strong/text()') del c[:5] xi_list = [] for i in c: if "下载" in i: i = i.replace("下载", "") xi_list.append(i) else: xi_list.append(i) result_dict = {} grouped_data = [xi_list[i:i + 3] for i in range(0, len(xi_list), 3)] for group in grouped_data: if group and len(group) == 3: if 'Fastboot' not in group[0]: key = group[1] value = group[2] if key in result_dict: result_dict[key].append(value) else: result_dict[key] = [value] key_to_find = banban_root values=None if key_to_find in result_dict: values = result_dict[key_to_find] soup = BeautifulSoup(a.content, 'html.parser') text_to_find = '下载' links = [] for a in soup.find_all('a', string=text_to_find): href = a.get('href') if href: links.append(href) href=links[0] return values,href def requests_url(text): a=req.get(text) a.encoding='urf-8' soup = BeautifulSoup(a.content, 'html.parser') buttons = soup.find_all('button', class_='btn btn-warning') download_links = [] for button in buttons: onclick_value = button.get('onclick', '') link_start = onclick_value.find("'") + 1 link_end = onclick_value.find("'", link_start) download_link = onclick_value[link_start:link_end] download_links.append(download_link) for link in download_links: if ".zip" in link: s=re.search(r'\.com/(.*)', link).group(1) s1='https://bn.d.miui.com/'+s s2='https://cdnorg.d.miui.com/'+s s3='https://bkt-sgp-miui-ota-update-alisgp.oss-ap-southeast-1.aliyuncs.com/'+s return link,s1,s2,s3
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。