Python实现的飞速中文网小说下载脚本


Posted in Python onApril 23, 2015

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/env python3
# vim:fileencoding=utf-8

import sys
from functools import partial
from string import Template
import argparse
import base64
from urllib.parse import unquote

from lxml.html import fromstring
import requests

from htmlutils import extractText
from termutils import foreach

session = requests.Session()

def main(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)
 with open(fname, 'w') as f:
  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)
  except KeyboardInterrupt:
   sys.stderr.write('\n')
   sys.exit(130)

 sys.stderr.write('\n')
 return True

def gather_content(write, i, l):
 # curl -XPOST -F bookid=2747 -F chapterid=2098547 'http://www.feisuzw.com/skin/hongxiu/include/fe1sushow.php'
 #   --referer http://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:] # strip BOM
 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')
 return title

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)
Python 相关文章推荐
python在linux中输出带颜色的文字的方法
Jun 19 Python
python单例模式实例分析
Apr 08 Python
Python设计模式之中介模式简单示例
Jan 09 Python
TensorFlow 合并/连接数组的方法
Jul 27 Python
python数据结构之线性表的顺序存储结构
Sep 28 Python
Python GUI编程完整示例
Apr 04 Python
Python实现数据结构线性链表(单链表)算法示例
May 04 Python
基于sklearn实现Bagging算法(python)
Jul 11 Python
python获取Linux发行版名称
Aug 30 Python
使用python matplotlib 画图导入到word中如何保证分辨率
Apr 16 Python
python如何对链表操作
Oct 10 Python
opencv用VS2013调试时用Image Watch插件查看图片
Jul 26 Python
Python中使用PyQt把网页转换成PDF操作代码实例
Apr 23 #Python
Python里disconnect UDP套接字的方法
Apr 23 #Python
Python实现的Google IP 可用性检测脚本
Apr 23 #Python
Python3.2中的字符串函数学习总结
Apr 23 #Python
Python与Redis的连接教程
Apr 22 #Python
Python实现的数据结构与算法之快速排序详解
Apr 22 #Python
利用Fn.py库在Python中进行函数式编程
Apr 22 #Python
You might like
解析Ubuntu下crontab命令的用法
2013/06/24 PHP
PHP中fwrite与file_put_contents性能测试代码
2013/08/02 PHP
smarty中js的调用方法示例
2014/10/27 PHP
PHP中使用imagick生成PSD文件缩略图教程
2015/01/26 PHP
php+mysqli使用面向对象方式更新数据库实例
2015/01/29 PHP
php简单统计字符串单词数量的方法
2015/06/19 PHP
PHP与服务器文件系统的简单交互
2016/10/21 PHP
详解PHP函数 strip_tags 处理字符串缺陷bug
2017/06/11 PHP
php使用curl模拟多线程实现批处理功能示例
2019/07/25 PHP
php桥接模式应用案例分析
2019/10/23 PHP
jquery 圆形旋转图片滚动切换效果
2011/01/19 Javascript
有关javascript的性能优化 (repaint和reflow)
2013/04/12 Javascript
基于jQuery实现文本框缩放以及上下移动功能
2014/11/24 Javascript
node.js中的forEach()是同步还是异步呢
2015/01/29 Javascript
手把手教你搭建ES6的开发运行环境
2017/07/11 Javascript
简述jQuery Easyui一些用法
2017/08/01 jQuery
bootstrap Table服务端处理分页(后台是.net)
2017/10/19 Javascript
ActiveX控件的使用-js实现打印超市小票功能代码详解
2017/11/22 Javascript
解决webpack无法通过IP地址访问localhost的问题
2018/02/22 Javascript
webpack external模块的具体使用
2018/03/10 Javascript
基于Vue2x实现响应式自适应轮播组件插件VueSliderShow功能
2018/05/16 Javascript
angularjs实现对表单输入改变的监控(ng-change和watch两种方式)
2018/08/29 Javascript
vant IndexBar实现的城市列表的示例代码
2019/11/20 Javascript
[05:14]辉夜杯主赛事第二日 RECAP精彩回顾
2015/12/27 DOTA
解决python os.mkdir创建目录失败的问题
2018/10/16 Python
python实现录屏功能(亲测好用)
2020/03/02 Python
深入浅析Python 命令行模块 Click
2020/03/11 Python
什么是Python中的匿名函数
2020/06/02 Python
利用简洁的图片预加载组件提升html5移动页面的用户体验
2016/03/11 HTML / CSS
银行求职推荐信范文
2013/11/30 职场文书
元旦联欢会感言
2014/03/04 职场文书
娱乐节目策划方案
2014/06/10 职场文书
大学感恩节活动策划方案
2014/10/11 职场文书
上课说话检讨书500字
2014/11/01 职场文书
英文感谢信范文
2015/01/21 职场文书
天河观后感
2015/06/11 职场文书