最新要闻
- 《满江红》周边取消众筹:产品设计创意与网友理解存在偏差
- 蓝海市场不再!2022中国游戏产业报告发布:收入、用户规模下降明显
- 养生必备 青海正宗特优级头茬红枸杞500克18.9元大促
- 重点聚焦!从全屏广告到订阅付费 互联网模式为收割“韭菜”群魔乱舞
- 天天百事通!少林寺宣布与百度合作:接入百度版ChatGPT“文心一言”
- 当前视讯!美国18轮货车与一列火车相撞:致16节车厢出轨
- 23999元起 雷蛇新款灵刃18上架:可选RTX 4060/4070
- 全球滚动:老人直播间相亲多起来了 成不成就在三五分钟:网络红娘介绍对象
- 天天新资讯:上市三天狂揽1.5万订单 比亚迪秦PLUS DM-i有多火:店内水泄不通
- 苹果iOS 16.3.1修复多个错误:但Bug依旧存在
- 陕西现聚落遗址 西周墓葬有43个殉人!国内迄今最多
- 环球资讯:周黑鸭业绩大降超90% 绝味等也难过:不断涨价 年轻人越来越吃不起鸭脖
- 杰克琼斯1.8折大促:卫衣/针织衫79元起、牛仔裤119元起发车
- 世界动态:UP主欲沿大运河从杭州划船到北京 5公里后就被拦截
- 全球最资讯丨浪漫之极!杭州地铁口等地现玫瑰瀑布:情人节鲜花卖到1200元
- 微资讯!壮观!马斯克星链卫星驶过西班牙夜空:宛若空中列车
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
快资讯丨下载某乎专栏文章并存为markdown
前言
由于在2月13日,Autojs的作者发出公告将审查所有代码,并在最新版删除了无障碍截图、通知监听等功能,在打开所有版本都会提示强制更新,之前关注的公众号都连夜删除了教程文章,在搜索时,发现教程作者的文章在其它平台还未删除,为了保险起见,备份一下他的文章。由于他写的文章很多,文章将通过爬虫的方式去获取并保存为markdown文件。
(资料图)
参考文章:
https://www.jianshu.com/p/b8530e554782
https://www.dandelioncloud.cn/article/details/1487706447181107201
实现思路
- 下载知乎专栏文章存入html
- 将所有html转换为md
- 正则提取markdown中的图片链接
- 下载图片至本地
- 上传图片至码云图床
- 使用新图片链接替换原来的图片链接
下载知乎专栏文章存入html
在浏览器按F12打开调试模式,访问专栏链接,查看网络请求,可以发现这个就是我们想要的内容。某乎比较友好,返回的是json,直接json解析即可。
- 实现代码
def downloadZhuanLanToLocalHtml(zhuanLan,htmlSavePath): """ 下载知乎专栏文章存入html :param zhuanLan: 专栏地址 https://www.zhihu.com/column/c_1341718720926887936 地址是c_1341718720926887936 :htmlSavePath: html文件存放路径 """ # 获取总的文章数量 urlIndex=f"https://www.zhihu.com/api/v4/columns/{zhuanLan}/items" res=requests.get(urlIndex,headers=headers) # 知乎比较友好,返回的是json totals=json.loads(res.text)["paging"]["totals"] totalPage=totals//100+1 # 获取总页数 for i in range(totalPage): # limit最大是100,超过会报错 urlpage = "https://www.zhihu.com/api/v4/columns/{}/items?limit={}&offset={}".format(zhuanLan, 100, 100*i) respage = requests.get(urlpage, headers=headers) data=json.loads(respage.content)["data"] for article in data: title=article["title"] content=article["content"] # 替换标题中的特殊符号,不然创建文件会报错 with open(f"{htmlSavePath}\\{title.replace("?","").replace("?","")}.html","w",encoding="utf-8") as f: f.write(content) print("下载完成")
将所有html转换为md
将保存的html转换为markdown,我们使用第三方库html2text,在使用前请先安装pip install htm2text
。
def convertHtml2Markdow(htmlSavePath,mdSavePath): """ 将所有html转换为md : htmlSavePath: 存放html文件的文件夹路径 : mdSavePath: 存放markdown文件的文件夹路径 """ for file in os.listdir(htmlSavePath): # 获取文件名称 filename=os.path.basename(file).split(".")[0] text_maker = ht.HTML2Text() # 读取html格式文件 with open(htmlSavePath+"/"+file, "r", encoding="UTF-8") as f: htmlpage = f.read() # 处理html格式文件中的内容 text = text_maker.handle(htmlpage) # 写入处理后的内容 with open(mdSavePath+"/"+filename+".md", "w", encoding="UTF-8") as f: f.write(text)
提取markdown文件中的图片链接
获取md文件中的链接,采用正则方式来提取。
def lambdaToGetMarkdownPicturePosition(content): """ 从markdownd代码中提取图片链接 :param content: :return: """ # 该正则只适合某乎的文章,其它的请自行调整 pattern = re.compile(r"!\[.*?\]\([https|http].*?source=.*?\)") resultList = pattern.finditer(content) urlList = [] for item in resultList: curStr = item.group() curStr = curStr.split("(")[1] curStr = curStr.strip(")") urlList.append(curStr) print(curStr) return urlList
下载图片至本地
将获取到的图片链接,先下载到本地,同时保存号md文件中图片链接和本地图片路径的映射关系,方便后文替换为新的图床的图片链接。
def downloadPic(urls,picSavePath): """ 下载图片至本地 : urls: 图片路径 :picSavePath: 本地存放图片的文件夹 """ picMap={} for url in urls: res=requests.get(url) if res.status_code==200: savePicName=url.split("/")[-1] with open(f"{picSavePath}/{savePicName.split("?")[0]}","wb") as f: f.write(res.content) picMap[url]=f"{picSavePath}/{savePicName.split("?")[0]}" else: print("图片下载失败") return picMap
上传图片至gitee图床
这一步将本地的图片上传到gitee的图床,gitee提供了开放的api,通过api可以将图片上传至指定仓库。
开放api地址:https://gitee.com/api/v5/swagger#/postV5ReposOwnerRepoContentsPath
- 代码实现
def uploadPicToGitee(picFullPath,access_token="你自己的token",owner="登录的用户名",repo="仓库名",branch="存放的分支",giteeRepoSavePath="仓库下某个目录"): """ 上传文件到gitee :picFullPath: 本地图片路径 :giteeRepoSavePath: gitee仓库中文件存放路径 """ headers = { "Accept": "application/json, text/plain, */*", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8", "Connection": "keep-alive", "Content-Type": "application/json;charset=UTF-8", "Origin": "https://gitee.com", "Referer": "https://gitee.com/api/v5/swagger", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36", "sec-ch-ua": ""Not_A Brand";v="99", "Google Chrome";v="109", "Chromium";v="109"", "sec-ch-ua-mobile": "?0", "sec-ch-ua-platform": ""Windows"", } # 将图片进行bas4编码 with open(picFullPath,"rb") as f: content=base64.b64encode(f.read()) picDir=os.path.dirname(os.path.abspath(picFullPath)) # 切换目录 os.chdir(picDir) picName=os.path.basename(picFullPath) data = { "access_token": access_token, "content": content, "message": f"upload-{picName}", "branch": branch, } # 上传文件需要处理data data=MultipartEncoder(fields=data) headers["Content-Type"]=data.content_type res = requests.post(f"https://gitee.com/api/v5/repos/{owner}/{repo}/contents/{giteeRepoSavePath}/{picName}", headers=headers, data=data,verify=False) if res.status_code==201 or res.text=="{"message":"A file with this name already exists"}": imgUrl=f"https://gitee.com/{owner}/{repo}/raw/{branch}/{giteeRepoSavePath}/{quote(picName)}" return imgUrl return None
运行程序
if __name__=="__main__": zhuanLan="c_1341718720926887936" htmlSavePath=r"C:\Users\teisyogun\Desktop\脚本\python_learn\test\test" # 修改为自己html文件的存放地址 mdSavePath=r"C:\Users\teisyogun\Desktop\脚本\python_learn\test\test-md" # 修改为md文件的存放地址 downloadZhuanLanToLocalHtml(zhuanLan,htmlSavePath) convertHtml2Markdow(htmlSavePath,mdSavePath) mdSavePath1=r"C:\Users\teisyogun\Desktop\脚本\python_learn\test\test-md\test3" # gitee长时间上传会报超时错误,如果md文件很多,分成多批次上传 picSavePath=r"C:\Users\teisyogun\Desktop\脚本\python_learn\test\test-pic" # 修改为本地图片的存放路径 # 下面的逻辑就是在完成原md文件中图片链接替换为gitee图床的图片链接 for root,dirs,files in os.walk(mdSavePath1): for filename in files: mdFullPath=os.path.join(root,filename) mdBakFullPath=os.path.join(root,filename.replace(".md","-bak.md")) with open(mdFullPath,"r+",encoding="utf-8") as f,open(mdBakFullPath,"w",encoding="utf-8") as wf: print(mdFullPath) mdContent="".join(f.readlines()) urlList=lambdaToGetMarkdownPicturePosition(mdContent) if len(urlList)!=0: picMap=downloadPic(urlList,picSavePath) print(picMap) if bool(picMap): for picUrl in picMap: imgUrl=uploadPicToGitee(picMap[picUrl]) print(imgUrl) if imgUrl is not None: mdContent=mdContent.replace(picUrl,imgUrl) else: print(f"文件:{filename}中{picMap[picUrl]}替换失败") wf.write(mdContent) print(f"{filename}+===替换完成") else: wf.write(mdContent)
最终效果
所有替换后的md文件
打开带图片的文件,查看源码,发现图片中的文件已经被替换。
在预览模式下查看,图片可以正常显示。至此我们完成了所有的功能。
代码
获取完整代码,请在后台回复【专栏】或在评论区留言。
总结
文章中只是简单实现了需求,代码比较乱,欢迎大家评论指正。
本文由【产品经理不是经理】gzh同步发布,欢迎关注
快资讯丨下载某乎专栏文章并存为markdown
当前播报:ChatGPT写代码水平惊艳到我,很性感但有点危险
记录--前端实现登录拼图验证
《满江红》周边取消众筹:产品设计创意与网友理解存在偏差
蓝海市场不再!2022中国游戏产业报告发布:收入、用户规模下降明显
养生必备 青海正宗特优级头茬红枸杞500克18.9元大促
重点聚焦!从全屏广告到订阅付费 互联网模式为收割“韭菜”群魔乱舞
天天百事通!少林寺宣布与百度合作:接入百度版ChatGPT“文心一言”
什么是Python装饰器?
焦点要闻:kubeadm的部署+Dashboard+以及连接私有仓库 Harbor
linux 基础(9)背景工作管理
从一次有趣的漏洞分析到一个有趣的PHP后门
当前动态:9 种跨域方式实现原理
观天下!特定领域知识图谱融合方案:学以致用-问题匹配鲁棒性评测比赛验证【四】
全球视点!除了ChatGPT,还能用什么计划管理软件提高效率?
旋转数组中的最小数字
今亮点!高效节能 | 智慧灯杆综合管理解决方案
全球百事通!各个编程语言的优缺点,你适合哪种?
当前视讯!美国18轮货车与一列火车相撞:致16节车厢出轨
23999元起 雷蛇新款灵刃18上架:可选RTX 4060/4070
全球滚动:老人直播间相亲多起来了 成不成就在三五分钟:网络红娘介绍对象
天天新资讯:上市三天狂揽1.5万订单 比亚迪秦PLUS DM-i有多火:店内水泄不通
苹果iOS 16.3.1修复多个错误:但Bug依旧存在
为SQL Server配置连接加密
天天短讯!什么是卷积
陕西现聚落遗址 西周墓葬有43个殉人!国内迄今最多
环球资讯:周黑鸭业绩大降超90% 绝味等也难过:不断涨价 年轻人越来越吃不起鸭脖
杰克琼斯1.8折大促:卫衣/针织衫79元起、牛仔裤119元起发车
世界动态:UP主欲沿大运河从杭州划船到北京 5公里后就被拦截
二维数组中的查找
全球信息:数学知识1.4
关于工具软件:Apipost和Apifox哪个更好用看这篇就够了
全球最资讯丨浪漫之极!杭州地铁口等地现玫瑰瀑布:情人节鲜花卖到1200元
全球快报:业务与研发一体化最佳突破口在何处?
快讯:Unity 转小游戏
环球热讯:基于开源IM即时通讯框架MobileIMSDK:RainbowChat v8.4版已发布
世界快播:Linux输入设备驱动
微资讯!壮观!马斯克星链卫星驶过西班牙夜空:宛若空中列车
【世界聚看点】小学生满分作文跑题老师含泪打5分:把“悔”看成“梅”
环球热资讯!特斯拉京东旗舰店开业:269元的U盘上架
首发16.2元:《仙剑奇侠传7》DLC《人间如梦》正式上线
ChatGPT版必应发飙!怒斥人类:放尊重些
天天快播:IM通讯协议专题学习(九):手把手教你如何在iOS上从零使用Protobuf
ChatGPT注册试用过程分享
全球观察:响应式圣经:10W字,实现Spring响应式编程自由
全球短讯!Unicorn 初探
7万起售 五菱缤果内饰官图发布:同级无敌手
世界上最轻VR头显面世:仅重127克 5K分辨率
环球新消息丨苹果汽车奇瑞造?“果链一哥”立讯与奇瑞签署合作 联手造车
当前动态:法拉第未来:预计FF 91将于4月底交付 但有个前提
不用第三方插件了:微软计划为Edge加入鼠标手势功能
qq空间主人寄语怎么删除?qq空间主人寄语大集合
开学的歌曲有哪些?开学的趣事作文模板
熟悉的人是什么意思?关于我最熟悉的人作文合集
皮脂腺分泌旺盛是什么原因?皮脂腺分泌旺盛怎么解决?
代表月亮消灭你是什么意思?代表月亮消灭你是谁的经典台词?
天天亮点!【AI】PTP时钟同步在智能驾驶系统里的重要性
天天微资讯!去掉Element 中el-input type=number时尾部上下箭头、禁用鼠标滚动
世界热点评!数组中找出只出现一次的两个数字
剑灵活力值在哪里显示?剑灵活力值怎么恢复?
ie图标不见了是怎么回事?ie图标不见了怎么恢复?
闪存和硬盘哪个重要?闪存和硬盘有什么区别?
料理机是干什么用的?料理机品牌十大排名
光纤路由器怎么设置?光纤路由器和宽带路由器一样吗?
速看:口味地道 丰富配料!渣渣灰南昌拌粉好价:4.9元/盒
全球新资讯:129元!小米2C1A三口GaN充电器上架:最高67W 兼容65W PD
天天信息:3秒俱乐部成员!极氪X官图公布:2750mm轴距百变魔方空间
63岁老人喝隔夜牛肉汤:结果住进ICU
黑龙江上空现不明飞行物速度极快 网友脑洞大开:LED风筝?
今日报丨程序员健康最佳作息表,建议收藏!!
必知必会的设计原则——合成复用原则
腾讯云企业网盘正式入驻数字工具箱
每日关注!软件开发入门教程网之Bootstrap4 信息提示框
【天天报资讯】适用于您企业的本地密码管理器丨Passwork产品介绍
瞧不起ChatGPT?苹果联合创始人:永远取代不了人类
【天天播资讯】热狗车三元催化被盗
宁德时代赴美建厂 官方回应:属实!福特出地出厂房
天天微头条丨丰田考斯特绝佳替代品 红旗全新中巴亮相:3.0T能坐23人
世界视讯!情人节前夕 东极岛海誓山盟石碑碎了 网友:承受太多誓言
百事通!RTX 4060桌面显卡被砍得面目全非:说好的万人迷呢?
匠人精神也不行!日本制造加速下滑:破产企业数量激增 汽车、电子业空心化
当前动态:情人节的垃圾桶成了“致富秘笈”?能捡到鲜花蛋糕等:网友戏称拆“爱情盲盒”
拒绝刹车失灵等污名化!美国还特斯拉清白:2年前车祸是司机醉酒超速
今日热议:微信情人节限定状态上线!撒狗粮/吃狗粮专属状态你选谁?
ChatGPT:Are You Ok是卢伟冰唱的 雷军不是专业歌手
世界新消息丨读Java实战(第二版)笔记09_函数式的思考
【当前独家】今天情人节 微信可以发520元红包 律师提醒:分手可能要不回
当前聚焦:曝马斯克有意45亿镑收购曼联:去年曾现身世界杯看球
世界视点!最高补贴5000元!为什么中国规定男性一生只能捐精一次?
头条:微软Win10今日停止支持IE11:强制跳转Edge 网友担心银行拖后腿
报道:2022年游戏十强年度榜公布:《王者荣耀》《原神》等上榜
每日视点!草莓的“种子”为什么裸露在外呢?大有讲究
13代i9+RTX 4070加持!ROG幻16经典版 2023图赏
当前热门:1.html篇之《html基础入门》
天天微资讯!leetcode:求两数之和-easy
世界讯息:maven 工程pom依赖优化及常用命令
全球百事通!世界超6成新能源汽车来自中国 比亚迪2022年累计出口55916辆
视讯!29.9元充值100元话费?套路满满 18家经营者被约谈
腾讯:我们发现了ChatGPT的又一个短板
【天天新要闻】判断二叉树是否为平衡二叉树