,,用python写个博客迁移工具

,,用python写个博客迁移工具

本文主要介绍如何用python编写博客迁移工具,帮助你更好地理解和学习使用python。感兴趣的朋友可以了解一下。

目录

前言掘金的成长和移动命令行工具环境配置

main.py

cookie.json

Github地址

最近很多写博客的朋友告诉我,博客公园里的一些文章已经下架了,这让我想起了去年的简书。之前写的博客都下架了,看不见了。

刚开始接触csdn、四维、简书、博客园等博客网站,后来发现单个博客的生态感越来越差。虽然干货很多,但是垃圾和标题党很严重,我自己的一些博文都被莫名其妙的删除了,直接标为原创。

虽然通过搜索问题还是可以找到很多解决方法,但是写作的欲望却降低了很多。

总结一下,我去年入驻了掘金,把掘金作为我博客的主要平台。感觉个人掘金团队很好的保护了个人原创,同时也在不断的听取用户的建议进行改进。随时带着问题和建议和掘金的同学讨论交流,非常方便。

金块的成长

当初掘金也是接受采访,标题党满天飞。但掘金运营逐渐整顿后,文章质量明显提升,不断推出各种有利于新手作者和高质量博文的活动,鼓励新人创作,老人分享。

同样,我入驻掘金后,作为长期用户和新作者,也见证了掘金为社区活跃度和博客质量所做的努力。

刚开始使用掘金markdown的时候,还有很多地方需要吐槽,但是掘金的研发也是很厉害的。在吸收了用户的建议后,新升级的markdown编辑器也颇受好评。用过之后,你就知道什么是真理法则了。

金块用起来总有一种特别的感觉,是一种纯粹的编码感。它不仅仅是一个简单的博客平台,而是一直致力于社区共建、开源项目、掘金翻译计划等的建设。为技术社区打造一个纯净干净的后花园。

移动命令行工具

那么作为一个程序员,手动移动文章显然略低。

所以我写了一个简单的python脚本,感兴趣的同学可以用它把cnblogs上现有的或者正在创建的草稿转移到掘金上。

有兴趣的话可以尝试改造的更完善一些,但是不建议泄露自己的私人信息。

环境配置

脚本需要python3环境才能运行,所以先安装python环境。

请在cookie.json中补充博客公园和掘金的cookie

使用python3 main.py -h查看说明。

作为一名程序员,每个人都应该知道cookie是什么以及从哪里获取它们。

施用方式

来拍最后一张拿曲奇的照片吧,哈哈。

请先将cookie.json中的cookie_cnblogs和cookie _金爵替换为相应站点上自己的cookie。

请自行替换用户名和博客id。

//将单个文章下载到默认目录。/cnblogs '并将日志输出到'。/log '

python3 main.py -m下载-https://www.cnblogs.com/{{user_name}}/p/{{blog_id}}.html-enable _ log

//将用户的所有文章下载到目录'/Users/cnblogs_t '

python 3 main . py-m download-u https://www.cnblogs.com/{{username}}-p/Users/cnblogs _ t

//上传一篇文章到掘金草稿箱

python 3 main . py-m upload-f ./cn blogs/{ { blog _ id } }。超文本标记语言

//上传'下的所有html文件。/test_blogs '到掘金草稿箱。

python3 main.py -m上传-d ./test_blogs

main.py

创建一个新的main.py文件,并将以下python代码复制到其中

#编码=utf-8

导入请求

导入操作系统

导入argparse

导入系统

导入json

从lxml导入etree

从urllib.parse导入urlparse

导入日志记录

重新加载(系统)

sys.setdefaultencoding('utf-8 ')

parser=argparse。ArgumentParser()

args_dict={}

list _ URL _ TPL=' https://www . cn blogs . com/% s/default . html?页面=%d '

draft _ URL=' https://API . juejin . cn/content _ API/v1/article _ draft/create _ offline '

jj _ draft _ URL _ TPL=' https://juejin . cn/editor/drafts/% s '

cnblog_headers={}

log_path='。/log '

def myget(d,k,v):

如果得到(k)为无:

返回v

return d.get(k)

极好的初始化解析器():

解析器。description='为cn博客移动博客'

