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 相关文章推荐
在主机商的共享服务器上部署Django站点的方法
Jul 22 Python
python urllib爬取百度云连接的实例代码
Jun 19 Python
python在非root权限下的安装方法
Jan 23 Python
python pycurl验证basic和digest认证的方法
May 02 Python
Python求一批字符串的最长公共前缀算法示例
Mar 02 Python
使用python实现滑动验证码功能
Aug 05 Python
Python Tkinter模块 GUI 可视化实例
Nov 20 Python
Python 音频生成器的实现示例
Dec 24 Python
python numpy数组中的复制知识解析
Feb 03 Python
Python requests设置代理的方法步骤
Feb 23 Python
Python爬虫爬取电影票房数据及图表展示操作示例
Mar 27 Python
matplotlib bar()实现百分比堆积柱状图
Feb 24 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
php读取30天之内的根据算法排序的代码
2008/04/06 PHP
PHP图片处理之图片背景、画布操作
2014/11/19 PHP
PHP 输出缓冲控制(Output Control)详解
2016/08/25 PHP
php实现解析xml并生成sql语句的方法
2018/02/03 PHP
PDO::rollBack讲解
2019/01/29 PHP
php加速缓存器opcache,apc,xcache,eAccelerator原理与配置方法实例分析
2020/03/02 PHP
用js实现的仿sohu博客更换页面风格(简单版)
2007/03/22 Javascript
JavaScript CSS修改学习第三章 修改样式表
2010/02/19 Javascript
javascript JSON操作入门实例
2010/04/16 Javascript
对Jquery中的ajax再封装,简化操作示例
2014/02/12 Javascript
jquery实现页面百叶窗走马灯式翻滚显示效果的方法
2015/03/12 Javascript
jQuery实现类似标签风格的导航菜单效果代码
2015/08/25 Javascript
3种js实现string的substring方法
2015/11/09 Javascript
javascript html5实现表单验证
2016/03/01 Javascript
利用Query+bootstrap和js两种方式实现日期选择器
2017/01/10 Javascript
ElementUI Tree 树形控件的使用并给节点添加图标
2020/02/27 Javascript
[04:22]DSPL第二期精彩集锦:残血反杀!
2014/12/10 DOTA
python实现求最长回文子串长度
2018/01/22 Python
Win10下python 2.7.13 安装配置方法图文教程
2018/09/18 Python
Python函数中参数是传递值还是引用详解
2019/07/02 Python
Python3安装pip工具的详细步骤
2019/10/14 Python
pytorch 批次遍历数据集打印数据的例子
2019/12/30 Python
tf.concat中axis的含义与使用详解
2020/02/07 Python
Python更换pip源方法过程解析
2020/05/19 Python
matplotlib.pyplot.matshow 矩阵可视化实例
2020/06/16 Python
Pycharm github配置实现过程图解
2020/10/13 Python
一些常用的HTML5模式(pattern) 总结
2015/07/14 HTML / CSS
美国大尺码女装零售商:TORRID
2016/10/01 全球购物
在DELPHI中调用存储过程和使用内嵌SQL哪种方式更好
2016/11/22 面试题
保安员岗位职责
2013/11/17 职场文书
后勤岗位职责
2013/11/26 职场文书
周年庆促销方案
2014/03/15 职场文书
计算机网络专业自荐书
2014/06/09 职场文书
结婚主持人致辞
2015/07/28 职场文书
详解nodejs内置模块
2021/05/06 NodeJs
详解 TypeScript 枚举类型
2021/11/02 Javascript