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中的pydoc模块和distutils模块
Apr 13 Python
Python下的subprocess模块的入门指引
Apr 16 Python
python中json格式数据输出的简单实现方法
Oct 31 Python
浅析使用Python操作文件
Jul 31 Python
python使用插值法画出平滑曲线
Dec 15 Python
Python3之手动创建迭代器的实例代码
May 22 Python
Django Channel实时推送与聊天的示例代码
Apr 30 Python
基于python+selenium自动健康打卡的实现代码
Jan 13 Python
python实现图片转字符画的完整代码
Feb 21 Python
Python趣味爬虫之用Python实现智慧校园一键评教
May 28 Python
给numpy.array增加维度的超简单方法
Jun 02 Python
python游戏开发Pygame框架
Apr 22 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
mysql总结之explain
2012/02/27 PHP
一个简单的php加密解密函数(动态加密)
2013/06/19 PHP
php 删除指定文件夹的实例讲解
2017/07/25 PHP
Laravel框架中队列和工作(Queues、Jobs)操作实例详解
2020/04/06 PHP
js获取单选框或复选框值及操作
2012/12/18 Javascript
绑定回车enter事件代码
2014/05/18 Javascript
Javascript无参数和有参数类继承问题解决方法
2015/03/02 Javascript
Js 获取当前函数参数对象的实现代码
2016/06/20 Javascript
node.js中的事件处理机制详解
2016/11/26 Javascript
JS求解三元一次方程组值的方法
2017/01/03 Javascript
Vue axios 中提交表单数据(含上传文件)
2017/07/06 Javascript
浅谈在Vue-cli里基于axios封装复用请求
2017/11/06 Javascript
Vue响应式原理深入解析及注意事项
2017/12/11 Javascript
Node.js静态服务器的实现方法
2018/02/28 Javascript
jquery.onoff实现简单的开关按钮功能(推荐)
2018/05/24 jQuery
vue.js实现插入数值与表达式的方法分析
2018/07/06 Javascript
vue单页缓存方案分析及实现
2018/09/25 Javascript
Vue 利用指令实现禁止反复发送请求的两种方法
2019/09/15 Javascript
webpack打包优化的几个方法总结
2020/02/10 Javascript
Python模拟脉冲星伪信号频率实例代码
2018/01/03 Python
python3实现windows下同名进程监控
2018/06/21 Python
更新修改后的Python模块方法
2019/03/03 Python
Python创建数字列表的示例
2019/11/28 Python
Python如何读取文件中图片格式
2020/01/13 Python
python os.listdir()乱码解决方案
2021/01/31 Python
python脚本使用阿里云slb对恶意攻击进行封堵的实现
2021/02/04 Python
匡威比利时官网:Converse Belgium
2017/04/13 全球购物
青年教师典范事迹材料
2014/01/31 职场文书
广告学专业求职信
2014/06/19 职场文书
合唱兴趣小组活动总结
2014/07/10 职场文书
工厂门卫的岗位职责
2014/07/27 职场文书
国庆促销活动总结
2014/08/29 职场文书
乡镇干部个人对照检查材料(群众路线)
2014/09/26 职场文书
党的群众路线教育实践活动心得体会(企业)
2014/11/03 职场文书
导游词之晋城蟒河
2019/12/12 职场文书
JavaScript文档对象模型DOM
2021/11/20 Javascript