csdn文章分类修改脚本

以前写的文章分类太多,太乱了,所以决定来一次清理,把一些文章类别给替换掉。和LX同学讨论了一个下午,终于有一个方案了,搞了一晚上才弄好。

我是混合了python和js代码一起做的。js可以在浏览器的 控制窗下运行,不用登陆了,所以很方便。python我用的比较习惯,所以处理数据比较方便,而且不会丢失。

 

步骤如下:

step 1:先把文章列表抓下来,知道有哪些文章。markdown编写的文章不能处理!都进eid了!

 

 
  1. import urllib.request

  2.  
  3. import re

  4. ids = {} #保存所有的文章id

  5.  
  6. for i in range(30):#按15篇文章一页算自己有多少页

  7. url = "http://blog.csdn.net/firenet1/article/list/"+str(i+1)

  8. try:

  9. data = urllib.request.urlopen(url).read()

  10. except :

  11. continue

  12. data = data.decode('UTF-8')

  13. patterm = "/firenet1/article/details/[0-9]{5,10}"

  14. patterm = re.compile(patterm)

  15. data = patterm.findall(data,re.S|re.M|re.I)

  16. digit = re.compile(r"[0-9]{5,10}",re.S|re.M|re.I)

  17. print(len(data))

  18. for d in data:

  19. # print(d)

  20. d = digit.search(d)

  21. # print(d)

  22. # print(d.group())

  23. ids[d.group()] = 1

  24. print(len(ids))

  25. file = open("js_array.txt","w")

  26. out = "var id_array = new Array("

  27. for i in ids.keys():

  28. out+="\""+i+"\",\n"

  29. out+=");"

  30. file.write(out)

  31. file.close()

  32. '''

  33. 输出文件保存成js数组

  34. var id_array = new Array("77187506",

  35. "77073144",

  36. "77046721",

  37. "76766916",

  38. "76642319",

  39. "76195994")

  40. '''

step 2: 打开一个csdn博客编辑页,任何一页都行。F12进入控制台,在控制台里执行以下代码,这一步就能获得大部分文章的id,tag,类别

 

 

 
  1. var id_array = new Array("77187506", //这个就是上一步得到的文章id数组

  2. "77073144",

  3. "77046721",

  4. );

  5. #抓取文章标签和类别

  6. var time_out_th = 500;

  7. var i;

  8. var a;

  9. var id;

  10. var out;

  11. var eid; //执行不成功的文章id记录下来,可以自己打印出来看

  12. function getdata(){ //调用函数入口,通过timeout设置,每次抓取一个文章才进行下一个文章抓取

  13. i = 0;

  14. out = new Array();

  15. id = id_array[i];

  16. eid = new Array();

  17. a = window.open(id,"_blank"); //打开新的编辑页面

  18. setTimeout(doing,time_out_th);

  19. }

  20. function doing(){

  21. if(i == id_array.length) {

  22. console.log("finish");

  23. return i;

  24. }

  25. try{

  26. if(a != 0 && a.document.readyState == "complete"){ //判断新打开的页面是不是加载完毕了

  27. let cla = a.document.getElementById("txtTag").value;

  28. let lable = a.document.getElementById("d_tag2").innerHTML;

  29. lable = lable.replace("\n","");

  30. out.push(new Array(id,cla,lable));

  31. a.close();

  32. console.log("ok: "+i)

  33. i++;

  34. if(i == id_array.length) {

  35. console.log("finish");

  36. return i;

  37. }

  38. id = id_array[i];

  39. a = window.open(id,"_blank");

  40. }

  41. }

  42. catch(err){

  43. eid.push(id);

  44. console.log("err: "+i);

  45. i++;

  46. a.close();

  47. if(i == id_array.length) {

  48. console.log("finish");

  49. return i;

  50. }

  51. id = id_array[i];

  52. a = window.open(id,"_blank");

  53. }

  54. setTimeout(doing,time_out_th);

  55. }

  56. function output(){ //输出文本函数

  57. let res = "";

  58. for(let i = 0;i < out.length;i++){

  59. res += out[i][0]+"###,###"+out[i][1]+"###,###"+out[i][2]+"\n";

  60. }

  61. console.log(res);

  62. }

  63. /*

  64. 输出数据如下:复制黏贴到本地文本后用于后面的步骤

  65. 47311009###,###多校联合训练赛###,###<span title="单击删除该标签">hdu 5328</span><span title="单击删除该标签">hdu</span>

  66. */

