forked from bfishadow/SBB
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathSBB.py
131 lines (98 loc) · 5.29 KB
/
SBB.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
__version__ = '0.02'
__author__ = 'Julien G. (@bfishadow)'
'''
This script will download all artcles from a specific Sina Blog.
Based on these HTML files, you might generate an ebook by importing into Calibre.
Or simply save them anywhere as archives.
'''
import sys, urllib.request
from time import strftime
def getBetween(str, str1, str2):
strOutput = str[str.find(str1)+len(str1):str.find(str2)]
return strOutput
strUsage = "Usage: SBB.py <Sina blog URL> [asc]\n\nExample:\nSBB.py http://blog.sina.com.cn/gongmin desc\nSBB.py http://blog.sina.com.cn/u/1239657051\n"
#Step 0: get target blog homepage URL
try :
strUserInput =sys.argv[1]
except :
print (strUsage)
sys.exit(0)
try :
strUserOrder = sys.argv[2]
except :
strUserOrder = ""
#The URL *must* start with http://blog.sina.com.cn/, otherwise the universe will be destroied XD
if strUserInput.find("http://blog.sina.com.cn/") == -1 or len(strUserInput) <= 24 :
print(strUsage)
print(strUserInput)
sys.exit(0)
#Get UID for the blog, UID is critical.
objResponse = urllib.request.urlopen(strUserInput)
strResponse = objResponse.read().decode('utf-8')
objResponse.close()
strUID = getBetween(getBetween(strResponse, "format=html5;", "format=wml;"), "/blog/u/", '">')
print('用户ID '+strUID)
if len(strUID) > 10 :
print(strUsage)
sys.exit(0)
#Here's the UID. Most of the UID is a string of ten digits.
strTargetUID = strUID
#Step 1: get list for first page and article count
strTargetBlogListURL = "http://blog.sina.com.cn/s/articlelist_" + strTargetUID + "_0_1.html"
objResponse = urllib.request.urlopen(strTargetBlogListURL)
strResponse = objResponse.read().decode('utf-8')
objResponse.close()
strBlogPostList = getBetween(getBetween(strResponse,"$blogArticleSortArticleids","$blogArticleCategoryids"), " : [", "],")
strBlogPostID = strBlogPostList
strBlogPageCount = getBetween(getBetween(strResponse, "全部博文", "<!--第一列end-->"),"<em>(", ")</em>")
intBlogPostCount = int(strBlogPageCount) #article count
intPageCount = int(intBlogPostCount/50)+1 #page count, default page size is 50
strBlogName = getBetween(getBetween(strResponse, "<title>", "</title>"), "博文_", "_新浪博客")
#Step 2: get list for the rest of pages
for intCurrentPage in range(intPageCount - 1) :
strTargetBlogListURL = "http://blog.sina.com.cn/s/articlelist_" + strTargetUID + "_0_" + str(intCurrentPage + 2) + ".html"
objResponse = urllib.request.urlopen(strTargetBlogListURL)
strResponse = objResponse.read().decode('utf-8')
strBlogPostList = getBetween(getBetween(strResponse,"$blogArticleSortArticleids","$blogArticleCategoryids"), " : [", "],")
strBlogPostID = strBlogPostID + "," + strBlogPostList
objResponse.close()
strBlogPostID = strBlogPostID.replace('"','')
#strBlogPostID <- this string has all article IDs for current blog
#Step 3: get all articles one by one
arrBlogPost = strBlogPostID.split(',')
if strUserOrder != "desc" :
arrBlogPost.reverse()
intCounter = 0
strHTML4Index = ""
for strCurrentBlogPostID in arrBlogPost :
intCounter = intCounter + 1
strTargetBlogPostURL = "http://blog.sina.com.cn/s/blog_" + strCurrentBlogPostID + ".html"
objResponse = urllib.request.urlopen(strTargetBlogPostURL)
strPageCode = objResponse.read().decode('utf-8')
objResponse.close()
#Parse blog title
strBlogPostTitle = getBetween(strPageCode, "<title>", "</title>")
strBlogPostTitle = strBlogPostTitle.replace("_新浪博客", "")
strBlogPostTitle = strBlogPostTitle.replace("_" + strBlogName, "")
#Parse blog post
strBlogPostBody = getBetween(strPageCode, "<!-- 正文开始 -->", "<!-- 正文结束 -->")
strBlogPostBody = strBlogPostBody.replace("http://simg.sinajs.cn/blog7style/images/common/sg_trans.gif", "")
strBlogPostBody = strBlogPostBody.replace('src=""', "")
strBlogPostBody = strBlogPostBody.replace("real_src =", "src =")
#Parse blog timestamp
strBlogPostTime = getBetween(strPageCode, '<span class="time SG_txtc">(', ')</span><div class="turnBoxzz">')
#Write into local file
strLocalFilename = "Post_" + str(intCounter) + "_" + strCurrentBlogPostID + ".html"
strHTML4Post = '<html>\n<head>\n<meta charset="utf-8" />\n<title>' + strBlogPostTitle + '</title>\n<link href="http://simg.sinajs.cn/blog7style/css/conf/blog/article.css" type="text/css" rel="stylesheet" />\n</head>\n<body>\n<h2>' + strBlogPostTitle + "</h2>\n<p>By: <em>" + strBlogName + "</em> 原文发布于:<em>" + strBlogPostTime + "</em></p>\n" + strBlogPostBody + '\n<p><a href="index.html">返回目录</a></p>\n</body>\n</html>\n'
objFileArticle = open(strLocalFilename, "wb")
objFileArticle.write(strHTML4Post.encode('utf-8'));
objFileArticle.close
strHTML4Index = strHTML4Index + '<li><a href="' + strLocalFilename + '">' + strBlogPostTitle + '</a></li>\n'
print (intCounter , "/", intBlogPostCount)
strCurrentTimestamp = str(strftime("%Y-%m-%d %H:%M:%S"))
strHTML4Index = '<html>\n<head>\n<meta charset="utf-8" />\n<title>' + strBlogName + "博客文章汇总</title>\n</head>\n<body>\n<h2>新浪博客:" + strBlogName + "</h2>\n<p>共" + str(intBlogPostCount) + "篇文章,最后更新:<em>" + strCurrentTimestamp + "</em></p>\n<ol>\n" + strHTML4Index + "\n</ol>\n</body>\n</html>\n"
objFileIndex = open("index.html", "wb")
objFileIndex.write(strHTML4Index.encode('utf-8'));
objFileIndex.close