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对数组进行反转的方法
May 20 Python
python基础教程之匿名函数lambda
Jan 17 Python
Python中Selenium模拟JQuery滑动解锁实例
Jul 26 Python
修复 Django migration 时遇到的问题解决
Jun 14 Python
Python将8位的图片转为24位的图片实现方法
Oct 24 Python
Python imageio读取视频并进行编解码详解
Dec 10 Python
PyCharm 专业版安装图文教程
Feb 20 Python
python统计字符串中字母出现次数代码实例
Mar 02 Python
python 爬取百度文库并下载(免费文章限定)
Dec 04 Python
pycharm 实现调试窗口恢复
Feb 05 Python
详解Python+OpenCV进行基础的图像操作
Feb 15 Python
python在package下继续嵌套一个package
Apr 14 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 日期加减的类,很不错
2009/10/10 PHP
php-cli简介(不会Shell语言一样用Shell)
2013/06/03 PHP
PHP 输出URL的快捷方式示例代码
2013/09/22 PHP
PHP中ini_set与ini_get用法实例
2014/11/04 PHP
浅谈php正则表达式中的非贪婪模式匹配的使用
2014/11/25 PHP
php支持中文字符串分割的函数
2015/05/28 PHP
初识ThinkPHP控制器
2016/04/07 PHP
100多行PHP代码实现socks5代理服务器[2]
2016/05/05 PHP
php处理复杂xml数据示例
2016/07/11 PHP
js 获取中文拼音,Select自动匹配字母获取值的代码
2009/09/23 Javascript
高亮显示web页表格行的javascript代码
2010/11/19 Javascript
JQUERY设置IFRAME的SRC值的代码
2010/11/30 Javascript
按下Enter焦点移至下一个控件的实现js代码
2013/12/11 Javascript
8个实用的jQuery技巧
2014/03/04 Javascript
js实现背景图片感应鼠标变化的方法
2015/02/28 Javascript
JavaScript整除运算函数ceil和floor的区别分析
2015/04/14 Javascript
延时加载JavaScript代码提高速度
2015/12/27 Javascript
jQuery ajax应用总结
2016/06/02 Javascript
nodejs 如何手动实现服务器
2018/08/20 NodeJs
记一次react前端项目打包优化的方法
2020/03/30 Javascript
Python 实现字符串中指定位置插入一个字符
2018/05/02 Python
基于scrapy的redis安装和配置方法
2018/06/13 Python
PyCharm设置SSH远程调试的方法
2018/07/17 Python
基于numpy中数组元素的切片复制方法
2018/11/15 Python
python关于矩阵重复赋值覆盖问题的解决方法
2019/07/19 Python
python函数声明和调用定义及原理详解
2019/12/02 Python
Python 使用双重循环打印图形菱形操作
2020/08/09 Python
HTML5边玩边学(2)基础绘图实现方法
2010/09/21 HTML / CSS
简历中的自我评价范文
2014/02/05 职场文书
升国旗仪式主持词
2014/03/19 职场文书
年会搞笑主持词串词
2014/03/24 职场文书
借款协议书范本
2014/04/22 职场文书
个人批评与自我批评范文
2014/10/17 职场文书
2014年督导工作总结
2014/11/19 职场文书
关于Javascript闭包与应用的详解
2021/04/22 Javascript
Mysql数据库命令大全
2021/05/26 MySQL