今天晚上闲来无事,想找部动漫看看,上次下载的《魔法禁书目录2》的720P版本已经看完了,手头上暂时没什么想看的存货,以前遗留下来的到是有一些,但是放太久了,现在没什么心情看。断的时间长了,就没当初那么好的兴致了。

我看动漫作品喜欢看完结的,没完结的要等死。前段时间收藏的一个叫红旅动漫 http://www.hltm.cc 的网站蛮不错的。里面经常可以下载到720P的片子。当然下载源还是要借助于像115之类的网盘。但是网站里面的完结动漫是没有按下载量排序的,这样就不容易找热门的下载。于是就萌生了采集网站信息自己排序的想法。以前下漫画的时候也没少干这事。

简易的代码如下:

GetList.py : 采集网站信息通过cPickle存入文件

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
#coding:utf-8
import urllib2,cPickle,re
pages=[]#存放下载的页面地址
for i in range(132):
if i==0:
pages.append('http://www.hltm.cc/list/18.html')
else:
pages.append('http://www.hltm.cc/list/18_%s.html'%(i+1))
def GetInfo(content):
'''
根据信息片段提取想要关片名和下载量信息
'''
rs=[]
rs.append(re.findall('title\=\"(.*?)\"',content)[0])
rs.append(re.findall('\xcf\xc2\xd4\xd8\xb4\xce\xca\xfd\xa3\xba(\d*)\<\/p\>',content)[0])
return rs
def GetWorks(content):
'''
取得当前面的信息列表
'''
tmp=content
rs = []
#通过循环把网页源代码进行分割
while tmp.find('<div class="listInfo">')!=-1:
start=tmp.find('<div class="listInfo">')
tmp=tmp[start:]#截取后半段
stop=tmp.find('</div>')
rs.append(tmp[:stop])
tmp = tmp[stop:]
rs1=[]
#生成关键信息列表
for i in rs:
rs1.append(GetInfo(i))
return rs1
works = []#作品列表
error = []#错误页面列表
for i in pages:
try:
print u'正在获取%s'%(i)
tmp = GetWorks(urllib2.urlopen(i).read())
for j in tmp:
works.append([j[0],int(j[1])])
print len(works)
except :
error.append(i)
f=open('works','w+')
cPickle.dump(works,f)
f.close()
f=open('error','w+')
cPickle.dump(error,f)
f.close()

sort.py : 排序并输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#coding:utf-8
import cPickle,sys
works = cPickle.load(open('works','rb'))
def mcmp(x,y):
if x[1]>y[1]:
return 1
elif x[1]==y[1]:
return 0
else:
return -1
works.sort(mcmp,reverse=True)
for i in range(len(works)):
sys.stdout.write((u'作品名:%s 下载次数:%s\r\n'%(works[i][0].decode('gbk'),works[i][1])).encode('gbk'))

本来想把error的处理给写了,后来发现网络比较给力没有出错直接采集完了,所以就没写这东西。

tip

输出结果到文本:

python sort.py>list.txt

python写这种东西确实很方便,等有空了把以往写过的代码都整理一下,以后写个比较通用的采集模块。

因为使用SyntaxHighlighter的时候会使用到多种语言,一次必载入全部的语言配置文件下载的东西会比较多,所以SyntaxHighlighter提供了一个shAutoloader.js脚本。

官方给出的例子如下:

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
function path()
{
var args = arguments,
result = []
;
for(var i = 0; i < args.length; i++)
result.push(args[i].replace('@', '/pub/sh/current/scripts/'));
return result
};
SyntaxHighlighter.autoloader.apply(null, path(
'applescript @shBrushAppleScript.js',
'actionscript3 as3 @shBrushAS3.js',
'bash shell @shBrushBash.js',
'coldfusion cf @shBrushColdFusion.js',
'cpp c @shBrushCpp.js',
'c# c-sharp csharp @shBrushCSharp.js',
'css @shBrushCss.js',
'delphi pascal @shBrushDelphi.js',
'diff patch pas @shBrushDiff.js',
'erl erlang @shBrushErlang.js',
'groovy @shBrushGroovy.js',
'java @shBrushJava.js',
'jfx javafx @shBrushJavaFX.js',
'js jscript javascript @shBrushJScript.js',
'perl pl @shBrushPerl.js',
'php @shBrushPhp.js',
'text plain @shBrushPlain.js',
'py python @shBrushPython.js',
'ruby rails ror rb @shBrushRuby.js',
'sass scss @shBrushSass.js',
'scala @shBrushScala.js',
'sql @shBrushSql.js',
'vb vbnet @shBrushVb.js',
'xml xhtml xslt html @shBrushXml.js'
));
SyntaxHighlighter.all();

但按上面的配置死活不成功,通过chrome的审查元素里面也没看到变化,服务端里更没有读取相应语言的js包的访问信息。

后来在 http://www.leadnt.com/Javascript/510.html 这篇文章里查到,原来这个脚本应该在页面读取完成后再运行。

知道这个就好办了,可以把这段脚本放到页尾使用。如果有jquery就放到$(document).ready()里面。

配合jquery,修改后的脚本如下:

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
function path()
{
var args = arguments,
result = []
;
for(var i = 0; i < args.length; i++)
result.push(args[i].replace('@', '/static/js/SyntaxHighlighter/'));
return result
};
$(document).ready(function(){
SyntaxHighlighter.autoloader.apply(null, path(
'applescript @shBrushAppleScript.js',
'actionscript3 as3 @shBrushAS3.js',
'bash shell @shBrushBash.js',
'coldfusion cf @shBrushColdFusion.js',
'cpp c @shBrushCpp.js',
'c# c-sharp csharp @shBrushCSharp.js',
'css @shBrushCss.js',
'delphi pascal @shBrushDelphi.js',
'diff patch pas @shBrushDiff.js',
'erl erlang @shBrushErlang.js',
'groovy @shBrushGroovy.js',
'java @shBrushJava.js',
'jfx javafx @shBrushJavaFX.js',
'js jscript javascript @shBrushJScript.js',
'perl pl @shBrushPerl.js',
'php @shBrushPhp.js',
'text plain @shBrushPlain.js',
'py python @shBrushPython.js',
'ruby rails ror rb @shBrushRuby.js',
'sass scss @shBrushSass.js',
'scala @shBrushScala.js',
'sql @shBrushSql.js',
'vb vbnet @shBrushVb.js',
'xml xhtml xslt html @shBrushXml.js'
));
SyntaxHighlighter.all();
});

今天在编写博客程序的时候遇到模板里面自带的filter不够用的情况,遂想起自定义一个。参考了jinja2的文档,再经过百度大神的帮助。最终发现,其实给flask的jinja2模板加filter很简单。

代码如下:

1
2
3
4
5
6
def my_join(value,d='',what=''):
'''用于生成分隔字符串'''
return d.join([i[what] for i in value])
#注册filters
app.jinja_env.filters['my_join']=my_join

然后在模板里面就可以使用这个filter了,使用方法如下:

1
{{i.categories|my_join(d=', ',what='title')}}