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中的reduce内建函数使用方法指南
Aug 31 Python
利用python程序生成word和PDF文档的方法
Feb 14 Python
Python基于动态规划算法解决01背包问题实例
Dec 06 Python
Python机器学习之SVM支持向量机
Dec 27 Python
Pycharm设置界面全黑的方法
May 23 Python
python 实现将字典dict、列表list中的中文正常显示方法
Jul 06 Python
python中map的基本用法示例
Sep 10 Python
Python代码打开本地.mp4格式文件的方法
Jan 03 Python
python实现五子棋游戏(pygame版)
Jan 19 Python
Python3读取和写入excel表格数据的示例代码
Jun 09 Python
Python建造者模式案例运行原理解析
Jun 29 Python
Ubuntu 20.04安装Pycharm2020.2及锁定到任务栏的问题(小白级操作)
Oct 29 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
ThinkPHP调试模式与日志记录概述
2014/08/22 PHP
PHP实现合并两个排序链表的方法
2018/01/19 PHP
PHP获取文件扩展名的常用方法小结【五种方式】
2018/04/27 PHP
PHP实现 APP端微信支付功能
2018/06/22 PHP
基于jQuery的history历史记录插件
2010/12/11 Javascript
NodeJS与Mysql的交互示例代码
2013/08/18 NodeJs
js中的setInterval和setTimeout使用实例
2014/05/09 Javascript
用JavaScript判断CSS浏览器类型前缀的两种方法
2015/10/08 Javascript
基于JavaScript短信验证码如何实现
2016/01/24 Javascript
通过隐藏iframe实现无刷新上传文件操作
2016/03/16 Javascript
Servlet3.0与纯javascript通过Ajax交互的实例详解
2018/03/18 Javascript
vue实现简单跑马灯效果
2020/05/25 Javascript
vue-cli3 引入 font-awesome的操作
2020/08/11 Javascript
[02:57]DOTA2英雄基础教程 风行者
2014/01/16 DOTA
从零学python系列之教你如何根据图片生成字符画
2014/05/23 Python
Python随机读取文件实现实例
2017/05/25 Python
你真的了解Python的random模块吗?
2017/12/12 Python
python+opencv实现霍夫变换检测直线
2020/10/23 Python
linux下安装python3和对应的pip环境教程详解
2019/07/01 Python
pytorch 常用线性函数详解
2020/01/15 Python
python 数据库查询返回list或tuple实例
2020/05/15 Python
pycharm设置默认的UTF-8编码模式的方法详解
2020/06/01 Python
HTML5的一个显示电池状态的API简介
2015/06/18 HTML / CSS
美国标志性加大尺码时装品牌:Ashley Stewart
2016/12/15 全球购物
英国Flybe航空官网:欧洲最大的独立支线廉价航空公司
2019/07/15 全球购物
如何写一封打动人心的求职信
2014/02/17 职场文书
党的群众路线教育实践活动宣传方案
2014/02/23 职场文书
个人工作主要事迹
2014/05/08 职场文书
小学学习雷锋活动总结
2014/07/03 职场文书
幼儿园保育员责任书
2014/07/22 职场文书
在宿舍喝酒的检讨书
2014/09/28 职场文书
见习报告的格式
2014/10/31 职场文书
交通事故和解协议书
2015/01/27 职场文书
世界文化遗产导游词
2019/08/07 职场文书
mysql 8.0.24版本安装配置方法图文教程
2021/05/12 MySQL
Typescript类型系统FLOW静态检查基本规范
2022/05/25 Javascript