parser.add_argument('-m ','- method ',type=str,dest='method ',help='使用方式:下载下载上传上传到草稿箱,choices=['上传','下载'])

parser.add_argument('-p ','- path ',type=str,dest='path ',help='博客超文本标记语言下载的路径)

parser.add_argument('-d ','- dir ',type=str,dest='rec_dir ',help='制定要上传的博客所在文件夹)

parser.add_argument('-f ','- file ',type=str,dest='file ',help='指定上传的博客html’)

parser.add_argument('-u ','- url ',type=str,dest='url ',help='个人主页地址)

parser.add_argument('-a ','- article ',type=str,dest='article_url ',help='单篇文章地址)

解析器。add _ argument('-enable _ log ',dest='enable_log ',help='是否输出日志到/log ',action='store_true ')

解析器。set _ defaults(enable _ log=False)

定义初始化日志():

root_logger=logging.getLogger()

log_formatter=日志记录。格式化程序(' %(asctime)s[%(级别名)s]%(路径名)s:%(行号)s %(消息)s ')

console_handler=日志记录StreamHandler(sys.stdout)

控制台_处理程序。设置格式化程序(log _ formatter)

root_logger.addHandler(控制台_处理程序)

if myget(args_dict,' enable_log ',False):

如果不是os.path.exists(log_path):

os.mkdir(日志路径)

文件处理程序=日志记录FileHandler(' ./log/debug。日志’)

file_handler.setFormatter(日志格式器)

root _ logger。addhandler(文件处理程序)

root_logger.setLevel(日志记录。信息)

定义下载():

cookies=JSON。加载(打开(' cookie。JSON '))

headers={ ' cookie ':cookie。获取(' cookie _ cn博客',' ')}

dir_path=myget(args_dict,' path ',' ./cn博客’)

if dir _ path[len(dir _ path)-1]=='/':

目录路径=目录路径[:len(目录路径)-1]

如果不是os.path.exists(目录路径):

os.mkdir(目录路径)

article_url=myget(args_dict,' article_url ','-1 ')

if article_url!='-1':

logging.info('文章url=%s ',文章网址)

尝试:

resp=requests.get(article_url,headers=headers)

if resp.status_code!=200:

logging.error('无法获取博客\'%s\ ',响应=%s ',文章url,响应)

返回

tmp_list=article_url.split('/')

blog _ id _ str=tmp _ list[len(tmp _ list)-1]

用open(目录路径'/'博客标识字符串,' w ')作为女:

f .写(分别为文本)

logging.info('获取博客\'%s '成功。文章_网址)

例外情况为e:

logging.error('引发异常,无法获取博客\'%s\ ',异常=%s ',list_url,e)

最后:

返回

raw_url=args_dict.get('url ')

rurl=urlparse(raw_url)

用户名=(rurl.path.split('/',1))[1]

page_no=1

虽然正确:

列表url=列表URL TPL %(用户名,页码)

logging.info('列表url=%s ',列表网址)

尝试:

resp=requests.get(list_url,headers=headers)

if resp.status_code!=200:

破裂

例外情况为e:

logging.error('引发异常,无法获取列表\'%s\ ',异常=%s ',list_url,e)

返回

html=etree .HTML(分别为文本)

博客列表=html。XPath('//div[@ class=\ ' post title \ ']/a/@ href ')

如果len(博客列表)==0:

破裂

对于博客列表中的博客网址:

tmp_list=blog_url.split('/')

blog _ id _ str=tmp _ list[len(tmp _ list)-1]

博客响应=请求。get(blog _ URL,headers=headers)

if resp.status_code!=200:

logging.error('无法获取博客\'%s\ ',resp=%s,跳过、博客_网址、响应)

继续

用open(目录路径'/'博客标识字符串,' w ')作为女:

f .写(博客_责任。文本)

logging.info('获取博客\'%s '成功。博客_网址)

page_no=1

定义上传请求(标题、内容、文件名):

body={

“编辑类型”:0,

' origin_type': 2,

"内容":内容

}

data=json.dumps(body)

尝试:

resp=requests.post(draft_url,data=data,headers=headers)

if resp.status_code!=200:

logging.error('无法上传博客,文件名=%s,响应=%s ',文件名,响应)

返回

ret=resp.json()

draft_id=ret.get('data ',{}).get('draft_id ','-1 ')

logging.info('上传成功,文件名=%s,jj_draft_id=%s,jj_draft_url=%s ',文件名,草稿id,jj_draft_url_tpl%draft_id)

例外情况为e:

logging.error('出现异常,无法上传博客,文件名=%s,异常=%s ',文件名,e)

返回

定义上传():

cookies=JSON。加载(打开(' cookie。JSON '))

标题={

“饼干”:饼干。get(' cookie _金爵',''),

"内容类型":"应用程序/json "

}

filename=myget(args_dict,' file ','-1 ')

如果文件名!='-1':

logging.info('上传文件名=%s ',文件名)

尝试:

用打开(文件名,' r ')作为女:

content=f.read()

上传请求(标题、内容、文件名)

返回

例外情况为e:

logging.error('引发了异常,异常=%s ',e)

rec_dir=myget(args_dict,' rec_dir ','-1 ')

if rec_dir!='-1':

logging.info('upload_dir=%s ',文件名)

尝试:

g=os.walk(rec_dir)

对于g中的路径、目录列表、文件列表:

对于文件列表中的文件名:

if filename.endswith(.html’):

filename=os.path.join(路径,文件名)

用打开(文件名,' r ')作为女:

content=f.read()

上传请求(标题、内容、文件名)

例外情况为e:

logging.error('引发了异常,异常=%s ',e)

返回

if __name__=='__main__ ':

init_parser()

args=parser.parse_args()

args_dict=args .__词典_ _

init_log()

空_标志=真

对于args_dict.items()中的k,v:

如果k!='enable_log '且v不为无:

空_标志=假

if empty_flag:

parser.print_help()

退出(0)

if args _ dict。get('方法')=='上传':

上传()

否则:

下载()

及格

cookie.json

本地新建cookie.json文件,与main.py同级

{

cookie_cnblogs ':'请替换为博客园cookie ',

'金爵饼干': '请替换为掘金饼干

}

开源代码库地址

最后附上开源代码库地址,里面除了演示的源码之外也有录制好的一个视频,有兴趣的同学可以下载使用或者研究研究,脚本有问题或者写的不好改进的地方也可以互相探讨下。有意见也可以随时留言反馈

以上就是用大蟒写个博客迁移工具的详细内容,更多关于大蟒博客迁移的资料请关注我们其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: