Python实现的飞速中文网小说下载脚本
1.JavaScript加密什么的最讨厌了:-(
1).eval一个不依赖外部变量的函数立即调用很天真,看我nodejs来干掉你!
2).HTTP请求的验证首先尝试Referer,「小甜饼」没有想像中的那么重要。
3).curl和各命令行工具处理起文本很顺手呢
4).但是Python也没多几行呢
2.Requests效率比lxml自己那个好太多
3.progressbar太先进了,我还是自个儿写吧……
4.argparse写Python命令行程序必备啊~
5.string.Template也很好用哦
6.以下是主代码啦,除了标准库以及lxml和requests,没有的模块都在无所不能的winterpy仓库里。其实主代码也在的。
#!/usr/bin/envpython3
#vim:fileencoding=utf-8
importsys
fromfunctoolsimportpartial
fromstringimportTemplate
importargparse
importbase64
fromurllib.parseimportunquote
fromlxml.htmlimportfromstring
importrequests
fromhtmlutilsimportextractText
fromtermutilsimportforeach
session=requests.Session()
defmain(index,filename='$name-$author.txt',start=0):
r=session.get(index)
r.encoding='gb18030'
doc=fromstring(r.text,base_url=index)
doc.make_links_absolute()
name=doc.xpath('//div[@class="info"]/p[1]/a/text()')[0]
author=doc.xpath('//div[@class="info"]/p[1]/span/text()')[0].split()[-1]
nametmpl=Template(filename)
fname=nametmpl.substitute(name=name,author=author)
withopen(fname,'w')asf:
sys.stderr.write('下载到文件%s。\n'%fname)
links=doc.xpath('//div[@class="chapterlist"]/ul/li/a')
try:
foreach(links,partial(gather_content,f.write),start=start)
exceptKeyboardInterrupt:
sys.stderr.write('\n')
sys.exit(130)
sys.stderr.write('\n')
returnTrue
defgather_content(write,i,l):
#curl-XPOST-Fbookid=2747-Fchapterid=2098547'http://www.feisuzw.com/skin/hongxiu/include/fe1sushow.php'
#--refererhttp://www.feisuzw.com/Html/2747/2098547.html
#tail+4
#base64-d
#sed's/&#&/u/g'
#ascii2uni-qaF
#ascii2uni-qaJ
#<p>paragraphs
url=l.get('href')
_,_,_,_,bookid,chapterid=url.split('/')
chapterid=chapterid.split('.',1)[0]
r=session.post('http://www.feisuzw.com/skin/hongxiu/include/fe1sushow.php',data={
'bookid':bookid,'chapterid':chapterid,
},headers={'Referer':url})
text=r.content[3:]#stripBOM
text=base64.decodebytes(text).replace(b'&#&',br'\u')
text=text.decode('unicode_escape')
text=unquote(text)
text=text.replace('<p>','').replace('</p>','\n\n')
title=l.text
write(title)
write('\n\n')
write(text)
write('\n')
returntitle
if__name__=='__main__':
parser=argparse.ArgumentParser(description='下载飞速中文网小说')
parser.add_argument('url',
help='小说首页链接')
parser.add_argument('name',default='$name-$author.txt',nargs='?',
help='保存文件名模板(支持$name和$author')
parser.add_argument('-s','--start',default=1,type=int,metavar='N',
help='下载起始页位置(以1开始)')
args=parser.parse_args()
main(args.url,args.name,args.start-1)