博客互链整理

〇,背景

最近一直在做博客的整合、小结,所有很多博客删掉了。

之前博客最多的时候是1600+,不到一个月,已经只有1200+了,而且还在进一步减少。

因为我的博客有很多互链,而且早期我放链接的习惯是

这样就有个问题,当这篇博客删掉之后,我就不知道原本是想链到哪篇博客了。

如果早期的习惯是直接把博客名显示出来,就没有这个问题了。

一,需求分析

为了解决博客删除之后,链接失效的问题,需要做一个记录,把所有博客之间的所有互链存下来。

记录分为2部分:

(1)博客链接和博客名称的对应

(2)博客之间的互链关系

二,博客链接和博客名称的对应

在 博客整理大全 一文中,我给出了扫描本地目录,输出博客标题和链接的程序。

这个程序基本上能满足此处的需求。

三,博客之间的互链关系(V1)

首先得到自己的所有博客链接。

然后打开每个博客,分析其中的互链:


#coding=utf-8
import re
import urllib.request

def printUrl(url):
    url = url.replace('\n', '')
    url = url[-11:]
    url = url.replace('/', '')
    print(url, end='')

def findAllUrl(eachurl):
    html = urllib.request.urlopen(eachurl).read().decode('UTF-8')
    url = re.findall('http[s]*://blog.csdn.net/nameofcsdn/article/details/[0-9]+', str(html))
    url = set(url)
    printUrl(eachurl+': ')
    for aurl in url:
        printUrl(aurl+'  ')
    print('')


fp = open('D:\\csdn.txt', 'r', encoding='utf-8')
for each in fp:
    findAllUrl(each)

然后再把几个特殊数据处理一下:

(1)把首页nameofcsdn的博客_csuzhucong_CSDN博客左侧导航栏里面包含的链接,也就是所有博客都会包含的链接,清理掉

(2)把109147261: 这一行删掉,52090098这一行也是,58655623这一行也是,也就是说,我把这3篇特殊的博客,添加到我的白名单中。

于是,我们终于得到了所有博客互链的粗略稿,在D盘根目录下新建文件allurl.txt,内容就是上面得到的数据:

103625577:   103625577   

103639622:   103639622   52137424   52138521   103692450   79699826   79691556   103625577   52131848   52219820   79692807   79692211   79806029   

103640346:   103640346   78734818   

103640355:   103640355   

103675432:   103675432   

。。。。。。省略很多行

81609676:   68955586   67071681   68955598   81605159   68955612   68955601   68955591   81590334   68955568   68955581   81571011   81609676   68955605   

82528855:   82528855   81571011   67071681   

87867935:   87867935   

87874041:   87874041   

87923401:   87923401   

88728532:   67071681   55048686   88728532   

89091420:   89091420   

95457244:   95457244   

然后再访问这里面的所有博客,看看哪些博客已经失效

# coding=utf-8
import re
import urllib.request

fp = open('D:\\allurl.txt', 'r', encoding='utf-8').read()
urllist = set(re.findall('[0-9]+', fp))
for eachurl in urllist:
    try:
        urllib.request.urlopen('https://blog.csdn.net/nameofcsdn/article/details/'+eachurl).read()
    except:
        print(eachurl)

把输出的数据再过滤一遍:


#include<iostream>
using namespace std;

int main() {
    string s;
    vector<string>v;
    while (cin >> s) {
        if (s.length() >= 8 && s[0]>'0')v.push_back(s);
    }
    for (string s : v) {
        cout << s + " ";
    }
    return 0;
}

过滤得到:

53407019 107191577 78453595 69906180 932342812 51996032 52079170 10687461 52072753 78445846 53409688 107673040 51996256 106396339 52025142 53165219 69877153 104091938 10411109 52149824 106418150 104487171 104086350 52005603 104999454 105260310 106915634 78446030 79682936 106436711 78453594 52079084 72621828 108652905 72785355 110587503 53130351 52014149 11045769 52644897 10501986 791212051 69879471 53335270 72829283 72632676 106196224 106537960 144590691 805393421 528169031 52077139 107085397 78461897 106723896 79829112 79697208 102317301 104100867 52524806 78713812 52080737 118259152 72594349 52093195 79747086 10663015 78463197

然后逐个分析,对于正常博客互链失效的,则要么更新博客,要么删掉这个互链统计,具体情况具体分析。

这样,我们就再次得到了所有博客的互链信息,并且失效的链接已经确认过有博客标题。

后面删除博客的时候,搜索一下就知道有没有被链到,如果被链到就修改链接为新链接即可。

所有博客互链:

