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 14 Python
Python中的super()方法使用简介
Aug 14 Python
Python实现定时任务
Feb 08 Python
Python数据分析之双色球基于线性回归算法预测下期中奖结果示例
Feb 08 Python
python线程中同步锁详解
Apr 27 Python
pyshp创建shp点文件的方法
Dec 31 Python
python 梯度法求解函数极值的实例
Jul 10 Python
Python Pandas 箱线图的实现
Jul 23 Python
Python实现Restful API的例子
Aug 31 Python
python实现梯度法 python最速下降法
Mar 24 Python
PyQt中使用QtSql连接MySql数据库的方法
Jul 28 Python
解决pycharm下载库时出现Failed to install package的问题
Sep 04 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
echo, print, printf 和 sprintf 区别
2006/12/06 PHP
phpmyadmin导入(import)文件限制的解决办法
2009/12/11 PHP
解析PHP自带的进位制之间的转换函数
2013/06/08 PHP
php把session写入数据库示例
2014/02/26 PHP
php5.3后静态绑定用法详解
2016/11/11 PHP
php smtp实现发送邮件功能
2017/06/22 PHP
PHP容器类的两种实现方式示例
2019/07/24 PHP
js+数组实现网页上显示时间/星期几的实用方法
2013/01/18 Javascript
javascript的数组和常用函数详解
2014/05/09 Javascript
D3.js中data(), enter() 和 exit()的问题详解
2015/08/17 Javascript
使用jQuery Rotare实现微信大转盘抽奖功能
2016/06/20 Javascript
jquery中live()方法和bind()方法区别分析
2016/06/23 Javascript
jQuery实现点击表格单元格就可以编辑内容的方法【测试可用】
2016/08/01 Javascript
jQuery弹出窗口打开链接的实现代码
2016/12/24 Javascript
Vue 过渡实现轮播图效果
2017/03/27 Javascript
vue组件生命周期详解
2017/11/07 Javascript
nodeJs实现基于连接池连接mysql的方法示例
2018/02/10 NodeJs
vuejs选中当前样式active的实例
2018/08/22 Javascript
jQuery-Citys省市区三级菜单联动插件使用详解
2019/07/26 jQuery
three.js中多线程的使用及性能测试详解
2021/01/07 Javascript
[01:30:54]《加油DOTA》 第三期
2014/08/18 DOTA
零基础写python爬虫之urllib2中的两个重要概念:Openers和Handlers
2014/11/05 Python
CentOS安装pillow报错的解决方法
2016/01/27 Python
Python魔法方法详解
2019/02/13 Python
python实现银联支付和支付宝支付接入
2019/05/07 Python
详解Python 中sys.stdin.readline()的用法
2019/09/12 Python
python pptx复制指定页的ppt教程
2020/02/14 Python
Pycharm自动添加文件头注释和函数注释参数的方法
2020/10/23 Python
天美时手表加拿大官网:Timex加拿大
2016/09/01 全球购物
lululemon美国官网:瑜伽服+跑步装备
2018/11/16 全球购物
一些关于MySql加速和优化的面试题
2014/01/30 面试题
建筑学推荐信
2013/11/03 职场文书
机关领导查摆四风思想汇报
2014/09/13 职场文书
毕业实习自我鉴定范文2014
2014/09/26 职场文书
社区义诊通知
2015/04/24 职场文书
解析原生JS getComputedStyle
2021/05/25 Javascript