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循环监控远程端口的方法
Mar 14 Python
Apache如何部署django项目
May 21 Python
基于Python3 逗号代码 和 字符图网格(详谈)
Jun 22 Python
python中字符串变二维数组的实例讲解
Apr 03 Python
在python中pandas的series合并方法
Nov 12 Python
CentOS下Python3的安装及创建虚拟环境的方法
Nov 28 Python
10 分钟快速入门 Python3的教程
Jan 29 Python
python定时按日期备份MySQL数据并压缩
Apr 19 Python
Python字符串大小写转换拼接删除空白
Sep 19 Python
python中的函数递归和迭代原理解析
Nov 14 Python
如何在python中执行另一个py文件
Apr 30 Python
python如何实现word批量转HTML
Sep 30 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
MOTOROLA 摩托罗拉 MODEL 66-XI五灯中波收音机
2021/03/02 无线电
小文件php+SQLite存储方案
2010/09/04 PHP
php获取网站百度快照日期的方法
2015/07/29 PHP
Laravel获取所有的数据库表及结构的方法
2019/10/10 PHP
对laravel的csrf 防御机制详解,及form中csrf_token()的存在介绍
2019/10/24 PHP
关于viewport,Ext.panel和Ext.form.panel的关系
2009/05/07 Javascript
thinkphp中常用的系统常量和系统变量
2014/03/05 Javascript
基于jQuery1.9版本如何判断浏览器版本类型
2016/01/12 Javascript
jQuery+ajax的资源回收处理机制分析
2017/01/07 Javascript
js 事件的传播机制(实例讲解)
2017/07/20 Javascript
angular或者js怎么确定选中ul中的哪几个li
2017/08/16 Javascript
微信小程序自定义模态对话框实例详解
2017/08/16 Javascript
Vue2.0实现组件数据的双向绑定问题
2018/03/06 Javascript
angularJs中$scope数据序列化的实例
2018/09/30 Javascript
配置一个vue3.0项目的完整步骤
2019/04/26 Javascript
详解在React-Native中持久化redux数据
2019/05/22 Javascript
浅谈layui 表单元素的选中问题
2019/10/25 Javascript
vuex state中的数组变化监听实例
2019/11/06 Javascript
浅谈Vue SSR中的Bundle的具有使用
2019/11/21 Javascript
python获取beautifulphoto随机某图片代码实例
2013/12/18 Python
pygame学习笔记(5):游戏精灵
2015/04/15 Python
Django中传递参数到URLconf的视图函数中的方法
2015/07/18 Python
mysql 之通过配置文件链接数据库
2017/08/12 Python
python实现隐马尔科夫模型HMM
2018/03/25 Python
python批量修改图片后缀的方法(png到jpg)
2018/10/25 Python
python中的global关键字的使用方法
2019/08/20 Python
Python PIL图片添加字体的例子
2019/08/22 Python
python 实现简单的FTP程序
2019/12/27 Python
Python3 虚拟开发环境搭建过程(图文详解)
2020/01/06 Python
Pycharm生成可执行文件.exe的实现方法
2020/06/02 Python
Python中使用Selenium环境安装的方法步骤
2021/02/22 Python
皇家道尔顿官网:Royal Doulton
2017/12/06 全球购物
TALLY WEiJL法国网上商店:服装、时装及配饰
2019/08/31 全球购物
公司领导九九重阳节发言稿2014
2014/09/25 职场文书
《风娃娃》教学反思
2016/02/18 职场文书
使用Navicat Premium工具将oracle数据库迁移到MySQL
2021/05/27 Oracle