本文主要介绍如何用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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。