使用Python去除Chrome重複、無效的書籤鏈接

長時間使用瀏覽器,沒有了新鮮感,伴隨着不爽與忍耐,儘管通過各種方式反饋給官方,然並卵。當忍耐到了盡頭,就百度“瀏覽器”,然後找下一個評分最高的,又再次開始了不爽與忍耐。

現在的瀏覽器或本身具備、或安裝插件的方式,都提供了比較強大的擴展功能,我最喜歡的變異鼠標手勢與保存密碼。換瀏覽器的時候不僅僅是安裝瀏覽器這麼簡單,還需要轉移書籤,還有安裝符合習慣的插件以及轉移網站密碼。

對於插件和網站密碼,在這裏不做討論,畢竟沒有這麼高的技術能力。在此先來討論一下換瀏覽器之後的書籤

在這裏介紹一下我換了Chrome瀏覽器之後,對書籤做的瘦身操作。

目標

  1. 將書籤裏的鏈接,按照URL進行去重,然後把重複的、目錄較深的書籤路徑加書籤名打印出來
  2. 測試去重後剩下來的鏈接,判斷當初收藏的網站是否還在線。

本機環境

系統: Windows 10
Python版本: Python 3.7
Chrome版本: 72.0.3626.121

步驟

  1. 解析Chrome書籤文件,獲取書籤名、書籤URL以及書籤目錄
  2. 依次檢查書籤名和書籤URL,判斷是否與之前的重複
  3. 若重複,則判斷兩個書籤哪一個目錄層級比較深,若相同,打印第二個
  4. 測試去重後的所有書籤URL,打印失效鏈接

不足之處

  1. Chrome所有書籤保存在一個bookmarks文件中,並且有一定的校驗算法,以我目前的能力,無法直接在bookmarks文件中直接刪除重複的書籤,只能打印出目錄及書籤名,然後在瀏覽器中手動刪除(大寫尷尬)。
  2. 測試URL的有效性時,因爲某種無上偉大的迷之大法,只能校驗牆內的鏈接。可自行“卍解”後測試。

腳本

# -*- coding: utf-8 -*-
import os
import json
import requests


def read_file():
    """讀取書籤文件內容"""
    # 書籤路徑
    google_fav_file_path = 'C:/Users/sheng/AppData/Local/Google/Chrome/User Data/Default/Bookmarks'
    if os.path.exists(google_fav_file_path):
        with open(google_fav_file_path, 'rb') as r:
            goog_fav = r.read().decode('utf-8')
    return goog_fav


def get_bookmark_total(bookstr):
    """將書籤文件轉換成Python字典"""
    if len(book_str):
        book_json = json.loads(book_str)

    # 得到主要內容
    children_bar = book_json['roots']['bookmark_bar']['children']
    return children_bar


def get_detail(children: list, name, index):
    """遞歸解析書籤信息"""
    if len(children) > 0:
        for child in children:
            if 'children' in child and child.get('type') == 'folder':
                # 書籤文件夾,進行遞歸解析
                get_detail(child.get('children'), f'{name} -- {child.get("name")}', index+1)

            if child.get('type') == 'url':
                # 書籤URL,進行去重判斷
                print_complex_url(index, name, child.get('name'), child.get('url'))


total_fav = dict()
def print_complex_url(index, direct, name, url):
    """按照書籤名檢查是否重複"""
    if f'{name}' in total_fav:
        # 重複
        if index >= total_fav.get(f'{name}')[0]:
            print(direct, name)
        else:
            print(total_fav.get(f'{name}')[1], name)
            total_fav[f'{name}'] = [index, direct, name, url]
    else:
        # 不重複
        total_fav[f'{name}'] = [index, direct, name, url]


def is_bookmarks_active():
    """檢查去重後的書籤是否有效"""
    for key in total_fav:
        url = total_fav.get(key)[3]
        is_ok = is_url_ok(url)
        if is_ok in [-1, -2, -3]:
            print(total_fav.get(key)[1], key)


def is_url_ok(url):
    """判斷URL是否有效"""
    try:
        resu = requests.get(url, timeout=5)
        if resu.status_code == 200:
            # 正常
            return 0
        else:
            return -3
    except requests.exceptions.ConnectionError as e:
        return -1
    except Exception as e:
        return -2


if __name__ == '__main__':
    book_str = read_file()
    children_bar = get_bookmark_total(book_str)
    # print(type(children_bar))
    get_detail(children_bar, 'root', 0)
    print('檢查書籤重複完成')
    is_bookmarks_active()


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章