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 相关文章推荐
自动化Nginx服务器的反向代理的配置方法
Jun 28 Python
在Linux系统上部署Apache+Python+Django+MySQL环境
Dec 24 Python
Python 迭代器工具包【推荐】
May 06 Python
Linux中安装Python的交互式解释器IPython的教程
Jun 13 Python
基于python爬虫数据处理(详解)
Jun 10 Python
python导入csv文件出现SyntaxError问题分析
Dec 15 Python
python3中类的继承以及self和super的区别详解
Jun 26 Python
django 框架实现的用户注册、登录、退出功能示例
Nov 28 Python
浅谈cv2.imread()和keras.preprocessing中的image.load_img()区别
Jun 12 Python
Python socket服务常用操作代码实例
Jun 22 Python
PyQt5结合QtDesigner实现文本框读写操作
Jun 11 Python
python index() 与 rindex() 方法的使用示例详解
Dec 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中ob_start函数的使用说明
2013/11/11 PHP
php多进程模拟并发事务产生的问题小结
2018/12/07 PHP
javascript 动态调整图片尺寸实现代码
2009/12/28 Javascript
js中使用DOM复制(克隆)指定节点名数据到新的XML文件中的代码
2011/07/27 Javascript
js的隐含参数(arguments,callee,caller)使用方法
2014/01/28 Javascript
javascript实现回到顶部特效
2015/05/06 Javascript
限制只能输入数字的实现代码
2016/05/16 Javascript
利用jQuery实现CheckBox全选/全不选/反选的简单代码
2016/05/31 Javascript
AngularJS实现单独作用域内的数据操作
2016/09/05 Javascript
jQuery实现底部浮动窗口效果
2016/09/07 Javascript
AngularJS深入探讨scope,继承结构,事件系统和生命周期
2016/11/02 Javascript
浅析JS中的 map, filter, some, every, forEach, for in, for of 用法总结
2017/03/29 Javascript
js绑定事件和解绑事件
2017/04/27 Javascript
浅谈原生JS中的延迟脚本和异步脚本
2017/07/12 Javascript
Vue打包后出现一些map文件的解决方法
2018/02/13 Javascript
解决mui框架中switch开关通过js控制开或者关状态时小圆点不动的问题
2019/09/03 Javascript
javascript 高级语法之继承的基本使用方法示例
2019/11/11 Javascript
nodejs nedb 封装库与使用方法示例
2020/02/06 NodeJs
Javascript幻灯片播放功能实现过程解析
2020/05/07 Javascript
jQuery 常用特效实例小结【显示与隐藏、淡入淡出、滑动、动画等】
2020/05/19 jQuery
六个窍门助你提高Python运行效率
2015/06/09 Python
python2.x实现人民币转大写人民币
2018/06/20 Python
如何使用pyinstaller打包32位的exe程序
2019/05/26 Python
Python操作远程服务器 paramiko模块详细介绍
2019/08/07 Python
python同步两个文件夹下的内容
2019/08/29 Python
python编程进阶之类和对象用法实例分析
2020/02/21 Python
Python性能分析工具py-spy原理用法解析
2020/07/27 Python
pytorch使用horovod多gpu训练的实现
2020/09/09 Python
python获取命令行参数实例方法讲解
2020/11/02 Python
如何在网站上添加谷歌定位信息
2016/04/16 HTML / CSS
美国宠物商店:Wag.com
2016/10/25 全球购物
个人求职简历中英文自我评价
2013/12/16 职场文书
保险专业求职信
2014/07/07 职场文书
房产销售独家委托书范本
2014/10/01 职场文书
2015年感恩节演讲稿(优选篇)
2015/03/20 职场文书
2015年科普工作总结
2015/07/23 职场文书