@

1.说明

之前写的博客都在csdn和博客园中

要将博客同步到自己的博客网站中

因为都是使用markdown格式书写的,所以直接爬取上传就完事

2.思路

分析了下博客园,发现可行。先登录进入自己的博客主页,可以看到有下一页的标志,每一页包含若干个博客详情,博客详情中包含edit页(编辑页面)和正常页面(其他用户访问的),要获取的就是eidt页面的博客名字,博客内容。博客分类在edit页面中不好获取,转而去正常页面获取,发现是一个ajax请求,传入用户id和博客id就可以获取到分类。信息获取到了就保存在本地,按分类保存。保存后就使用post请求发送到自己的博客网站中,或者直接写入数据库

3.代码

从文件读取请求头字典,构造函数传入的是文件名

class getHeaders(object):
def __init__(self,path):
self.dict_ = {}
with open(path, "r",encoding="utf8") as f:
line = f.readline()
while line: a = line.split(":")
self.clean_(a)
try:
self.dict_[a[0]] = a[1]
except:
pass
line = f.readline() def clean_(self,list_):
for i in range(len(list_)):
list_[i] = list_[i].strip() if len(list_) > 2 :#说明有多个:号
try:
#开头为空,说明元字符串开头有:
list_.remove("")
list_[0] = ":"+list_[0]
except:
#说明开头不为空
list_[1] = list_[1]+":"+list_[2]

爬博客园的代码

import requests
from lxml import etree
from GetHeaders import getHeaders
import os #博客园获取分类,传入ID
catagory_url = "https://www.cnblogs.com/simon-idea/ajax/CategoriesTags.aspx?blogId=xxxxxx&postId=%s"
#每一页中包含的url
link_list = []
#筛选详情页的url
detail_list = []
heads = getHeaders("博客园").dict_ for i in range(1,9):
url = "https://www.cnblogs.com/simon-idea/default.html?page=%s" #7
url = url % str(i)
req = requests.get(url, headers=heads)
html = etree.HTML(req.content)
every_page_links = html.xpath('//*[@id="mainContent"]/div/div/div/a/@href')
link_list.extend(every_page_links) for i in link_list:
if "Edit" in i :
detail_list.append(i) # assert 1 ==2 for i in detail_list:
url = i
req = requests.get(url, headers=heads)
a = req.content.decode(req.encoding)
html = etree.HTML(a)
# title //*[@id="Editor_Edit_txbTitle"]/@value
title = html.xpath('//*[@id="Editor_Edit_txbTitle"]/@value')[0]
# body //*[@id="Editor_Edit_EditorBody"]
body = html.xpath('//*[@id="Editor_Edit_EditorBody"]/text()')[0] req = requests.get(catagory_url % i[-8:], headers=heads)
a = req.content.decode(req.encoding)
html = etree.HTML(a)
catagory = html.xpath('//*[@id="BlogPostCategory"]/a/text()')[0] dirs = '博客/%s' % catagory if not os.path.exists(dirs):
os.makedirs(dirs)
with open("博客/%s/%s.md" % (catagory,title),"w",encoding="utf-8") as f:
f.write(body)

上传的代码有很多坑,不完善

因为原博客作者的博客路径定义的有问题

关于作者

个人博客网站

个人GitHub地址

个人公众号:

