当前位置:   article > 正文

博客整理大全

博客

目录

一,获得所有博客地址

1,获得包含所有博客链接的文本

2,提取所有博客链接

3,获得所有博客id

二,博客备份

1,自动备份

2,手动备份

三,构建所有博客列表

1,构建所有博客列表

2,优化——避免手动计算目录深度

3,优化——加速

四,获得所有博客标题

五 ,如何看哪些博客不止1个分类

六,寻找丢失的博客

1,方法一(比较标题,已失效)

2,方法二(比较链接)

3,方法三(改进的方法二)


一,获得所有博客地址

1,获得包含所有博客链接的文本

首先,要写一个博客,里面包含自己所有博客的链接,然后运行如下程序

  1. import re
  2. import urllib.request
  3. def getTxtWithAllUrl():
  4. url = 'https://blog.csdn.net/nameofcsdn/article/details/109147261'
  5. html = urllib.request.urlopen(url).read().decode('utf-8')
  6. return str(html)

获得这个文本内容的方法还有很多,比如读取本地文件。

2,提取所有博客链接

依赖项:getTxtWithAllUrl 函数

  1. import re
  2. import urllib.request
  3. def getAllUrl(strg):
  4. all_url = re.findall('http[s]*://blog.csdn.net/nameofcsdn/article/details/[0-9]+', strg, re.IGNORECASE)
  5. all_url = list(set(all_url))
  6. fp = open('D:\\csdn.txt', 'w')
  7. s = 0
  8. for each in all_url:
  9. fp.write(each + '\n')
  10. s = s + 1
  11. print(s)
  12. getAllUrl(getTxtWithAllUrl())

这样就在D盘根目录新建了文件csdn.txt,并且存下了所有博客的链接

3,获得所有博客id

依赖项:本地D盘的 csdn.txt

先获得所有博客链接,然后运行下面的程序转化成id

  1. # coding=utf-8
  2. import re
  3. import urllib.request
  4. def getIdFromUrl(url):
  5. url = url.replace('\n', '')
  6. url = url[-9:]
  7. url = url.replace('/', '')
  8. return url
  9. def printUrl(url):
  10. print(getIdFromUrl(url))
  11. fp = open('D:\\csdn.txt', 'r', encoding='utf-8')
  12. for each in fp:
  13. printUrl(each)

二,博客备份

1,自动备份

依赖项:本地D盘的 csdn.txt

在D盘根目录下csdn.txt中存下了所有博客的链接之后,再运行下面的程序即可读取每一篇博客,如果是纯文本的博客还可以直接写到txt。

  1. #coding=utf-8
  2. import re
  3. import urllib.request
  4. import os
  5. fp = open('D:' + '\\' + 'csdn.txt','r').readlines()
  6. for line in fp:
  7. if line == '\n':
  8. break
  9. try:
  10. urllib.request.urlopen(line.strip('\n')).read()
  11. except:
  12. print('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')
  13. print(line)

PS:不要用这个程序刷访问量,小心被封号。

2,手动备份

自动备份的功能太有限,所以我选择手动备份。

IE和谷歌浏览器都支持把网页保存到本地,而且是打包成一个文件,mht或者mhtml文件,可以直接打开,而且其中包含了博客链接地址,非常方便。

最绝的是,我可以用文件夹的方式管理我的所有博客,脱离CSDN的标签系统,因为CSDN一直在变,太难用了。

三,构建所有博客列表

因为CSDN恶心的限制,一篇文章不能超过64000字,所以我不得不用Markdown编辑器,不过利用markdown编辑器自动生成标题和目录,倒是非常方便。

依赖项:所有博客都有本地备份文件。

1,构建所有博客列表

