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之深入变量和引用对象
Sep 24 Python
python optparse模块使用实例
Apr 09 Python
详细解读Python中解析XML数据的方法
Oct 15 Python
python二分查找算法的递归实现方法
May 12 Python
详解如何用OpenCV + Python 实现人脸识别
Oct 20 Python
python实现n个数中选出m个数的方法
Nov 13 Python
python 对类的成员函数开启线程的方法
Jan 22 Python
python+selenium 鼠标事件操作方法
Aug 24 Python
Python 实现打印单词的菱形字符图案
Apr 12 Python
Python使用monkey.patch_all()解决协程阻塞问题
Apr 15 Python
Django如何使用redis作为缓存
May 21 Python
Django如何与Ajax交互
Apr 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
php ci框架中加载css和js文件失败的解决方法
2014/03/03 PHP
php中的四舍五入函数代码(floor函数、ceil函数、round与intval)
2014/07/14 PHP
php字符串过滤与替换小结
2015/01/26 PHP
学习php设计模式 php实现策略模式(strategy)
2015/12/07 PHP
javascript入门·动态的时钟,显示完整的一些方法,新年倒计时
2007/10/01 Javascript
JS 操作符整理[推荐收藏]
2011/11/15 Javascript
jquery在IE、FF浏览器的差别详细探讨
2013/04/28 Javascript
jquery绑定事件不生效的解决方法
2014/02/11 Javascript
给html超链接设置事件不使用href来完成跳
2014/04/20 Javascript
Windows系统中安装nodejs图文教程
2015/02/28 NodeJs
javascript属性访问表达式用法分析
2015/04/25 Javascript
JavaScript检查子字符串是否在字符串中的方法
2016/02/03 Javascript
vue-router2.0 组件之间传参及获取动态参数的方法
2017/11/10 Javascript
layer弹出层全屏及关闭方法
2018/08/17 Javascript
Vue中使用 setTimeout() setInterval()函数的问题
2018/09/13 Javascript
微信小程序实现的动态设置导航栏标题功能示例
2019/01/31 Javascript
[08:54]DOTA2-DPC中国联赛 正赛 Aster vs LBZS 选手采访
2021/03/11 DOTA
python实现单线程多任务非阻塞TCP服务端
2017/06/13 Python
Python 12306抢火车票脚本 Python京东抢手机脚本
2018/02/06 Python
对python中的logger模块全面讲解
2018/04/28 Python
python如何实现数据的线性拟合
2019/07/19 Python
在Python中os.fork()产生子进程的例子
2019/08/08 Python
Python的Lambda函数用法详解
2019/09/03 Python
使用浏览器访问python写的服务器程序
2019/10/10 Python
opencv-python 读取图像并转换颜色空间实例
2019/12/09 Python
django多种支付、并发订单处理实例代码
2019/12/13 Python
解决pycharm上的jupyter notebook端口被占用问题
2019/12/17 Python
Python3中的f-Strings增强版字符串格式化方法
2020/03/04 Python
Python生成器generator原理及用法解析
2020/07/20 Python
CSS3 box-sizing属性详解
2016/11/15 HTML / CSS
亚马逊西班牙购物网站:amazon西班牙
2017/03/06 全球购物
调解协议书
2014/04/16 职场文书
投标文件签署授权委托书范本
2014/10/12 职场文书
准备去美国留学,那么大学申请文书应该怎么写?
2019/08/12 职场文书
SpringBoot读取Resource下文件的4种方法
2021/07/02 Java/Android
golang内置函数len的小技巧
2021/07/25 Golang