Python备份CSDN博客
用Python实现备份CSDN博客:
功能:备份输入user的所有博文到当前目录下的user文件夹内(html格式)
不足:暂时还没开多线程,并且反盗链之类还没有处理(虽然转载的文章一般都是保存没反盗链的图,但是,还是一个不足),然后就是语言的精简还需提高,比如文件名修正,应该可以用循环匹配查找…………
谢谢python技术交流群里的菜鱼和xiao等前辈的指导,编码问题给我郁闷了好久,欢迎大家拍砖。
————————
添加多线程,知道join了,呵呵
转为的exe版本见0分下载页http://download.csdn.net/detail/betabin/4377512
————————
上面的exe资源被Csdn删掉了,这能接受,可是连事后通知都没有,这有点………
貌似又恢复了……这…………
————————
把文件名的过滤用sub替代,减去冗余代码
会python的就自己脚本跑吧。
# -*- coding: cp936 -*-
'''
Author: BetaBin
Date: 2012/06/16
Function: Backup the csdn blog.
'''
import urllib
import urllib2
import os
import re
import traceback
import threading
import datetime#Global data
#日志链接,相对路径:日志名
blogurl = {}
savednum = 1
threadnum = 5
bloghost = 'http://blog.csdn.net'
bloguser = 'BetaBin'#获取infourl的html源码utf8编码
def getinfo(infourl, hostsite = ''):postdata = urllib.urlencode({})headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}if hostsite != '':print "hostsite: ", hostsiteheaders['Referer'] = hostsitereq = urllib2.Request(url = infourl,data = postdata,headers = headers)#return urllib2.urlopen(req).read().decode('utf8')urlfile = urllib2.urlopen(req)result = urlfile.read().decode('utf8')urlfile.close()return result#开始备份url页面的所有博客及后续页面博客
def backup(url):#获取内容result = getinfo(url)#找本页日志链接titlepatt = """class="link_title"><a href="(.*?)">[\\s]+(.*?)[\\s]+</a>"""retitle = re.compile(titlepatt)blogs = retitle.findall(result)#print "Got: ", blogsfor blog in blogs:blogurl[blog[0]] = blog[1]#print blog[0] + '\t\t' + blog[1]#找下页链接nextpagepatt = u"""<a href="(.*?)">下一页</a>"""renextpage = re.compile(nextpagepatt)pagelink = renextpage.search(result)if pagelink is not None:pagelink = renextpage.findall(result)truelink = pagelink[0].rfind('href')backup(bloghost + pagelink[0][truelink + 6:])#打印blogurl映射里的内容
def printbloglink():for item in blogurl:print item, "\t\t", blogurl[item]#找到博客正文内容
def getcontent(inforesult):contentpatt = """<div id="article_content" class="article_content"[\\s\\S]*?<div class="share_buttons\""""recontent = re.compile(contentpatt)result = recontent.search(inforesult)if result is not None:#根据前面正则匹配,最后26个字符是CSDN分享链接的,不需要return '<html><head><meta http-equiv="Content-Type" content="text ml; charset=utf-8" /></head><body>'+result.group()[:-26]+'</dody></html>'else:print "正文提取出错……"return None#根据博文相对链接,开始下载博文
blogurllock = threading.Lock()
def downloadblog():while True:#读取一条博文链接blogurllock.acquire()if (len(blogurl) > 0):item = blogurl.popitem()url = bloghost + item[0]title = item[1]global savednumblognum = savednumsavednum += 1else:blogurllock.release()returnblogurllock.release()#确定博文标题,重叠自动重命名if not os.path.exists(bloguser):os.makedirs(bloguser)title = ReplaceBadCharOfFileName(title)filename = titlefile_no = 1while os.path.isfile(bloguser + '/' + filename + '.html'):filename = title + '(' + str(file_no) + ')'file_no += 1#获取博客正文htmlcontent = getcontent(getinfo(url))if content is None:traceback.print_exc()#找图片链接picturepatt = """<img src="(http:.*?)"[\\s\\S]*?alt"""repicture = re.compile(picturepatt)pictures = repicture.findall(content)#下载图片,保存至相应文件夹for pictureurl in pictures:#创建文件夹folder = bloguser + '/' + filename + '/'picturename = pictureurl[pictureurl.rfind('/') + 1:] if not os.path.exists(folder):os.makedirs(folder) try: path = os.path.join(os.getcwd(), bloguser, filename, picturename)urllib.urlretrieve(pictureurl, path)except:print '图片保存失败,跳过此图片:', pictureurltraceback.print_exc()#一般失败是因为转载的反盗链#所以选择错了就该博文的全部图片都不下载breakelse:content = content.replace(pictureurl, filename + '/' + picturename, 1)bloghtml = open(bloguser + '/' + filename + '.html', 'wb')bloghtml.write(content.encode('utf8'))bloghtml.close()print "第", blognum, "篇博文", title, "保存完毕"#去掉文件名的不合法字符
def ReplaceBadCharOfFileName(filename):filename=filename.replace(" ","")filename=filename.replace("\\", "")#把一些冗余的操作用sub来消去,不过上面两个……badpatt = """[\*\?;|<>&/:]"""rebad = re.compile(badpatt)return rebad.sub("", filename)#检查账号是否存在
def isvaliduser():#forbiddenpatt = """<head><title>403 Forbidden</title></head>#reforbidden = re.compile(forbiddenpatt)try:getinfo(bloghost + '/' + bloguser)except:return Falseelse:return True#main function
bloguser = raw_input('请输入您的CSDN博客账号(例如http://blog.csdn.net/betabin中的betabin): ')if not isvaliduser():print "该账号无效"
else:starttime = datetime.datetime.now()backup(bloghost + "/" + bloguser)#downloadblog()#开多线程支持threads = []for threadid in range(threadnum):downloadthread = threading.Thread(None, downloadblog)threads.append(downloadthread)downloadthread.start()for downloadthread in threads:downloadthread.join()endtime = datetime.datetime.now()print "共用时:", endtime - starttimeprint "备份完毕"
Python备份CSDN博客相关推荐
- Python备份CSDN博客的完整页面
在CSDN论坛发现了一个求助帖,帮忙修改一个备份CSDN博客的Python脚本,应该是运行不了的代码.代码的时间比较久远,而且是用python2写的,所以我并没有尝试运行就直接用Python3来进行改 ...
- python csdn博客_GitHub - 1783955902/CSDNBlogBackup: Python实现CSDN博客的完整备份
Python实现CSDN博客的完美备份 出发点 之所以造这个轮子无非是现有的轮子不好使,CSDN官网是推出的博客备份在系统中读不到博客数据,打开后还会闪退,其他人写的工具,要么是收费,要么只是对网页的 ...
- python+shell 备份 CSDN 博客文章,CSDN博客备份工具
python+shell 备份 CSDN 博客文章,CSDN博客备份工具 在 csdn 写了几年的博客了.多少也积累了两三百篇博文,近日,想把自己的这些文章全部备份下来,于是开始寻找解决方案. 我找到 ...
- 备份CSDN博客正文到本地存档
大哥有了新想法,然而没有技术,令人欣慰的是大哥想到了我,于是我便答应免费帮个忙,这是一个基于云的项目,具体细节也就不透露了,然而在实现的过程中,其中一个模块我觉得可以自用,于是我就想把这个模块抽出来, ...
- Python爬虫-CSDN博客排行榜数据爬取
文章目录 前言 网络爬虫 搜索引擎 爬虫应用 谨防违法 爬虫实战 网页分析 编写代码 运行效果 反爬技术 前言 开始接触 CTF 网络安全比赛发现不会写 Python 脚本的话简直寸步难行--故丢弃 ...
- Python采集CSDN博客排行榜数据
文章目录 前言 网络爬虫 搜索引擎 爬虫应用 谨防违法 爬虫实战 网页分析 编写代码 运行效果 反爬技术 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语法过后,不知道在 ...
- 备份 CSDN 博客(上)
文章目录 背景 思路解析 如何获得每篇文章的 URL urllib.request HTML 的元素构成 BeautifulSoup 根据标签和属性识别 根据标签和内容识别 其他操作 代码 参考资料 ...
- Python爬虫小实践:爬取任意CSDN博客所有文章的文字内容(或可改写为保存其他的元素),间接增加博客访问量...
Python并不是我的主业,当初学Python主要是为了学爬虫,以为自己觉得能够从网上爬东西是一件非常神奇又是一件非常有用的事情,因为我们可以获取一些方面的数据或者其他的东西,反正各有用处. 这两天闲 ...
- python爬虫爬取csdn博客专家所有博客内容
python爬虫爬取csdn博客专家所有博客内容: 全部过程采取自动识别与抓取,抓取结果是将一个博主的所有 文章存放在以其名字命名的文件内,代码如下 #coding:utf-8import urlli ...
最新文章
- 广东“基因编辑婴儿事件”调查组:将对贺建奎依法依规严肃处理
- python从入门到精通书籍推荐-清华大学出版社-图书详情-《Python从入门到精通》...
- 特征值和特征向量(Eigenvalues and Eigenvectors)
- 【年度技术观点合集】计算机视觉,自然语言,机器学习…看看顶级科学家们怎么说
- CMDB服务器管理系统【s5day90】:创建资产更新服务器硬盘信息
- 项目中用到的关于时间段不能重复的解决方法
- Spring中使用Quartz之MethodInvokingJobDetailFactoryBean配置任务
- 在Eclipse中使用Gradle开发web3j以太坊应用
- 高并发服务器逻辑处理瓶颈,如何解决?
- uygurqa输入法android,uygurqa维语输入法2021
- Android富文本编辑器RichEditor的使用
- 金山打字测试一分钟软件,金山打字2006——一款打字练习及测试软件.doc
- 计算机应用技术拼音,搜狗拼音输入法研究 - 东北大学计算机应用技术研究所Web信息处理小组 - BlogJava...
- JQ ajax 请求事件处理
- Hello C++(十九)——C++类型识别
- f(f(x))=-x, 纯数学理解
- 百鸡问题用计算机思维,大力出奇迹:当古代数学难题遇到现代计算机
- Android: Switch更改颜色
- vscode Trace/breakpoint trap 问题
- 2021百度网盘网页版视频在线倍速播放