step 3:打开自己的类别管理,F12进入控制台,执行以下代码

 

 

 
  1. ##获取文章类别总数

  2. var x = document.getElementsByClassName("tdleft")

  3. var y = ""

  4. for(var i = 1;i < x.length; i++){

  5. y += (x[i].firstChild.innerHTML)+"###,###\n";

  6. }

  7. console.log(y)

  8. /**

  9. 输出如下:每一行就是一个类别 ###,###以及后面的部分就是我想把这个类别换成其他类别,分割开,可以没有

  10. 动态规划###,###ACM-ICPC编程题,动态规划

  11. 数据结构###,###ACM-ICPC编程题,数据结构

  12. 字符串###,###ACM-ICPC编程题,字符串

  13. 模拟###,###ACM-ICPC编程题,模拟

  14. */


step 4:把所有文章的类别和tag都换成新的,我的tag是使用原来的tag,如果不够5个,会把原先的类别变成tag。python代码

 
  1. import urllib.request

  2.  
  3. import re

  4. patterm = "<span title=\"单击删除该标签\">[\w]+</span>"

  5. patterm = re.compile(patterm)

  6. articles = []

  7. #读取原来文章的tag和分类,并且处理成数组

  8. with open("classify_lable.txt","r",encoding="utf-8") as f:

  9. for i in f:

  10. i = i.split("###,###")

  11. i[2] = patterm.findall(i[2])

  12. k = ""

  13. j = 0

  14. while j < len(i[2]):

  15. i[2][j] = i[2][j].replace("<span title=\"单击删除该标签\">","")

  16. i[2][j] = i[2][j].replace("</span>","")

  17. k+=" "+i[2][j]

  18. j+=1

  19.  
  20. articles.append(i)

  21. print("articles: "+str(len(articles)))

  22.  
  23. #读取原来的分类列表,并且映射成字典,方便下一步

  24. origin = {}

  25. now = {}

  26. with open("classfyMap.txt","r",encoding="utf-8") as f:

  27. for i in f:

  28. i = i.replace("\n","")

  29. i = i.split("###,###")

  30. if(len(i[1]) == 0):

  31. continue

  32. i[1] = i[1].split(",")

  33. origin[i[0]] = i[1]

  34. for j in i[1]:

  35. now[j] = 1

  36. print("old category: %d"%(len(origin)))

  37. print("now category: %d"%(len(now)))

  38. # for i in now.keys():

  39. # print(i)

  40. #对于每一篇文章,更新tag以及把旧的类别换成新的,新的类别以'##'开头

  41. #这里用字典可以去重,tag和类别都不会重复

  42. new_article = []

  43. nolable = 0

  44. nocategory = 0

  45. for i in articles:

  46. lable_c = {}

  47. new_c = {}

  48. for j in i[2]:

  49. if(len(j) > 0):

  50. lable_c[j] = 1

  51. for j in i[1].split(","):

  52. if(len(j) > 0):

  53. lable_c[j] = 1

  54. if j in origin:

  55. for k in origin[j]:

  56. new_c[k] = 1

  57. category = []

  58. lable = []

  59. for j in lable_c.keys():

  60. lable.append(j)

  61. if(len(new_c) == 0):

  62. for j in lable:

  63. if(j in origin):

  64. new_c[j] = 1

  65. for j in new_c.keys():

  66. category.append(j)

  67. if(len(lable) == 0):

  68. nolable += 1

  69. if(len(category) == 0):

  70. nocategory += 1

  71. new_article.append([i[0],lable,category])

  72. print("finale set: %d nolable: %d nocategory: %d"%(len(new_article),nolable,nocategory))

  73. # for i in new_article:

  74. # print(i)

  75. #输出成js数组,用于下一步操作

  76. js_arry = "var arti = ["

  77. m = 0

  78. for i in new_article:

  79. lab = ""

  80. cat = ""

  81. for j in i[1]:

  82. lab += ("<span title=\'单击删除该标签\'>%s</span>"%(j))

  83. k = 0

  84. while k < len(i[2]):

  85. if k > 0:

  86. cat +=','

  87. cat += "##"+i[2][k]

  88. k += 1

  89. if (m > 0):

  90. js_arry += ",\n"

  91. js_arry += '["%s","%s","%s"]'%(i[0],lab,cat)

  92.  
  93.  
  94. m+=1

  95. js_arry +="];\n"

  96. print(js_arry)

