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 相关文章推荐
asyncio 的 coroutine对象 与 Future对象使用指南
Sep 11 Python
python模块之re正则表达式详解
Feb 03 Python
Python中 传递值 和 传递引用 的区别解析
Feb 22 Python
Python读写zip压缩文件的方法
Aug 29 Python
Python操作json的方法实例分析
Dec 06 Python
Python实现对字典分别按键(key)和值(value)进行排序的方法分析
Dec 19 Python
python调用并链接MATLAB脚本详解
Jul 05 Python
PyTorch 普通卷积和空洞卷积实例
Jan 07 Python
Python修改列表值问题解决方案
Mar 06 Python
基于Python爬取51cto博客页面信息过程解析
Aug 25 Python
Python实现视频自动打码的示例代码
Apr 08 Python
Python中生成随机数据安全性、多功能性、用途和速度方面进行比较
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
wamp下修改mysql访问密码的解决方法
2013/05/07 PHP
8个必备的PHP功能开发
2015/10/02 PHP
PHP基于socket实现的简单客户端和服务端通讯功能示例
2017/07/10 PHP
php+ajax实现无刷新文件上传功能(ajaxuploadfile)
2018/02/11 PHP
window.location和document.location的区别分析
2008/12/23 Javascript
JS/jQuery实现默认显示部分文字点击按钮显示全部内容
2013/05/13 Javascript
javascript中取前n天日期的两种方法分享
2014/01/26 Javascript
js类型转换与引用类型详解(Boolean_Number_String)
2014/03/07 Javascript
jquery实现勾选复选框触发事件给input赋值
2015/02/01 Javascript
jQuery中toggle()函数的使用实例
2015/04/17 Javascript
JavaScript中的高级函数
2018/01/04 Javascript
JavaScript求一个数组中重复出现次数最多的元素及其下标位置示例
2018/07/23 Javascript
轻量级富文本编辑器wangEditor结合vue使用方法示例
2018/10/10 Javascript
Vue核心概念Action的总结
2019/01/18 Javascript
为什么Vue3.0使用Proxy实现数据监听(defineProperty表示不背这个锅)
2019/10/14 Javascript
vue 实现LED数字时钟效果(开箱即用)
2019/12/08 Javascript
vue video和vue-video-player实现视频铺满教程
2020/10/30 Javascript
python三元运算符实现方法
2013/12/17 Python
Python OS模块常用函数说明
2015/05/23 Python
Python从MP3文件获取id3的方法
2015/06/15 Python
python基于pyDes库实现des加密的方法
2017/04/29 Python
Python编程实现从字典中提取子集的方法分析
2018/02/09 Python
Django2.1.3 中间件使用详解
2018/11/26 Python
python3图片文件批量重命名处理
2019/10/31 Python
Python迭代器Iterable判断方法解析
2020/03/16 Python
Watch Station官方网站:世界一流的手表和智能手表
2020/01/05 全球购物
几个判断型的面试题
2012/07/03 面试题
商务日语专业毕业生求职信
2013/10/26 职场文书
最新茶叶店创业计划书
2014/01/14 职场文书
大学生个人事迹材料
2014/01/21 职场文书
党员公开承诺践诺书
2014/03/25 职场文书
团支部建设方案
2014/05/02 职场文书
学校地质灾害防治方案
2014/06/10 职场文书
党员干部形式主义个人整改措施
2014/09/17 职场文书
廉洁自律承诺书范文
2015/04/28 职场文书
Flask搭建一个API服务器的步骤
2021/05/28 Python