网站开发学习Python实现-Django项目部署-同步之前写的博客(6.2.2)的更多相关文章

  1. 网站开发学习Python实现-Django项目部署-介绍(6.2.1)

    @ 目录 1.第一步:找源码 2.第二步:在windows中更改代码 2.第三步:同步到linux中 3.第三步:部署 4.第四步:运行 关于作者 1.第一步:找源码 从github上找一个djang ...

  2. 网站开发学习Python实现-Django的models学习-生鲜项目(6.3.2)

    @ 目录 1.说明 2.模型类的设计 3.代码的具体实现 4.详情地址 关于作者 1.说明 models是django的很重要的部分,所以深入研究. 本文章的所研究项目为黑马教育python课程中的项 ...

  3. 网站开发学习Python实现-Django学习-总结(6.1.2)

    @ 目录 1.MVT 2.模型 3.视图 4.模板 5.常用的命令 6.pycharm创建django工程 关于作者 1.MVT 项目结构如下,其中项目同名文件夹为配置文件 每一个项目有多个应用(未考 ...

  4. 网站开发学习Python实现-Django学习-自学注意(6.1.3)

    @ 目录 1.配置文件相关 2.应用创建相关 3.项目相关 4.模板相关 5.其他 关于作者 1.配置文件相关 1.可以更改时间,地区相关(国际化) 2.BASE_DIR很重要,一个工程要有很好的移植 ...

  5. 网站开发学习Python实现-Django学习-介绍(6.1.1)

    @ 目录 1.MVT 2.ORM 关于作者 1.MVT 主要的目的是为了快速,简便的开发数据库驱动的网站,强调代码的复用,多个组件可以很方便以插件的方式服务于整个框架,采用的是MVT设计模式(差不多的 ...

  6. Linux学习笔记之Django项目部署(CentOS)----进阶篇

    一.引入 当我们开发好了一个Django项目之后是需要部署到服务器上的,这样才能正式使用这个项目.之前用了一个运行.sh文件的方法让项目得以在后台运行,其实随着学习的深入,这种方法其实是有点low的, ...

  7. Linux学习笔记之Django项目部署(CentOS)

    一.引入 用Django写了一个测试的项目,现在要部署在Linux上,一般这种情况下,只要在项目里面敲一行命令:python manage.py runserver 0.0.0.0:8000就行了.但 ...

  8. Django项目部署在Linux下以进程方式启动

    Django项目部署在Linux下以进程方式启动 这是一篇关于如何在linux下,以后台进程的方式运行服务,命令改改基本上就通用了. 开发完Django项目后,需要把项目部署到linux环境下.当然, ...

  9. Django项目部署(django+guncorn+virtualenv+nginx)

    一.说明 为了django项目部署到生产环境上,能够稳定的运行,且能够同时指出http和https的访问,对django的部署进行了一些研究,决定采用django + gunicorn + virtu ...

随机推荐

  1. 闭关苦修半年,最终靠着这份面试题,我成功拿到了阿里的offer!

    前言 我大概我是从去年12月份开始看书学习,到今年的6月份,一直学到看大家的面经基本上百分之90以上都会,我就在5月份开始投简历,边面试边补充基础知识等.也是有些辛苦.终于是在前不久拿到了阿里的off ...

  2. 实时检测微信域名防红拦截检测API系统,最新腾讯域名屏蔽检测官方接口

    最近手里有个项目需要检测域名在微信里是否可以打开,如果被微信拦截,则需要进行下一步操作,所以需要判断域名的状态,但是微信官方并没有提供相关查询的方法,最后在网上找到了这个接口地址,分享给有需要的朋友. ...

  3. 通俗解析莱文斯坦距离(Levenshtein Distance)计算原理(最小编辑距离)

    [版权声明]:本文章由danvid发布于http://danvid.cnblogs.com/,如需转载或部分使用请注明出处 最近看到一些动态规划的东西讲到莱文斯坦距离(编辑距离)的计算,发现很多都讲的 ...

  4. JVM(二)-内存区域之线程私有区

    概述: 对于从事C.C++开发的程序员来说,在内存管理领域,他们既是拥有最高权力的"皇帝",又是从事最基础工作的劳动人民--既拥有每个对象的"所有权", 又担负 ...

  5. yii2.0使用bootstrap中日期插件

    Yii2框架引用bootstrap中日期插件yii2-date-picker的方法. 使用composer安装 日期插件 php composer.phar require "2amigos ...

  6. sentinel快速入门

    转载:https://blog.csdn.net/noaman_wgs/article/details/103328793 https://github.com/alibaba/Sentinel/wi ...

  7. select监听服务端

    # can_read, can_write, _ = select.select(inputs, outputs, None, None)## 第一个参数是我们需要监听可读的套接字, 第二个参数是我们 ...

  8. 关于moviepy打包报错AttributeError: module audio/video.fx.all has no attribute fadein、crop文章的纠错和抄袭

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 老猿前面有篇文章<moviepy应用pyin ...

  9. 添加和读取Resources嵌入资源文件(例如.dll和.ssk文件)

    前言:有些程序运行的时候,可能调用外部的dll,用户使用时可能会不小心丢失这些dll,导致程序无法正常运行,因此可以考虑将这些dll嵌入到资源中,启动时自动释放.对于托管的dll,我们可以用打包软件合 ...

  10. 学习笔记:Prufer 编码

    Prufer 编码可以将无根树与序列之间进行转化. 一个 \(n\) 个点.区分编号的无向图 和 Prufer 序列一定是一一对应的,下面会给出映射方式. 借此可以证明 Cayley 定理: \(n\ ...