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框架中select_related和prefetch_related函数对数据库查询优化
Apr 01 Python
介绍Python中几个常用的类方法
Apr 08 Python
python处理数据,存进hive表的方法
Jul 04 Python
Python os.rename() 重命名目录和文件的示例
Oct 25 Python
python print输出延时,让其立刻输出的方法
Jan 07 Python
python 求某条线上特定x值或y值的点坐标方法
Jul 09 Python
Python定时发送天气预报邮件代码实例
Sep 09 Python
pytorch 彩色图像转灰度图像实例
Jan 13 Python
python实现加密的方式总结
Jan 19 Python
基于Python测试程序是否有错误
May 16 Python
Python Matplotlib简易教程(小白教程)
Jul 28 Python
Django如何重置migration的几种情景
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 session
2013/10/28 PHP
php绘图中显示不出图片的原因及解决
2014/03/05 PHP
PHP读取文本文件并逐行输出该行使用最多的字符与对应次数的方法
2016/11/25 PHP
DOM节点深度克隆函数cloneNode()用法实例
2015/01/12 Javascript
JavaScript实现非常简单实用的下拉菜单效果
2015/08/27 Javascript
nodejs 中模拟实现 emmiter 自定义事件
2016/02/22 NodeJs
AngularJS使用ng-options指令实现下拉框
2016/08/23 Javascript
bootstrap表单按回车会自动刷新页面的解决办法
2017/03/08 Javascript
js实现点击切换checkbox背景图片的简单实例
2017/05/08 Javascript
js每隔两秒输出数组中的一项(实例)
2017/05/28 Javascript
Vue的Flux框架之Vuex状态管理器
2017/07/30 Javascript
JavaScript实现动态添加Form表单元素的方法示例
2017/08/14 Javascript
微信小程序基于slider组件动态修改标签透明度的方法示例
2017/12/04 Javascript
利用Blob进行文件上传的完整步骤
2018/08/02 Javascript
Smartour 让网页导览变得更简单(推荐)
2019/07/19 Javascript
ES6扩展运算符和rest运算符用法实例分析
2020/05/23 Javascript
详解在IDEA中将Echarts引入web两种方式(使用js文件和maven的依赖导入)
2020/07/11 Javascript
详解JavaScript作用域、作用域链和闭包的用法
2020/09/03 Javascript
JavaScript实现网页留言板功能
2020/11/23 Javascript
Python的Django框架中TEMPLATES项的设置教程
2015/05/29 Python
windows下安装Python的XlsxWriter模块方法
2018/05/03 Python
对python中的xlsxwriter库简单分析
2018/05/04 Python
Python集中化管理平台Ansible介绍与YAML简介
2019/06/12 Python
python或C++读取指定文件夹下的所有图片
2019/08/31 Python
python用什么编辑器进行项目开发
2020/06/17 Python
Python HTMLTestRunner如何下载生成报告
2020/09/04 Python
Python基于unittest实现测试用例执行
2020/11/25 Python
举例详解HTML5中使用JSON格式提交表单
2015/06/16 HTML / CSS
具有防紫外线功能的高性能钓鱼服装:Hook&Tackle
2018/08/16 全球购物
LINUX下线程,GDI类的解释
2016/12/14 面试题
关于感谢信的范文
2015/01/23 职场文书
八达岭长城导游词
2015/01/30 职场文书
电力工程合作意向书
2015/05/11 职场文书
python 通过使用Yolact训练数据集
2021/04/06 Python
Python多线程 Queue 模块常见用法
2021/07/04 Python
MySQL索引 高效获取数据的数据结构
2022/05/02 MySQL