103639622:   103639622   52137424   52138521   103692450   79699826   79691556   103625577   52131848   52219820   79692807   79692211   79806029   
103640346:   103640346   78734818     
103675478:   103909394   103675478   
103688900:   103688936   103688900   103707482   52100217   
103688936:   103688936   52100217    
103692450:   107223702   103692450   107191577   
。。。。。。省略很多行
81571011:   81571011   81605159   81590334   81609676   
81571274:   109147261   81571274   
81590334:   109147261   81590334   
81605159:   109147261   81605159   81609676   
81609676:   68955586   67071681   68955598   81605159   68955612   68955601   68955591   81590334   68955568   68955581   81571011   81609676   68955605   
82528855:   82528855   81571011   67071681   
88728532:   67071681   55048686   88728532   

四,优化——黑白名单

今天(2021年4月19日)我第二次编辑本博客,也是第二次整理互链,我遇到了麻烦。

我发现如果一个失效链接出现在文章开头一段,它就会自动出现在文章摘要里面(在html的head里面),

那么,即使我改了正文,重新用程序分析的话还是会把它识别出来,那么每次都要给它确认一次。

一个比较可行的方案是添加白名单(上文有提到白名单),另外一个可行的方案是在抓取互链时,忽略每篇博客的head

由于还有别的情况也可以采取白名单或者黑名单过滤,所以这次我先按照顺便记录黑白名单的思路进行梳理,下次梳理互链时实现黑白名单机制。

如果程序检测到A到B的链接失效,那么就看A是否在A名单中,或者B是否在B名单中,在的话就过滤掉

A名单:

78445602 69889233 53321264 53164652 106436743

B名单:

932342812 10687461 10411109 104487171 105260310

五,优化——私密博客(V2)

首先获得所有博客id,结果存入'D:\\csdn.txt'

然后把V1中的程序改成:

#coding=utf-8
import re
import urllib.request

def printUrl(url):
    url = url.replace('\n', '')
    url = url[-11:]
    url = url.replace('/', '')
    print(url, end='')

def findAllUrl(eachurl):
    html = urllib.request.urlopen('https://blog.csdn.net/nameofcsdn/article/details/'+eachurl).read().decode('UTF-8')
    url = re.findall('http[s]*://blog.csdn.net/nameofcsdn/article/details/[0-9]+', str(html))
    url = set(url)
    print(eachurl+': ', end='')
    for aurl in url:
        printUrl(aurl+'  ')
    print('')


fp = open('D:\\csdn.txt', 'r', encoding='utf-8')
for each in fp:
    each = each.replace('\n', '')
    findAllUrl(each)

然后再优化,加入黑白名单功能。

首先就是,事实证明,我在改动博客的时候懒得去查询互链关系的统计表,干脆还是每隔一段时间全盘整理一下比较方便。

基于此,我就不需要输出那些正常的互链了,只需要输出异常的互链。

#coding=utf-8
import re
import urllib.request

def getIdFromUrl(url):
    url = url.replace('\n', '')
    url = url[-9:]
    url = url.replace('/', '')
    return url

def findAllUrl(eachurl, allId):
    html = urllib.request.urlopen('https://blog.csdn.net/nameofcsdn/article/details/'+eachurl).read().decode('UTF-8')
    url = re.findall('http[s]*://blog.csdn.net/nameofcsdn/article/details/[0-9]+', str(html))
    url = set(url)
    print(eachurl+': ', end='')
    for aurl in url:
        aurl = getIdFromUrl(aurl)
        if aurl not in allId:
            print(aurl, end='  ')
    print('')


path = 'D:\\csdn.txt'
fp = open(path, 'r', encoding='utf-8')
allId = []
for each in fp:
    each = each.replace('\n', '')
    allId.append(each)

fp = open(path, 'r', encoding='utf-8')
for each in fp:
    each = each.replace('\n', '')
    findAllUrl(each, allId)

运行:

 输出已经变得非常简洁了,接下来就要对一些高频出现的id进行特殊处理了。

#coding=utf-8
import re
import urllib.request

def getIdFromUrl(url):
    url = url.replace('\n', '')
    url = url[-9:]
    url = url.replace('/', '')
    return url

def findAllUrl(eachurl, allId):
    html = urllib.request.urlopen('https://blog.csdn.net/nameofcsdn/article/details/'+eachurl).read().decode('UTF-8')
    url = re.findall('http[s]*://blog.csdn.net/nameofcsdn/article/details/[0-9]+', str(html))
    url = set(url)
    print(eachurl+': ', end='')
    for aurl in url:
        aurl = getIdFromUrl(aurl)
        if aurl not in allId:
            print(aurl, end='  ')
    print('')


path = 'D:\\csdn.txt'
fp = open(path, 'r', encoding='utf-8')
allId = []
for each in fp:
    each = each.replace('\n', '')
    allId.append(each)
