ArkTS是华为为HarmonyOS(鸿蒙操作系统)生态量身打造的开发语言,旨在成为构建分布式应用的核心工具。作为TypeScript的超集(Superset),它在保留TypeScript静态类型、面向对象特性的基础上,深度融合了HarmonyOS的跨设备能力与高性能渲染机制。
ArkTS并非简单的语法扩展,而是针对HarmonyOS进行了运行时强化和API扩展。开发者可无缝使用TypeScript生态工具(如ESLint、WebStorm),但需注意部分HarmonyOS原生能力(如@ohos
接口)仅在ArkTS运行时环境中生效。
# 所需库安装
pip install requests pygithub pandas gitpython
from github import Github
# 创建GitHub实例(建议使用Token认证)
ACCESS_TOKEN = "your_github_token"
g = Github(ACCESS_TOKEN, per_page=100)
def search_arkts_repos():
# 构建搜索查询(包含语言过滤)
query = "ArkTS language:TypeScript"
# 执行搜索
repos = g.search_repositories(query, sort="stars", order="desc")
# 提取关键信息
results = []
for repo in repos:
if repo.license and "MIT" in repo.license.name:
results.append({
"name": repo.full_name,
"url": repo.clone_url,
"stars": repo.stargazers_count,
"license": repo.license.spdx_id,
"updated": repo.updated_at
})
return pd.DataFrame(results)
# 保存检索结果
df = search_arkts_repos()
df.to_csv("arkts_repos.csv", index=False)
# 读取示例
top_repos = df[df['stars'] > 100].sort_values('updated', ascending=False)
使用GitPython批量克隆
from git import Repo
import os
import traceback # 添加错误追踪
def clone_repos(df, save_dir="repos", max_retries=3):
"""
批量克隆Git仓库的强化实现
:param df: 包含仓库信息的DataFrame(需含'url'和'name'列)
:param save_dir: 本地存储目录(默认repos)
:param max_retries: 单仓库最大重试次数
"""
os.makedirs(save_dir, exist_ok=True) # 自动创建目录
success_count = 0
fail_records = []
for idx, row in df.iterrows():
repo_name = row['name']
repo_url = row['url']
local_path = os.path.join(
save_dir,
repo_name.replace("/", "_").replace(" ", "") # 处理特殊字符
)
# 跳过已存在的仓库
if os.path.exists(local_path):
print(f"Skipping existing: {repo_name}")
continue
for attempt in range(max_retries):
try:
Repo.clone_from(
url=repo_url,
to_path=local_path,
depth=1, # 仅克隆最新提交
progress=None, # 禁用进度输出
config="http.sslVerify=false" # 解决部分SSL验证问题
)
success_count += 1
print(f"[{attempt+1}/{max_retries}] Success: {repo_name}")
break
except Exception as e:
if attempt == max_retries - 1:
error_msg = f"Failed {repo_name}: {str(e)}"
print(error_msg)
fail_records.append({
'repo': repo_name,
'error': traceback.format_exc(),
'retries': attempt+1
})
time.sleep(5 ** attempt) # 指数退避策略
# 生成克隆报告
print(f"\nSummary: {success_count}成功 / {len(fail_records)}失败")
if fail_records:
with open("clone_errors.log", "w") as f:
json.dump(fail_records, f, indent=2)
return success_count, fail_records
代码段 | 技术说明 |
---|---|
os.makedirs() |
创建多层目录,exist_ok=True 避免目录已存在的报错 |
repo_name.replace() |
替换名称中的/ 和空格,防止路径问题(如owner/repo 转为owner_repo ) |
os.path.exists() |
检查本地是否已存在仓库,避免重复克隆 |
depth=1 |
浅克隆(仅最新提交),节省存储空间与克隆时间(适用于代码分析场景) |
config 参数 |
临时禁用SSL验证,解决部分企业网络/代理环境的证书问题(生产环境慎用) |
请求头伪装
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0) ArkTS-Research/1.0",
"Accept": "application/vnd.github.v3+json"
}
请求间隔控制
import time
for repo in repos:
process(repo)
time.sleep(2) # 遵守API速率限制
# 生成星标分布图
import matplotlib.pyplot as plt
plt.figure(figsize=(10,6))
df['stars'].plot(kind='hist', bins=20)
plt.title('ArkTS Project Stars Distribution')
plt.savefig('stars_dist.png')
这次做GitHub上的ArkTS项目爬取,让我真正把课本上的Python知识用到了实际里。刚开始连GitHub API都不会调,老是报401权限错误,后来学会用个人Token认证才跑通。批量克隆代码时经常遇到网络中断,加了自动重试和等待时间后稳定多了。
最大的教训是一定要尊重开源规则,有次差点克隆了GPL协议的代码,幸亏提前检查了LICENSE文件。现在做每个项目都会先想:这会不会侵犯别人的权益?
虽然代码写得还不够优雅,但能亲手做出能用的工具,看到数据慢慢积累起来,还是挺有成就感的。下一步想学学怎么用这些代码做实际的分析,比如看看大家都在ArkTS里用什么第三方库。