对照Markdown的语法,控制程序输出的格式:

  1. import re, os
  2. import urllib.request
  3. def out(n):
  4. if n:
  5. print("#", end='')
  6. out(n-1)
  7. def readfile(A, file):
  8. f = open(file, 'r').read()
  9. try:
  10. url = re.findall('Content-Location: http[s]*://blog.csdn.net/nameofcsdn/article/details/[0-9]+', str(f))
  11. eachurl = url[0][18:]
  12. except:
  13. url = re.findall('http[s]*://blog.csdn.net/nameofcsdn/article/details/[0-9]+', str(f))
  14. eachurl = url[0]
  15. html = urllib.request.urlopen(eachurl).read().decode('UTF-8')
  16. title = re.findall('var articleTitle =.*;', str(html))
  17. eachtitle = title[0]
  18. aurl = eachtitle[20:-2] + ' '+eachurl
  19. A.append(aurl)
  20. def outpath(path1, path2, deep):
  21. path1 = os.path.join(path1, path2)
  22. mylist = os.listdir(path1)
  23. out(deep)
  24. if os.path.isdir(os.path.join(path1, mylist[0])): # 全是目录
  25. print(' ', path2)
  26. for adir in mylist:
  27. outpath(path1, adir, deep + 1)
  28. else: # 全是文件
  29. A = []
  30. for adir in mylist:
  31. try:
  32. readfile(A, os.path.join(path1, adir))
  33. except:
  34. A.append(adir)
  35. print(' ', path2, ' 共', len(mylist), '篇')
  36. A.sort()
  37. for each in A:
  38. print(each[:-58] + ' [博客链接](' + each[-58:] + ')')
  39. outpath('D:\\朱聪', '博客备份(2020年10月20日)', 0) # 0对应path2 = '博客备份'以此类推

运行结果:

把输出的内容直接粘贴到博客里面就得到了:所有博客导航

之所以用“博客链接”这个词而不是用“Link”这个词,是因为link在一些博客标题里面出现了,所以不是很方便。

2,优化——避免手动计算目录深度

把最后一行函数调用的地方换成:

  1. path = r'D:\朱聪\博客备份\7,数学与逻辑\7.6, 从数学到编程'
  2. loc = path.rfind('\\')
  3. path1 = path[0:loc]
  4. outpath(path1, path[loc+1:], len(path1.split('\\'))-2)

这样每次只需要直接把绝对路径复制过来即可,不需要其他任何操作。

3,优化——加速

逐个打开网页的方法太慢了,于是我决定把信息存下来,下次运行就不用再访问网页了。

考虑了几种方式之后,我选择了直接修改文件名的方式,把每个博客的文件名直接改成博客标题。

但是这样又有个问题,有些符号没法作为文件名,

所以实际策略是,能改文件名的就改,改不了的就不改,就需要每次访问网页。

在不能用作文件名的符号中,英文冒号:出现在我的博客里面很多,其他的都是个例,所以我在改文件名的时候,把英文冒号改成中文冒号。

代码:

  1. import re, os
  2. import urllib.request
  3. def out(n):
  4. if n:
  5. print("#", end='')
  6. out(n - 1)
  7. def getUrlFromFile(file):
  8. f = open(file, 'r').read()
  9. try:
  10. url = re.findall('Content-Location: http[s]*://blog.csdn.net/nameofcsdn/article/details/[0-9]+', str(f))
  11. ret = url[0][18:]
  12. except:
  13. url = re.findall('http[s]*://blog.csdn.net/nameofcsdn/article/details/[0-9]+', str(f))
  14. ret = url[0]
  15. return ret
  16. def getTitleFromFile(file):
  17. eachurl = getUrlFromFile(file)
  18. try:
  19. html = urllib.request.urlopen(eachurl).read().decode('UTF-8')
  20. except:
  21. print(file)
  22. title = re.findall('var articleTitle =.*;', str(html))
  23. eachtitle = title[0]
  24. aurl = eachtitle[20:-2]
  25. return aurl
  26. def outpath(path1, path2, deep):
  27. path1 = os.path.join(path1, path2)
  28. mylist = os.listdir(path1)
  29. out(deep)
  30. if os.path.isdir(os.path.join(path1, mylist[0])): # 全是目录
  31. print(' ', path2)
  32. for adir in mylist:
  33. outpath(path1, adir, deep + 1)
  34. else: # 全是文件
  35. A = []
  36. for adir in mylist:
  37. file = os.path.join(path1, adir)
  38. filename = getUrlFromFile(file)
  39. if 'CSDN博客' in adir or 'nameofcsdn' in adir:
  40. title = getTitleFromFile(file)
  41. else:
  42. title = adir[:-4]
  43. A.append(title + ' ' + filename)
  44. title = title.replace(':',':')
  45. try:
  46. os.replace(file, os.path.join(path1, title + '.mht'))
  47. except:
  48. nothing = 0
  49. print(' ', path2, ' 共', len(mylist), '篇')
  50. A.sort()
  51. for each in A:
  52. print(each[:-58] + ' [博客链接](' + each[-58:] + ')')
  53. path = r'D:\朱聪\博客备份\CSDN'
  54. loc = path.rfind('\\')
  55. path1 = path[0:loc]
  56. outpath(path1, path[loc + 1:], len(path1.split('\\')) - 3)

优化之前,扫描1300篇博客大概需要30分钟,优化之后只需要2分钟

