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中time()方法的使用的教程
May 22 Python
django实现分页的方法
May 26 Python
python检测是文件还是目录的方法
Jul 03 Python
python各种语言间时间的转化实现代码
Mar 23 Python
tensorflow创建变量以及根据名称查找变量
Mar 10 Python
python实现自主查询实时天气
Jun 22 Python
Python中的Numpy矩阵操作
Aug 12 Python
python将txt文件读入为np.array的方法
Oct 30 Python
python的xpath获取div标签内html内容,实现innerhtml功能的方法
Jan 02 Python
PyTorch 随机数生成占用 CPU 过高的解决方法
Jan 13 Python
浅谈Python的方法解析顺序(MRO)
Mar 05 Python
Python HTMLTestRunner如何下载生成报告
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
PHP中模拟处理HTTP PUT请求的例子
2014/07/22 PHP
再推荐十款免费的php开发工具
2015/11/09 PHP
javascript iframe编程相关代码
2009/12/28 Javascript
js获取单选框或复选框值及操作
2012/12/18 Javascript
js实现单行文本向上滚动效果实例代码
2013/11/28 Javascript
node.js中的path.delimiter方法使用说明
2014/12/09 Javascript
JavaScript进阶练习及简单实例分析
2016/06/03 Javascript
一句jQuery代码实现返回顶部效果(简单实用)
2016/12/28 Javascript
javascript 判断一个对象为数组的方法
2017/05/03 Javascript
JavaScript之面向对象_动力节点Java学院整理
2017/06/29 Javascript
JavaScript中立即执行函数实例详解
2017/11/04 Javascript
JS实现十字坐标跟随鼠标效果
2017/12/25 Javascript
JS关于刷新页面的相关总结
2018/05/09 Javascript
详解关于Vue版本不匹配问题(Vue packages version mismatch)
2018/09/17 Javascript
node之本地服务器图片上传的方法示例
2019/03/26 Javascript
vue3 源码解读之 time slicing的使用方法
2019/10/31 Javascript
[35:44]2014 DOTA2华西杯精英邀请赛 5 24 iG VS VG
2014/05/26 DOTA
python自定义类并使用的方法
2015/05/07 Python
python距离测量的方法
2018/03/06 Python
python按行读取文件,去掉每行的换行符\n的实例
2018/04/19 Python
用Python中的turtle模块画图两只小羊方法
2019/04/09 Python
Python range、enumerate和zip函数用法详解
2019/09/11 Python
python爬虫开发之urllib模块详细使用方法与实例全解
2020/03/09 Python
Python3爬虫中Splash的知识总结
2020/07/10 Python
python爬虫使用scrapy注意事项
2020/11/23 Python
巴西最大的体育用品商城:Netshoes巴西
2016/11/29 全球购物
美国值得信赖的婚恋交友网站:eHarmony
2018/10/04 全球购物
Yahoo的PHP面试题
2014/05/26 面试题
文明学生标兵事迹
2014/01/21 职场文书
办公室文员工作职责
2014/01/31 职场文书
教师对学生的评语
2014/04/28 职场文书
国旗下的演讲稿
2014/05/08 职场文书
企业标语口号
2014/06/10 职场文书
党的群众路线教育实践活动对照检查剖析材料
2014/10/09 职场文书
2015年秋季校长开学典礼致辞
2015/07/29 职场文书
2019年朋友圈经典励志语录50条
2019/07/05 职场文书