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中的fabs()方法的使用
May 14 Python
Python基础教程之利用期物处理并发
Mar 29 Python
python实现时间o(1)的最小栈的实例代码
Jul 23 Python
Python3.4 splinter(模拟填写表单)使用方法
Oct 13 Python
python 两个数据库postgresql对比
Oct 21 Python
Pytorch maxpool的ceil_mode用法
Feb 18 Python
python查找特定名称文件并按序号、文件名分行打印输出的方法
Apr 24 Python
结束运行python的方法
Jun 16 Python
Python requests模块安装及使用教程图解
Jun 30 Python
Python绘图之二维图与三维图详解
Aug 04 Python
Python调用飞书发送消息的示例
Nov 10 Python
python生成可执行exe控制Microsip自动填写号码并拨打功能
Jun 21 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
评分9.0以上的动画电影,剧情除了经典还很燃
2020/03/04 日漫
全国FM电台频率大全 - 26 西藏自治区
2020/03/11 无线电
yum命令安装php7和相关扩展
2016/07/04 PHP
php使用CURL模拟GET与POST向微信接口提交及获取数据的方法
2016/09/23 PHP
论坛里点击别人帖子下面的回复,回复标题变成“回复 24# 的帖子”
2009/06/14 Javascript
JavaScript Accessor实现说明
2010/12/06 Javascript
javascript 拖动表格行实现代码
2011/05/05 Javascript
读jQuery之六 缓存数据功能介绍
2011/06/21 Javascript
分享一个asp.net pager分页控件
2012/01/04 Javascript
JavaScript 高级篇之函数 (四)
2012/04/07 Javascript
JQuery1.8 判断元素是否绑定事件的方法
2014/07/10 Javascript
点击标签切换和自动切换DIV选项卡
2014/08/10 Javascript
分享使用AngularJS创建应用的5个框架
2015/12/05 Javascript
JS锚点的设置与使用方法
2016/09/05 Javascript
Node.js的环境安装配置(使用nvm方式)
2016/10/11 Javascript
JS 实现随机验证码功能
2017/02/15 Javascript
jQuery+CSS3实现点赞功能
2017/03/13 Javascript
AngularJS动态绑定ng-options的ng-model实例代码
2017/06/21 Javascript
用js实现before和after伪类的样式修改的示例代码
2017/09/07 Javascript
Vue发布项目实例讲解
2019/07/17 Javascript
Webpack设置环境变量的一些误区详解
2019/12/19 Javascript
[00:20]DOTA2荣耀之路7:-ah fu-抢盾
2018/05/31 DOTA
[00:23]魔方之谜解锁款式
2018/12/20 DOTA
利用Django框架中select_related和prefetch_related函数对数据库查询优化
2015/04/01 Python
cProfile Python性能分析工具使用详解
2019/07/22 Python
python创建学生成绩管理系统
2019/11/22 Python
关于Python不换行输出和不换行输出end=““不显示的问题(亲测已解决)
2020/10/27 Python
医药代表个人求职信范本
2013/12/19 职场文书
班主任新年寄语
2014/04/04 职场文书
研究生求职自荐书
2014/06/23 职场文书
政协调研汇报材料
2014/08/15 职场文书
学校党的群众路线教育实践活动总结材料
2014/10/30 职场文书
2014年店长工作总结
2014/11/17 职场文书
2015年国庆节活动总结
2015/03/23 职场文书
2015年父亲节寄语
2015/03/23 职场文书
python实战之90行代码写个猜数字游戏
2021/04/22 Python