allId.append('120231554') # 左侧导航栏里面包含的链接,也就是所有博客都会包含的链接

#simi记录私密博客列表,私密博客无法直接在线访问
simi = ['118885560','118854316','118523120','118462392','118442806','118400482','118381528','118281568','118210658']
fp = open(path, 'r', encoding='utf-8')
for each in fp:
    each = each.replace('\n', '')
    if each not in simi:
        findAllUrl(each, allId)

然后就是处理一些类似106795925: tails107 的案例

我们发现原文是这样的:https://blog.csdn.net/nameofcsdn/article/details/107<em>2</em>3536

所以按照长度截取,然后去除特殊符号之后,我的程序识别出来的就是tails107

这里有2种解决思路,一种是自动把107<em>2</em>35360识别出来,变成107235360,另外一种是直接忽略这种情况。

据我观察,直接忽略就行,因为这个链接在正文里面会出现。

于是我新增一个校验id的功能:

def checkId(id):
    if id.isdigit():
        return True
    return False

接着又有类似104828188: 048268861的案例,我们发现原文是这样的:参见https://blog.csdn.net/nameofcsdn/article/details/1048268861,弱序关系,问题在于前面的链接和后面的1,弱序关系接上了,所以需要优化从getIdFromUrl函数:

def getIdFromUrl(url):
    d = url.rfind('/')
    return url[d+1:]

这样的话,就不需要校验id是否是纯数字了,但是还是可以校验id的。

然后再把无异常链接的直接省略不打印,完整代码:

#coding=utf-8
import re
import urllib.request

def getIdFromUrl(url):
    d = url.rfind('/')
    return url[d+1:]

def checkId(id):
    return len(id)==8 or len(id)==9

def findAllUrl(eachurl, allId):
    html = urllib.request.urlopen('https://blog.csdn.net/nameofcsdn/article/details/'+eachurl).read().decode('UTF-8')
    url = re.findall('http[s]*://blog.csdn.net/nameofcsdn/article/details/[0-9]+', str(html))
    url = set(url)
    ans = ''
    for aurl in url:
        id = getIdFromUrl(aurl)
        if id not in allId and checkId(id) is True:
            ans = ans+id+'  '
    if ans != '':
        print(eachurl, end=': ')
        print(ans)


path = 'D:\\csdn.txt'
fp = open(path, 'r', encoding='utf-8')
allId = []
for each in fp:
    each = each.replace('\n', '')
    allId.append(each)
allId.append('120231554') # 左侧导航栏里面包含的链接,也就是所有博客都会包含的链接

#simi记录私密博客列表,私密博客无法直接在线访问
simi = ['118885560','118854316','118523120','118462392','118442806','118400482','118381528','118281568','118210658']
fp = open(path, 'r', encoding='utf-8')
for each in fp:
    each = each.replace('\n', '')
    if each not in simi:
        findAllUrl(each, allId)

输出:
106800163: 107673040  
......

52551319  52105337  51975611  52079084  52613031  52203049  52344833  52104906  

然后再一个个看,需要修改博客的就修改,其他情况具体分析。

六,优化——过滤head(V3)

如果一个失效链接出现在文章开头一段,它就会自动出现在文章摘要里面(在html的head里面),那么,即使我改了正文,重新用程序分析的话还是会把它识别出来,所以需要添加白名单。

然而我又一想,与其不断的补充白名单,不如直接把每篇博客的head过滤掉不就行了。

同样的,每篇博客下面都会出现20篇推荐博客:

这里面也会出现失效链接,即使我对应博客修改了这里也可能没更新,所以一并去掉。

#coding=utf-8
import re
import urllib.request

def getIdFromUrl(url):
    d = url.rfind('/')
    return url[d+1:]

def checkId(id):
    if len(id)==8:
        return id[0]=='5' or id[0]=='6' or id[0]=='7' or id[0]=='8' or id[0]=='9'
    if len(id)==9:
        return id[0]=='1'
    return False

def findAllUrl(eachurl, allId):
    try:
        html = urllib.request.urlopen('https://blog.csdn.net/nameofcsdn/article/details/'+eachurl).read().decode('UTF-8')
    except:
        print('error: '+eachurl)
    head = html.find('</head>')
    recommend = html.find('recommend-item-box')
    html = html[head:recommend]
    url = re.findall('http[s]*://blog.csdn.net/nameofcsdn/article/details/[0-9]+', str(html))
    url = set(url)
    ans = ''
    for aurl in url:
        id = getIdFromUrl(aurl)
        if id not in allId and checkId(id) is True:
            ans = ans+id+'  '
    if ans != '':
        print(eachurl, end=': ')
        print(ans)