四,获得所有博客标题

依赖项:所有博客都有本地备份文件。

 根据本地备份的博客,生成博客列表:

  1. import re, os
  2. import urllib.request
  3. def out(n):
  4. if n:
  5. print("#", end='')
  6. out(n-1)
  7. def readfile(A, file):
  8. f = open(file, 'r').read()
  9. try:
  10. url = re.findall('Content-Location: http[s]*://blog.csdn.net/nameofcsdn/article/details/[0-9]+', str(f))
  11. eachurl = url[0][18:]
  12. except:
  13. url = re.findall('http[s]*://blog.csdn.net/nameofcsdn/article/details/[0-9]+', str(f))
  14. eachurl = url[0]
  15. html = urllib.request.urlopen(eachurl).read().decode('UTF-8')
  16. title = re.findall('var articleTitle =.*;', str(html))
  17. eachtitle = title[0]
  18. aurl = eachtitle[20:-2] + ' '+eachurl
  19. A.append(aurl)
  20. def outpath(path1, path2, deep):
  21. path1 = os.path.join(path1, path2)
  22. mylist = os.listdir(path1)
  23. # out(deep)
  24. if os.path.isdir(os.path.join(path1, mylist[0])): # 全是目录
  25. # print(' ', path2)
  26. for adir in mylist:
  27. outpath(path1, adir, deep + 1)
  28. else: # 全是文件
  29. A = []
  30. for adir in mylist:
  31. try:
  32. readfile(A, os.path.join(path1, adir))
  33. except:
  34. A.append(adir)
  35. # print(' ', path2, ' 共', len(mylist), '篇')
  36. A.sort()
  37. for each in A:
  38. print(each[:-58])
  39. # print(each[:-58] + ' [博客链接](' + each[-58:] + ')')
  40. outpath('D:\\朱聪', '博客备份(2020年10月18日)', 0) # 0对应path2 = '博客备份'以此类推
  41. # outpath('D:\\朱聪\\博客备份(2020年10月18日)', '9,其他', 1)

运行:

五 ,如何看哪些博客不止1个分类

csdn博客可以自定义分类,形式和微信一样,每篇博客可以不分到任何一类,也可以分到一类或多类。

前不久csdn更新之后终于可以查看哪些博客是没有分类的了,

直接打开CSDN就可以看得到:

现在的问题是,如何查看哪些博客不止1个分类呢?为此我写了一个简单的python程序。

依赖项:本地D盘的 csdn.txt

  1. # coding=utf-8
  2. import re
  3. import urllib.request
  4. import os
  5. fp = open('D:' + '\\' + 'csdn.txt','r').readlines()
  6. for line in fp:
  7. if line == '\n':
  8. break
  9. try:
  10. html = urllib.request.urlopen(line.strip('\n')).read().decode('utf-8')
  11. m = re.findall('个人分类:</span>.*?https://blog.csdn.net/nameofcsdn/article.*?"_blank">.*?</a>', str(html),re.DOTALL)
  12. print(m[0][121:-10])
  13. print(line)
  14. except:
  15. print(line)

六,寻找丢失的博客

1,方法一(比较标题,已失效)

2020年10月20日。

因为我重写所有博客导航这篇博客之后发现少了一篇,系统统计是1570篇,我本地是1569篇。

我排查了标签有new的博客,并没有找到。老办法,数据挖掘,数据分析,python上场。

首先我们要拿到系统给的所有博客的列表:

(因为2篇博客正在审核中,所以截图这会显示的是1568)

这里的导出数据功能只能导出1000个(CSDN你真的是要我每天和你斗智斗勇啊,为了写点博客想尽办法,比密室逃脱还刺激)

所以要正序、逆序各导出一份,然后拼接起来。

然后根据本地备份的博客生成博客标题列表。

最后,用excel或者文本比较工具,就可以找出这个幽灵了。

原来,是一篇new博客,但是标签贴错了,贴成更新了。

哎,我怎么早没想到呢,搞得大半夜三点半写完代码在这忏悔。

啥也不是,睡觉!

2,方法二(比较链接)

2021年9月11日。

CSDN又更新了,上面的方法又不行了,我真的真的真的无比痛恨CSDN反反复复反反复复的更新,太烦了。

我又找到了新的方法,把系统上的所有博客链接和本地的所有博客链接对比。

(1)系统上的所有博客链接

依赖项:getAllUrl函数

访问新版主页nameofcsdn的博客,不停的按【page down】按钮,直到把所有博客都显示出来,然后用ctrl+s把页面保存到本地。

