Advertisement
shinemic

gitashe_threading.py

May 25th, 2023
659
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 10.71 KB | None | 0 0
  1. from requests_html import HTMLSession, requests
  2. from typing import Union
  3. from pathlib import Path
  4.  
  5. import concurrent.futures
  6. import logging
  7.  
  8.  
  9. class JitasheDownloader:
  10.     BASE_URL = "https://www.jitashe.org"
  11.  
  12.     def __init__(self):
  13.         self.session = HTMLSession()
  14.  
  15.     def _search(self, keyword) -> Union[str, None]:
  16.         """查询页,如有查询结果返回第一个,否则返回 None"""
  17.  
  18.         search_req = self.session.get(f"{self.BASE_URL}/search/tab/{keyword}")
  19.         search_first = search_req.html.find(
  20.             "#threadlist > div > div.text > a", first=True
  21.         )
  22.         first_elem_url = (
  23.             search_first and self.BASE_URL + search_first.element.attrib["href"]
  24.         )
  25.         return first_elem_url
  26.  
  27.     def _download(self, keyword, out_dir) -> None:
  28.         """根据查询页返回结果下载乐谱"""
  29.  
  30.         search_url = self._search(keyword)
  31.         if search_url:
  32.             score_req = self.session.get(search_url)
  33.             title = score_req.html.find("h1.gb-title", first=True).text
  34.             scores_url = [
  35.                 url.split("!")[0]
  36.                 for url in score_req.html.xpath("//ignore_js_op/picture/img/@src")
  37.             ]
  38.  
  39.             if scores_url:
  40.                 download_path = Path(out_dir) / title
  41.                 download_path.mkdir(parents=True, exist_ok=True)
  42.                 filename_width = len(str(len(scores_url)))
  43.                 for i, url in enumerate(scores_url, 1):
  44.                     file = download_path / f"{title}-{i:0{filename_width}}.jpg"
  45.                     logging.debug(f"下载中 - {file.name}")
  46.                     file.write_bytes(self.session.get(url).content)
  47.  
  48.                 logging.info(f"完成下载:{title}")
  49.             else:
  50.                 logging.info(f"无图片谱: {keyword}")
  51.         else:
  52.             logging.info(f"搜索词「{keyword}」下无对应结果")
  53.  
  54.         logging.debug("")
  55.  
  56.     def download(self, keyword, out_dir="./output", max_retry=3) -> None:
  57.         """下载乐谱(支持重试)"""
  58.  
  59.         for i in range(max_retry):
  60.             try:
  61.                 self._download(keyword, out_dir=out_dir)
  62.                 break
  63.             except requests.RequestException:
  64.                 logging.error(f"重试第{i + 1}次下载 - {keyword}")
  65.                 continue
  66.         else:
  67.             logging.error(f"{max_retry}次尝试下载失败 - {keyword}")
  68.  
  69.  
  70. def run_instance(keyword):
  71.     downloader = JitasheDownloader()
  72.     downloader.download(keyword, out_dir="./output", max_retry=5)
  73.  
  74.  
  75. if __name__ == "__main__":
  76.     logging.basicConfig(
  77.         format="[%(asctime)s.%(msecs)03d] [%(levelname)-5s] %(message)s",
  78.         level=logging.DEBUG,
  79.         datefmt="%T",
  80.     )
  81.     logging.getLogger("urllib3.connectionpool").setLevel(logging.CRITICAL)
  82.  
  83.     song_list = [
  84.         "七里香", "夜曲", "夜的第七章", "遇见", "十年", "黄昏", "富士山下", "血腥爱情故事", "江南", "晴天",
  85.         "至少还有你", "千里之外", "你就不要想起我", "发如雪", "我怀念的", "唯一", "浮夸", "一路向北", "以父之名", "欧若拉",
  86.         "水星记", "东风破", "一直很安静", "天黑黑", "爱在西元前", "青花瓷", "绅士", "三国恋", "爱情转移", "霍元甲",
  87.         "小情歌", "开始懂了", "隐形的翅膀", "可惜没如果", "高尚", "止战之殇", "勇气", "搁浅", "我们的爱", "枫",
  88.         "记事本", "花田错", "如果你也听说", "只是太爱你", "说好的幸福呢", "如愿", "轨迹", "西海情歌", "美人鱼", "双截棍",
  89.         "稻香", "可", "开不了口", "那是你离开了北京的生活", "退后", "我好想你", "钟无艳", "七友", "蒲公英的约定", "逆光",
  90.         "不能说的秘密", "小幸运", "珊瑚海", "我不配", "断点", "白色风车", "我好像在哪见过你", "不为谁而作的歌", "崇拜", "无赖",
  91.         "红玫瑰", "动物世界", "青花", "花海", "修炼爱情", "最长的电影", "人质", "日落大道", "就是爱你", "一千年以后",
  92.         "你还要我怎样", "背叛", "下雨天", "蜗牛", "大城小爱", "安静", "老街", "断了的弦", "Lydia", "我最亲爱的",
  93.         "陪你去流浪", "寂寞沙洲冷", "月牙湾", "喜帖街", "听妈妈的话", "一半", "最佳损友", "亲爱的那不是爱情", "痴心绝对", "本草纲目",
  94.         "布拉格广场", "父亲写的散文诗", "最后的战役", "在他乡", "春秋", "走马", "流年", "雨天", "你在终点等我", "明年今日",
  95.         "意外", "山丘", "温柔", "失恋无罪", "寓言", "好久不见", "旅行的意义", "把你揉碎捏成苹果", "你瞒我瞒", "人来人往",
  96.         "越来越不懂", "简单爱", "我要快乐", "想自由", "小半", "千年之恋", "杀破狼", "泡沫", "安和桥", "暧昧",
  97.         "暧昧", "相依为命", "浪费", "龙卷风", "大风吹", "忽然", "Melody", "下一站天后", "倒带", "你的背包",
  98.         "关键词", "年少有为", "模特", "小小", "旋木", "淘汰", "愚人的国度", "红色高跟鞋", "K歌之王", "龙战骑士",
  99.         "暗号", "失落沙洲", "独角戏", "母系社会", "匆匆那年", "电灯胆", "玫瑰少年", "可惜不是你", "怪咖", "斑马斑马",
  100.         "心中的日月", "你不是真正的快乐", "爱爱爱", "如果当时", "爱", "你要的爱", "李白", "画心", "多远都要在一起", "前所未见",
  101.         "幻听", "爱在记忆中找你", "野孩子", "罗生门", "吴哥窟", "降温", "寂寞寂寞就好", "暗香", "尚好的青春", "宁夏",
  102.         "Kiss Goodbye", "浪子回头", "分手快乐", "慢慢等", "勿忘心安", "生活因你而火热", "曹操", "说谎", "野蔷薇", "雅俗共赏",
  103.         "心雨", "起风了", "不得不爱", "庐州月", "单身情歌", "何必在一起", "一荤一素", "生如夏花", "木偶人", "我的地盘",
  104.         "三年二班", "四面楚歌", "会有那么一天", "我不难过", "现在我很幸福", "勇", "南方姑娘", "美丽世界的孤儿", "残酷月光", "分手总在下雨天",
  105.         "这世界那么多人", "克卜勒", "披着羊皮的狼", "无赖", "魔鬼中的天使", "生生", "可惜我是水瓶座", "理想三旬", "绿洲", "新地球",
  106.         "爱与诚", "手心的蔷薇", "流沙", "黑色幽默", "残酷游戏", "成都", "情非得已", "他一定很爱你", "贝加尔湖畔", "爸,我回来了",
  107.         "黑色毛衣", "爱疯了", "左边", "风吹麦浪", "将军令", "吻得太逼真", "追光者", "最佳歌手", "旧街角", "耿耿于怀",
  108.         "情歌", "大眠", "那些你很冒险的梦", "杀死那个石家庄人", "男孩", "丝路", "借口", "倔强", "清明雨上", "世界末日",
  109.         "忍者", "没有理想的人不伤心", "精舞门", "天使", "反转地球", "扯", "手放开", "我会好好的", "不该", "下一个天亮",
  110.         "像梦一样自由", "烂泥", "回到过去", "连名带姓", "喜剧之王", "偏爱", "一丝不挂", "落叶归根", "爱你", "烟火里的尘埃",
  111.         "天真有邪", "毁人不倦", "方圆几里", "将故事写成我们", "好心分手", "涩", "无人知晓", "姗姗", "春泥", "反方向的钟",
  112.         "舍不得", "我的光", "大哥", "心酸", "春风十里", "依兰爱情故事", "身骑白马", "思念是一种病", "你要的全拿走", "独家记忆",
  113.         "爱得太迟", "第一次爱的人", "如果我变成回忆", "我很快乐", "爱不释手", "大舌头", "嘉宾", "想太多", "伤心1999", "半兽人",
  114.         "骑士精神", "爸爸妈妈", "世界上不存在的歌", "你那么爱她", "再见", "怎样", "亲爱的", "野心", "不值得", "你听得到",
  115.         "给我一个理由忘记", "国王与乞丐", "南山南", "一样的月光", "爱丫爱丫", "陌生人", "慕容雪", "我爱他", "拆东墙", "雨爱",
  116.         "光年之外", "分裂", "异乡人", "麻雀", "曾经的你", "类似爱情", "情人", "蓝莲花", "必杀技", "干杯",
  117.         "苦瓜", "夏天的风", "黑夜问白天", "半生出走", "不搭", "真实", "星晴", "表白", "梁山伯与茱丽叶", "词不达意",
  118.         "别找我麻烦", "无名之辈", "十点半的地铁", "你给我听好", "望", "他不懂", "好朋友的祝福", "惊鸿一面", "千年泪", "米兰的小铁匠",
  119.         "郭源潮", "Amen", "亲亲", "寂寞在唱歌", "天外来物", "会长大的幸福", "心墙", "我要你", "星空", "易燃易爆炸",
  120.         "私奔", "夜空中最亮的心", "董小姐", "燕归巢", "天后", "我还想她", "Love Song", "理想", "匆匆", "当你",
  121.         "宝贝", "达尔文", "如果有来生", "光明", "茉莉雨", "我们俩", "推开世界的门", "一个人", "猜不透", "呓语",
  122.         "路过人间", "够钟", "烟花易冷", "你啊你啊", "离开地球表面", "幼稚完", "处处吻", "奔跑", "合久必婚", "眼泪成诗",
  123.         "当爱在靠近", "我们说好的", "等我回家", "游乐场", "爱着爱着就永远", "街角的祝福", "你被写在我的歌里", "不将就", "乌鸦", "半岛铁盒",
  124.         "乱舞春秋", "上海一九四三", "一眼万年", "你曾是少年", "算你狠", "暧昧", "我知道", "那么骄傲", "断桥残雪", "大鱼",
  125.         "小永远", "蓝色土耳其", "缘分一道桥", "给十年后的我", "深呼吸", "错的人", "指望", "月亮之上", "鼓楼", "放生",
  126.         "默", "步步", "作曲家", "来自天堂的魔鬼", "我的天空", "孤独患者", "谢谢你", "借", "会痛的石头", "天下",
  127.         "对等关系", "心跳", "失忆的金鱼", "喜欢寂寞", "错过", "偷故事的人", "三人游", "像风一样自由", "被驯服的象", "皆可",
  128.         "我是真的爱上你", "鱼", "彩虹", "蝴蝶泉边", "煎熬", "看我72变", "后来的我们", "信仰", "愿望", "外婆",
  129.         "甜甜的", "需要人陪", "看月亮爬上来", "天亮了", "醉赤壁", "下个,路口,见", "听你说", "岁月神偷", "我很忙", "月光",
  130.         "伤心的人别听慢歌", "好好说再见", "不醉不会", "遗失的心跳", "十万毫升泪水", "我们都被忘了", "戒烟", "香格里拉", "野子", "让",
  131.         "异类", "Forever Young", "仰望", "七月上", "su san说", "上心", "爱久见人心", "你值得更好的", "怎么唱情歌", "你一定要幸福",
  132.         "你不在", "毁人不倦", "我喜欢上你时的内心活动", "洛城", "逃亡", "笑忘书", "专属天使", "空白格", "七月七日晴", "一个人的行李",
  133.         "龙的传人", "下沙", "寂寞的季节", "告诉我", "爱的主打歌", "阳光下的星星", "刚刚好", "沿海地带", "咕叽咕叽", "梯田",
  134.     ]
  135.  
  136.     with concurrent.futures.ThreadPoolExecutor(max_workers=100) as executor:
  137.         executor.map(run_instance, song_list)
  138.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement