2008年08月18日

百度搜藏有不少问题,其中一个就是不能导出。

因为电脑丢了以前浏览器里的书签都没了,不过在百度测试搜藏的时候我用自己浏览器里的书签试过,刚好里面还有旧一点的书签,今天突然想起这事打算把把书签导出来,没想到竟然没有这个功能,今天没什么事就自己写了个工具,可以导出百度的搜藏,只需要手动确定用户名,程序里可以指定导出时使用的标签,因为没有登录,所以需要先把你所有的书签设置为公开:

:
  1. [cocobear@cocobear cang]$ cat cang.py
  2. [cocobear@cocobear cang]$ cat cang.py
  3. #!/usr/bin/env
  4. #encoding=utf-8
  5. #Using GPL v2
  6. #Author: cocobear.cn@gmail.com
  7.  
  8. import urllib2,urllib,cookielib,httplib
  9. import sys,re
  10. import gzip,StringIO
  11.  
  12. user    = "cocobear_cn"         #user whose bookmarks you want get
  13. tag     = "from cang2html"      #tag that you want to mark
  14. id      = 0
  15. def cang2html(name,url,description):
  16.     global user
  17.     file_name = user+".html"
  18.     f = open(file_name,"a")
  19.     f.write("\t<dt><a HREF=\""+url+"\">"+name+"</a>\n")
  20.     if description:
  21.         f.write("\t<dd>"+description+"</dd>\n")
  22.     f.close()
  23.  
  24. def cang2adr(name,url,description):
  25.     global user,id
  26.     file_name = user+".adr"
  27.     f = open(file_name,"a")
  28.     f.write("#URL\n")
  29.     f.write("\tID="+str(id)+"\n")
  30.     f.write("NAME="+name+"\n\t"+"URL="+url+"\n")
  31.     if description:
  32.         f.write("\tDESCRIPTION="+description+"\n")
  33.     f.close()
  34.     id+=1
  35.  
  36. def process_data(data):
  37.  
  38.     result = re.findall("((?:http|ftp|https|file)://.*)\" target.*lnk\d+\">(.+?).*dc\d+\">(.*?)",data)
  39.     #print len(result)
  40.     for url,name,description in result:
  41.         #print name,url,description
  42.         cang2html(name,url,description)
  43.         cang2adr(name,url,description)
  44.  
  45. def get_data(user,opener,page):
  46.     url = "http://cang.baidu.com/"+user+"/page/"+str(page)
  47.     gziped_data = opener.open(url).read()
  48.     gziped_stream = StringIO.StringIO(gziped_data)
  49.     data = gzip.GzipFile(fileobj=gziped_stream).read()
  50.     return data.decode('gbk').encode('utf-8')
  51.  
  52.  
  53. def init():
  54.     httplib.HTTPConnection.debuglevel  =  1
  55.     cookie = cookielib.CookieJar()
  56.     opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
  57.  
  58.     exheaders = [("User-Agent","Opera/9.27 (X11; Linux x86_64; U; en)"),("Connection","Keep-Alive"),("Referer","http://cang.baidu.com"),("Accept","text/html, application/xml;q=0.9, application/xhtml+xml, */*;q=0.1"),("Accept-Charset","iso-8859-1, utf-8, utf-16, *;q=0.1"),("Cookie2","$Version=1"),("Accept-Encoding","deflate, gzip, x-gzip, identity, *;q=0"),]
  59.  
  60.     opener.addheaders = exheaders
  61.     urllib2.install_opener(opener)
  62.     return opener
  63.  
  64.    
  65. def create_adr_file(name):
  66.     global tag,id
  67.  
  68.     f = open(name,"w")
  69.     f.write("""Opera Hotlist version 2.0
  70. Options: encoding = utf8, version=3
  71. """)
  72.     f.write("#FOLDER\n")
  73.     f.write("\tID="+str(id)+"\n")
  74.     id+=1
  75.     f.write("\tNAME="+tag+"\n")
  76.     f.close()
  77.  
  78. def create_html_file(name):
  79.     global tag
  80.  
  81.     f = open(name,"w")
  82.     f.write("""<!DOCTYPE NETSCAPE--file-1>
  83. <meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
  84. <!--This is an automatically generated file.
  85. It will be read and overwritten.
  86. Code write by cocobear with
  87. Edit the file carefully!-->
  88. <title>Generated by cang2html</title>
  89. """)
  90.     f.write("<h1>"+tag+"</h1>\n")
  91.     f.write("<dl><p>\n")
  92.     f.close()
  93.  
  94. def end_html_file(name):
  95.    
  96.     f = open(name,"a")
  97.     f.write("</p></dl><p>\n")
  98.     f.close()
  99.  
  100. def main(argv=None):
  101.     global user,tag
  102.    
  103.     opener=init()
  104.     data = get_data(user,opener,1)
  105.     match = re.search("(共(\d+)条)",data)
  106.     if match:
  107.         total = int(match.group(1))
  108.     else:
  109.         print "User has no bookmars!"
  110.         return 1
  111.     print "Total %d bookmarks" % total
  112.     print "Start getting ......"
  113.  
  114.     create_html_file(user+".html")
  115.     create_adr_file(user+".adr")
  116.  
  117.     process_data(data)
  118.     if total % 10 != 0:
  119.         for i in range(1,10):
  120.             if (total+i) % 10 == 0:
  121.                 total+=i
  122.     total/=10
  123.  
  124.     for i in range(2,total+1):
  125.         data = get_data(user,opener,i)
  126.         #print "process %d" % i
  127.         process_data(data)
  128.  
  129.     end_html_file(user+".html")
  130.     #end_adr_file(user+".adr")
  131.  
  132.     print "Success!\nLook %s.html for your bookmarks" % user
  133.     print "Success!\nLook %s.adr for your bookmarks" % user
  134.  
  135.  
  136. if __name__ == "__main__":
  137.     sys.exit(main())

该程序可以把百度搜藏导出为Opera使用的adr格式书签,以及html格式的书签,可以方便导入Opera浏览器,以及delicious(de.licio.us)等网上书签。

代码下载
?: 运算符表示“查找子模式的匹配字符串,但不包括反向引用中的匹配结果”
.*是贪婪匹配
.*?非贪婪匹配

标签 :

9 楼了已经

  • 草儿写于08年08月18日

    好长。不过我收藏夹都是存在MP3随身携带的。

  • luguo写于08年08月18日

    恩,俺不用百度,因为这里没人知道百度这个东西。。。

  • Amankwah写于08年08月18日

    ............
    我只依赖我的电脑~

  • 234写于08年09月18日

    大人……我很想导出我的搜藏,但是由于电脑小白,于是即使看到你的文章也不知道这个工具应该怎么使用Orz 还请大人闲暇之余具体相授啊!

  • 可可熊写于08年09月18日

    楼上的朋友可以留个联系方式,我可以帮你编译个Windows下的。

  • 我qq495979774写于08年10月04日

    想请教一下你写的代码如何导出百度搜藏呀

  • 可可熊写于08年10月10日

    回楼上的QQ俺不用,gtalk就是我的邮箱地址。

  • frankl写于08年11月17日

    兄弟能不能写个PHP的,Python不知道怎么用.

  • cocobear写于08年11月18日

    回楼上的,Python的很简单的,装个Python的解释器,然后在命令行下:
    python cang.py

    就可以了,php好久没写了,

发表评论

在下面加入你的评论,或者 trackback 从你的博客站点。 订阅本文的评论。

:

:

:

« 处理了下网站
» shell脚本解题6