fp = open('D:\\csdn.txt', 'r', encoding='utf-8')
allId = []
for each in fp:
    each = each.replace('\n', '')
    allId.append(each)
allId.append('120231554') # 左侧导航栏里面包含的链接,也就是所有博客都会包含的链接

#simi记录私密博客列表,私密博客无法直接在线访问
simi = ['118885560','118854316','118523120','118462392','118442806','118400482','118381528','118281568','118210658']
fp = open('D:\\csdn.txt', 'r', encoding='utf-8')
for each in fp:
    each = each.replace('\n', '')
    if each not in simi:
        findAllUrl(each, allId)

输出:

78445602: 78446030  78445846  
53086311: 72594349  
53112273: 52524806  
52917539: 52888395  
52940513: 52865178  
52966422: 72785355  
53034886: 72621828  
53038159: 52865178  52893978  
109147261: 81609676  81590334  81605159  81571274  

2022年2月3日,更新了代码,更新了A名单和B名单,改了变量名:

#coding=utf-8
import re
import urllib.request

def getIdFromUrl(url):
    d = url.rfind('/')
    return url[d+1:]

def checkId(id):
    if len(id)==8:
        return id[0]=='5' or id[0]=='6' or id[0]=='7' or id[0]=='8' or id[0]=='9'
    if len(id)==9:
        return id[0]=='1'
    return False

def findAllUrl(eachurl, allId):
    try:
        html = urllib.request.urlopen('https://blog.csdn.net/nameofcsdn/article/details/'+eachurl).read().decode('UTF-8')
    except:
        print('error: '+eachurl)
    head = html.find('</head>')
    recommend = html.find('recommend-item-box')
    html = html[head:recommend]
    url = re.findall('http[s]*://blog.csdn.net/nameofcsdn/article/details/[0-9]+', str(html))
    url = set(url)
    ans = ''
    for aurl in url:
        id = getIdFromUrl(aurl)
        if id not in allId and checkId(id) is True:
            ans = ans+id+'  '
    if ans != '':
        print(eachurl, end=': ')
        print(ans)


fp = open('D:\\csdn.txt', 'r', encoding='utf-8')
B_list = []
for each in fp:
    each = each.replace('\n', '')
    B_list.append(each)
B_list.append('120231554') # 左侧导航栏里面包含的链接,也就是所有博客都会包含的链接

#A_list记录白名单A名单
A_list = ['118885560','118854316','118523120','118462392','118442806','118400482','118381528','118281568','118210658','120364334','113000851']
fp = open('D:\\csdn.txt', 'r', encoding='utf-8')
for each in fp:
    each = each.replace('\n', '')
    if each not in A_list:
        findAllUrl(each, B_list)

七,优化——显示实时进度(V4)

把所有的博客都输出结果,便于查看进度。

为了方便,把正常的博客打印到文件,有链接问题的博客打印到控制台。

# coding=utf-8
import re
import urllib.request


def getIdFromUrl(url):
    d = url.rfind('/')
    return url[d + 1:]


def checkId(id):
    if len(id) == 8:
        return id[0] == '5' or id[0] == '6' or id[0] == '7' or id[0] == '8' or id[0] == '9'
    if len(id) == 9:
        return id[0] == '1'
    return False

def findAllUrl(eachurl, allId):
    try:
        html = urllib.request.urlopen('https://blog.csdn.net/nameofcsdn/article/details/'+eachurl).read().decode(
            'UTF-8')
    except:
        print('error: ' + eachurl)
        return
    head = html.find('</head>')
    recommend = html.find('recommend-item-box')
    html = html[head:recommend]
    url = re.findall('http[s]*://blog.csdn.net/nameofcsdn/article/details/[0-9]+', str(html))
    url = set(url)
    ans = ''
    for aurl in url:
        id = getIdFromUrl(aurl)
        if id not in allId and checkId(id):
            ans = ans + id + '  '
    if ans != '':
        print(eachurl, end=': ')
        print(ans)
    else:
        file = open('D:\\out.txt', 'a')
        file.write(eachurl + ' ok.\n')
        file.close()


fp = open('D:\\csdn.txt', 'r', encoding='utf-8')
B_list = []
for each in fp:
    each = each.replace('\n', '')
    B_list.append(each) #正常链接不打印
#B_list.append('120231554')  # 左侧导航栏里面包含的链接,也就是所有博客都会包含的链接

# A_list记录白名单A名单
A_list = ['131162050', '130332606','129733349','128773808','128279672','123062789','126922662','125382303','120364334',
          '118210658','105898489','76010849']
fp = open('D:\\csdn.txt', 'r', encoding='utf-8')
for each in fp:
    each = each.replace('\n', '')
    if each not in A_list:
        findAllUrl(each, B_list)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值