def view_down(self, playlist_id, path="."): list = self.get_playlist(str(playlist_id)) msg = {"success": 0, "failed": 0, "failed_list": []} for music in list['tracks']: pylog.print_info( "正在下载歌曲 {}-{}.mp3".format( tools.encode(music['name']), tools.encode(music['artists'][0]['name']) ) ) link = self.get_mp3_link(music["id"]) if link is None: msg["failed"] = msg["failed"] + 1 msg["failed_list"].append(music) continue r = requests.get(link) with open("{}/{}-{}{}".format( path, tools.encode(music['name']).replace("/", "-"), tools.encode(music['artists'][0]['name']).replace("/", "-"), ".mp3" ), "wb") as code: code.write(r.content) msg["success"] = msg["success"] + 1 pylog.print_warn( "下载成功:{} 首,下载失败:{}首".format(msg["success"], msg["failed"]) ) tb = [["歌曲名字", "艺术家", "ID"]] for music in msg["failed_list"]: n = music['name'].encode("utf-8") a = music['artists'][0]['name'].encode("utf-8") i = music['id'] tb.append([n, a, i]) print(AsciiTable(tb).table)
def create_update_strategy(self, **kwargs): date = (datetime.datetime.now() + datetime.timedelta(days=kwargs["date"])).strftime("%Y-%m-%d %H:%S:%M") self.session.query(pysql.Playlist163).filter(pysql.Playlist163.done == "Y", pysql.Playlist163.update_time > date).update( {"done": "N", "update_time": datetime.datetime.now().strftime("%Y-%m-%d %H:%S:%M")}) self.session.commit() pylog.print_info("完成 重置时间 {} 之后的歌单,可重新抓取歌曲".format(date))
def print_pdf(id): data = read_playlist_json(id) if data["code"] != 200: pylog.print_warn("歌单信息拉取失败!") return document = Document() try: document.add_heading(data["result"]["name"], 0) tags = document.add_paragraph(" ".join(data["result"]["tags"])) desc = document.add_paragraph(data["result"]["description"]) for m in data["result"]["tracks"]: document.add_paragraph().add_run(m["name"]).font.color.theme_color = MSO_THEME_COLOR_INDEX.ACCENT_2 lyric = read_lyric_data(m["id"]) document.add_paragraph().add_run(lyric["lrc"]["lyric"]).font.color.theme_color = MSO_THEME_COLOR_INDEX.ACCENT_3 comments = read_comment_data(m["id"]) for c in comments["hotComments"]: author = document.add_paragraph().add_run(c["user"]["nickname"]).style = 'Emphasis' content = document.add_paragraph(c["content"]) except Exception as e: pylog.print_warn(e) document.save("{}.docx".format(data["result"]["name"])) pylog.print_info("文档 {}.docx 已经生成!".format(data["result"]["name"]))
def clear_playlist(self,playlist_id=2098905487): m = music.Music() data = m.curl_playlist(playlist_id) for d in data["tracks"]: res = self.post_playlist_delete([str(d["id"]),],playlist_id) if res["code"] == 200: pylog.print_info("成功删除《{}》到指定歌单,歌单目前包含歌曲 {} 首".format(d["name"],res["count"])) else: pylog.print_warn("歌曲《{}》不存在于歌单中!".format(d["name"])) pylog.print_warn("删除歌单歌曲任务完成,请检查!")
def create_playlist_comment_top100(self,playlist_id=2098905487): data = settings.Session.query(pysql.Music163.song_name, pysql.Music163.song_id,pysql.Music163.comment.label("count")).order_by( pysql.Music163.comment.label("count").desc()).limit(60).all() for d in data: res = self.post_playlist_add([str(d[1]),],playlist_id) if res["code"] == 502: pylog.print_warn("歌曲《{}》已经存在于歌单中!".format(d[0])) if res["code"] == 200: pylog.print_info("成功添加《{}》到指定歌单,歌单目前包含歌曲 {} 首".format(d[0],res["count"])) pylog.print_warn("增加歌单歌曲任务完成,请检查!")
def toplist(self): msc = music.Music() cmt = comment.Comment(comment.Comment.Official) for id in uapi.top: pylog.print_info('正在抓取官方排行榜 歌单ID:{} 歌单名字:{}'.format(id, uapi.top[id])) msc.view_capture(id) cnt = int(self.app.pargs.count) if cnt <= 0: print(Fore.RED + "不合法的--count -c 变量( > 0 )") else: cmt.auto_view(cnt)
def is_correct_db(): db = config.format_db() pylog.print_info("正在检查配置的数据库格式和可用性") if db is None: print(" - 配置文件中 db 选项 {}".format(pylog.red("不正确"))) else: print(" - 账号:{} 密码:{} IP:{} 数据库:{}".format(db["user"], db["password"], db["ip"], db["database"])) try: from sqlalchemy import create_engine create_engine(db["link"], echo=False).execute("show databases") print("数据库连接验证 {}".format(pylog.green("成功"))) except Exception as e: pylog.print_err("数据库连接失败,上述配置信息有问题: {}".format(e))
def view_down(self, playlist_id, path="."): list = self.get_playlist(playlist_id) for music in list['tracks']: pylog.print_info("正在下载歌曲 {}-{}.mp3".format( music['name'].encode("utf-8"), music['artists'][0]['name'].encode("utf-8"))) link = self.get_mp3_link(music["id"]) r = requests.get(link) with open( "{}/{}-{}{}".format( path, music['name'].encode("utf-8").replace("/", "-"), music['artists'][0]['name'].encode("utf-8").replace( "/", "-"), ".mp3"), "wb") as code: code.write(r.content)
def print_comment(count): session = settings.Session() comments = session.query(pysql.Comment163).order_by( desc(pysql.Comment163.liked)).limit(count) document = Document() workbook = Workbook() try: document.add_heading("TOP {} 评论".format(count), 0) sheet = workbook.add_sheet("TOP {} 评论".format(count)) i = 0 sheet.write(i, 0, "歌曲名字") sheet.write(i, 1, "评论作者") sheet.write(i, 2, "评论内容") sheet.write(i, 3, "点赞数量") sheet.write(i, 4, "歌曲链接") for c in comments: i = i + 1 song = session.query( pysql.Music163).filter(pysql.Music163.song_id == c.song_id) pylog.print_info("正在填充第 {} 条评论,歌曲:{}".format(i, song[0].song_name)) document.add_paragraph().add_run( "作者:{}".format(c.author) ).font.color.theme_color = MSO_THEME_COLOR_INDEX.ACCENT_2 document.add_paragraph().add_run("内容:{}".format( c.txt)).font.color.theme_color = MSO_THEME_COLOR_INDEX.ACCENT_2 document.add_paragraph().add_run( "歌曲:《{}》 链接:http://music.163.com/#/song?id={}".format( song[0].song_name, c.song_id )).font.color.theme_color = MSO_THEME_COLOR_INDEX.ACCENT_2 document.add_paragraph().add_run( "赞同:{}".format(c.liked) ).font.color.theme_color = MSO_THEME_COLOR_INDEX.ACCENT_2 document.add_paragraph("") sheet.write(i, 0, song[0].song_name) sheet.write(i, 1, c.author) sheet.write(i, 2, c.txt) sheet.write(i, 3, c.liked) sheet.write(i, 4, "http://music.163.com/#/song?id={}".format(c.song_id)) except Exception as e: pylog.print_warn(e) document.save("TOP {} 评论.docx".format(count)) pylog.print_warn("\n完成文档 TOP {} 评论.docx 的生成!\n".format(count)) workbook.save("TOP {} 评论.xls".format(count)) pylog.print_warn("\n完成文档 TOP {} 评论.xls 的生成!\n".format(count))
def is_correct_config(): pylog.print_info("正在检查配置路径:{}".format(config.PATH)) if not os.path.exists(config.PATH + "/spider163.conf"): print(" - 配置路径下 spider163.conf {}".format(pylog.red("不存在"))) else: print(" - 配置路径下 spider163.conf {}".format(pylog.green("存在"))) pylog.print_info("正在检查配置文件 {}/spider163.conf 内容是否完整".format(config.PATH)) try: config.cf.get("core", "db") print(" - 配置文件中 db 选项 {}".format(pylog.green("存在"))) except Exception: print(" - 配置文件中 db 选项 {}".format(pylog.red("不存在"))) try: config.cf.get("core", "port") print(" - 配置文件中 port 选项 {}".format(pylog.green("存在"))) except Exception: print(" - 配置文件中 port 选项 {}".format(pylog.red("不存在")))
def music(playlist_id): if playlist_id not in uapi.top.keys(): pylog.print_info("歌单 {} 不在合法排行榜序列,合法歌单如下".format(playlist_id)) tb = [['歌单ID', '歌单名字']] for k, v in uapi.top.items(): tb.append([k, v]) pylog.Table(tb) return data = settings.Session.query( pysql.Toplist163.song_name, pysql.Toplist163.song_id, pysql.Toplist163.author, pysql.Toplist163.comment.label("count")).filter( pysql.Toplist163.playlist_id == playlist_id, pysql.Toplist163.mailed == "N").order_by( pysql.Toplist163.id.asc()).slice(1, 5).all() page = [] body = version.MAILBODY title = version.MAILMUSIC comments = version.MAILCOMMENT for m in data: settings.Session.query(pysql.Toplist163).filter( pysql.Toplist163.song_id == m[1]).update({'mailed': 'Y'}) settings.Session.commit() detail = "" cms = settings.Session.query(pysql.Comment163).filter( pysql.Comment163.song_id == m[1]).order_by( pysql.Comment163.id).all() for c in cms: detail = detail + comments.format(c.author, c.liked, c.txt) head = title.format(m[1], m[0], m[2], m[3], detail) page.append(head + detail) body = body.format(uapi.top[playlist_id], "<br>".join(page)) host, port, users = config.get_mail() for user in users.split(","): mail.send_email(host, port, "spider163每日网易云音乐分享", user, body)
#!/usr/bin/env python # -*- coding: utf-8 -*- from spider163 import settings from spider163.utils import pylog try: settings.configure_orm() except Exception as e: pylog.print_info("无法执行数据库相关的任务: {}".format(e))