前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

作者: 小詹&有乔木

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取

http://note.youdao.com/noteshare?id=3054cce4add8a909e784ad934f956cef

失效的书签们

我们日常浏览网站的时候,时不时会遇到些新奇的东西( 你懂的.jpg ),于是我们就默默的点了个收藏或者加书签。然而当我们面对成百上千的书签和收藏夹的时候,总会头疼不已…… 骚操作!曾经爱过!用 Python 清理收藏夹里已失效的网站 Python 第1张

尤其是昨天还在更新的程序设计博客,今天就挂了永不更新。或者是昨天看的起劲的电影网站,今天直接404。失效页面这么多,每次我打开才知道失效了,并且需要手动删除,这能是一个程序员干的事情吗?

可是无论是Google浏览器还是国内浏览器,最多也就提供一个对于收藏夹的备份服务,那只能Python走起了。

骚操作!曾经爱过!用 Python 清理收藏夹里已失效的网站 Python 第2张

Python支持的收藏夹文件格式

对于收藏夹提供的支持很少,主要还是因为收藏夹藏在浏览器里面,我们只能手动导出htm文件进行管理

骚操作!曾经爱过!用 Python 清理收藏夹里已失效的网站 Python 第3张

骚操作!曾经爱过!用 Python 清理收藏夹里已失效的网站 Python 第4张 骚操作!曾经爱过!用 Python 清理收藏夹里已失效的网站 Python 第5张 骚操作!曾经爱过!用 Python 清理收藏夹里已失效的网站 Python 第6张

内容比较简单,对前端没什么了解的我,也可以很明显看出其中的树形结构和内在逻辑。 固定格式 网址 固定格式 页面名 固定格式

很简单的想到了正则匹配,其中有两个子串。提取出来再挨个访问,看看哪个失效了,就删除,就能获得清理后的收藏夹了。

读取收藏夹文件

 1 path = "C:\\Users\\XU\\Desktop"
 2  3 fname = "bookmarks.html"
 4  5 os.chdir(path)
 6  7 bookmarks_f = open(fname, "r+" ,encoding='UTF-8')
 8  9 booklists = bookmarks_f.readlines()
10 11 bookmarks_f.close()

因为对于前端的不熟悉,这个导出的收藏夹可以抽象的分

  • 结构代码

  • 保存网页书签的关键代码

其中结构代码我们不能动,要原封不动的保留,而保存网页书签的关键代码,我们要提取内容并且进行判断保留和删除。

所以这里采用readlines函数,每行读取,单独判断。

正则匹配

1 pattern = r'HREF="(.*?)" .*?>(.*?)</A>'
2 while len(booklists)>0:
3     bookmark = booklists.pop(0)
4     detail = re.search(pattern, bookmark)

如果是关键代码:提取出的子串在 detail.group(1) 和 detail.group(2) 里面

而如果是结构代码:detail == None

访问页面

1 import requests
2 r = requests.get(detail.group(1),timeout=500)

编代码尝试之后发现会有这四种情况

  • r.status_code == requests.codes.ok

  • r.status_code==404

  • r.status_code!=404 && 无法访问 (可能是屏蔽爬虫,建议保留)

  • requests.exceptions.ConnectionError

类似知乎、简书基本都反爬了,所以简单的get还不能有效访问,细节不值得大费周章,直接保留就好。而error,直接用try抛出异常就好,不然程序会停止运行。

添加逻辑后:(代码可左右拖动)

 1 while len(booklists)>0:
 2     bookmark = booklists.pop(0)
 3     detail = re.search(pattern, bookmark)
 4     if detail:
 5         #print(detail.group(1) +"----"+ detail.group(2))
 6         try:
 7         #访问
 8             r = requests.get(detail.group(1),timeout=500)
 9         #如果可则添加
10             if  r.status_code == requests.codes.ok:
11                 new_lists.append(bookmark)
12                 print( "ok------ 保留:"+ detail.group(1)+"   "+ detail.group(2))
13             else:
14                 if(r.status_code==404):
15                     print("不可访问 删除:"+ detail.group(1)+"   "+ detail.group(2) +'错误码 '+str(r.status_code))
16                 else:
17                     print("其他原因 保留:"+ detail.group(1)+"   "+ detail.group(2) +'错误码 '+str(r.status_code))
18                     new_lists.append(bookmark)
19         except:
20             print( "不可访问 删除:"+ detail.group(1)+"   "+ detail.group(2))
21             #new_lists.append(bookmark)
22     else:#没匹配到是结构语句
23         new_lists.append(bookmark)

 

程序执行情况

骚操作!曾经爱过!用 Python 清理收藏夹里已失效的网站 Python 第7张

导出htm

1 bookmarks_f = open('new_'+fname, "w+" ,encoding='UTF-8')
2 bookmarks_f.writelines(new_lists)
3 bookmarks_f.close()

导入浏览器

骚操作!曾经爱过!用 Python 清理收藏夹里已失效的网站 Python 第8张

实际应用于我的浏览器

骚操作!曾经爱过!用 Python 清理收藏夹里已失效的网站 Python 第9张

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