然后再打开博客,查看网页源代码,复制,放到D:\\nameofcsdn.txt里,

再运行程序即可获得所有博客的列表。

  1. f = open('D:\\nameofcsdn.txt','r',encoding='utf-8',errors='ignore').read()
  2. f = str(f)
  3. getAllUrl(f)

(2)本地的所有博客链接

依赖项:所有博客都有本地备份文件。

对于本地博客,直接把上面的代码略改,不输出博客名,只输出博客链接:

  1. import re, os
  2. import urllib.request
  3. def getUrlFromFile(file):
  4. f = open(file, 'r').read()
  5. try:
  6. url = re.findall('Content-Location: http[s]*://blog.csdn.net/nameofcsdn/article/details/[0-9]+', str(f))
  7. ret = url[0][18:]
  8. except:
  9. url = re.findall('http[s]*://blog.csdn.net/nameofcsdn/article/details/[0-9]+', str(f))
  10. ret = url[0]
  11. return ret
  12. def getTitleFromFile(file):
  13. eachurl = getUrlFromFile(file)
  14. try:
  15. html = urllib.request.urlopen(eachurl).read().decode('UTF-8')
  16. except:
  17. print(file)
  18. title = re.findall('var articleTitle =.*;', str(html))
  19. eachtitle = title[0]
  20. aurl = eachtitle[20:-2]
  21. return aurl
  22. def outpath(path1, path2, deep):
  23. path1 = os.path.join(path1, path2)
  24. mylist = os.listdir(path1)
  25. if os.path.isdir(os.path.join(path1, mylist[0])): # 全是目录
  26. for adir in mylist:
  27. outpath(path1, adir, deep + 1)
  28. else: # 全是文件
  29. A = []
  30. for adir in mylist:
  31. file = os.path.join(path1, adir)
  32. filename = getUrlFromFile(file)
  33. if 'CSDN博客' in adir or 'nameofcsdn' in adir:
  34. title = getTitleFromFile(file)
  35. else:
  36. title = adir[:-4]
  37. A.append(title + ' ' + filename)
  38. A.sort()
  39. for each in A:
  40. each = each[-58:]
  41. while each[0] == ' ':
  42. each = each[1:]
  43. print(each)
  44. path = r'D:\\朱聪\\博客备份\\CSDN'
  45. loc = path.rfind('\\')
  46. path1 = path[0:loc]
  47. outpath(path1, path[loc + 1:], len(path1.split('\\')) - 3)

3,方法三(改进的方法二)

直接把2个博客列表都算出来,然后进行比对。

依赖项:getTxtWithAllUrl函数、getAllUrl函数

先更新D:\\nameofcsdn.txt,步骤同方法二。

然后运行:

  1. import re
  2. import urllib.request
  3. def showDif(lista,listb):
  4. for a in lista:
  5. if a not in listb:
  6. print(a)
  7. f = open('D:\\nameofcsdn.txt','r',encoding='utf-8',errors='ignore').read()
  8. lista = getAllUrl(str(f))
  9. listb = getAllUrl(getTxtWithAllUrl())
  10. print(len(lista))
  11. print(len(listb))
  12. showDif(lista,listb)
  13. print("---")
  14. showDif(listb,lista)

输出2个博客列表,第一个列表中要么是无效链接,要么是本地丢失的博客,第二个列表都是私密博客的链接

七,获取所有包含代码的博客链接

方法:寻找html源码中的代码标签

  1. import re
  2. import urllib.request
  3. def getTxtWithAllUrl():
  4. url = 'https://blog.csdn.net/nameofcsdn/article/details/109147261'
  5. html = urllib.request.urlopen(url).read().decode('utf-8')
  6. return str(html)
  7. strg = getTxtWithAllUrl()
  8. all_url = re.findall('http[s]*://blog.csdn.net/nameofcsdn/article/details/[0-9]+', strg, re.IGNORECASE)
  9. all_url = list(set(all_url))
  10. in_list=[]
  11. not_in_list=[]
  12. for url in all_url:
  13. html = ''
  14. try:
  15. html = urllib.request.urlopen(url).read().decode('utf-8')
  16. print('open succ')
  17. except:
  18. print('open fail',end=' ')
  19. print(url)
  20. if 'code class' in html:
  21. in_list.append(url)
  22. else:
  23. not_in_list.append(url)
  24. print('in_list')
  25. for url in in_list:
  26. print(url)
  27. print('not_in_list')
  28. for url in not_in_list:
  29. print(url)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/513032
推荐阅读
相关标签
  

闽ICP备14008679号