step 5:这一步就把js代码放到控制台运行了,控制台还是要编辑页面的,这样就没有域的问题。因为url我没处理哦!执行比较久300+文章呢

 
  1. #更新文章类别和标签

  2. var arti = [["77187506","<span title='单击删除该标签'>布隆过滤器</span><span title='单击删除该标签'>我只想找工作</span>","##我只想找工作"],

  3. ["77073144","<span title='单击删除该标签'>hyperloglog</span><span title='单击删除该标签'>基数计数</span><span title='单击删除该标签'>我只想找工作</span>","##我只想找工作"],

  4. ["77046721","<span title='单击删除该标签'>信号量</span><span title='单击删除该标签'>临界区</span><span title='单击删除该标签'>自旋锁</span><span title='单击删除该标签'>操作系统</span><span title='单击删除该标签'>我只想找工作</span>","##操作系统,##我只想找工作"],

  5. 47438411","<span title='单击删除该标签'>2015多校联合训练赛</span><span title='单击删除该标签'>模拟</span>","##ACM-ICPC编程题,##模拟"],

  6. ];

  7. var time_out_th = 500;

  8. var i;

  9. var a;

  10. var id;

  11. var step = 0;

  12. var eid = new Array();

  13. function getdata(){

  14. i = 0;

  15. id = arti[i];

  16. step = 0;

  17. eid = new Array();

  18. a = window.open(id[0],"_blank");

  19. setTimeout(doing,time_out_th);

  20. }

  21. function doing(){

  22. if(i == arti.length) {

  23. console.log("finish");

  24. return i;

  25. }

  26. try{//加载完成后修改内容并点击保存,延时200毫秒再判断是否保存好了

  27. if(step == 0 && a != 0 && a.document.readyState == "complete"){

  28. a.document.getElementById("txtTag").value = id[2];

  29. a.document.getElementById("d_tag2").innerHTML = id[1];

  30. console.log("complete: "+i)

  31. step += 1

  32. a.document.getElementById("btnDraft").click()

  33. }

  34. }

  35. catch(err){

  36. console.log(err);

  37. console.log("err: "+i);

  38. eid.push(id[0]);

  39. i++;

  40. a.close();

  41. if(i == arti.length) {

  42. console.log("finish");

  43. return i;

  44. }

  45. step = 0

  46. id = arti[i];

  47. a = window.open(id[0],"_blank");

  48. }

  49. if(step == 1 && !a.saving){ //保存完毕,打开下一个网页

  50. a.close();

  51. console.log("ok: "+i)

  52. i++;

  53. if(i == arti.length) {

  54. console.log("finish");

  55. return i;

  56. }

  57. id = arti[i];

  58. a = window.open(id[0],"_blank");

  59. step = 0;

  60. }

  61. setTimeout(doing,time_out_th);

  62. }

step 6:打开文章分类,把只有0篇的分类删除掉。alert手动确认,不然好像因为缓存的原因,删不掉后面的

 
  1. #删除文章数为0的类别

  2. var a = document.getElementsByClassName("red");

  3. for(var i = 0;i < a.length;i++){

  4. var b = a[i].href;

  5. b = b.substring(b.length-7,b.length);

  6. var c = a[i].text;

  7. if(c == "0"){

  8. console.log(b+" "+c);

  9. $.get("?t=" + "del", { id: b, r: csdn.random() }, function (ret) {

  10. alert(1);

  11. });

  12. //ory?t=del&id=1380215&r=83505

  13. }

  14. }


源代码参考:https://gitlab.com/linyuwang/csdn-classfy-change/tree/master
 

step 7:按文章数对类型进行排序。在文章类别管理的console执行

 

 
  1. #把标签按文章数排序 这段代码有问题 总是有些没有移动的难道是缓存的问题?

  2. #反复执行几次才行

  3. var a = document.getElementsByClassName("red");

  4. var ids = new Array();

  5. var compare = function(x,y){

  6. if(x[1] > y[1]) return -1;

  7. if(x[1] == y[1]) return 0;

  8. return 1;

  9. }

  10. for(var i = 0;i < a.length;i++){

  11. var b = a[i].href;

  12. b = b.substring(b.length-7,b.length);

  13. var c = a[i].text;

  14. ids.push(new Array(b,Number(c),i));

  15. // console.log(b+" "+c);

  16. // $.get("?t=" + "del", { id: b, r: csdn.random() }, function (ret) {

  17. }

  18. ids.sort(compare);

  19. console.log(ids);

  20.  
  21. var i = 0

  22. function doing(){

  23. while(i != ids.length && ids[i][2] <= i){

  24. i++;

  25. }

  26. if(i == ids.length) return "finish";

  27. if(ids[i][2] > i){

  28. ids[i][2]--;

  29. let t = i;

  30. // $.get("?t=" + "up", { id: ids[i][0], r: csdn.random() },function () {

  31. // alert(t+","+ids[t][2]+","+ids[t][1]);});

  32. doExec("", ids[i][0], "up");

  33. }

  34. console.log(i+","+ids[i][2]+","+ids[i][1]);

  35. setTimeout(doing,500);

  36. }

  37. doing();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值