Python实现的飞速中文网小说下载脚本

yipeiwu_com5年前Python基础

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实现分析apache和nginx日志文件并输出访客ip列表的方法

本文实例讲述了python实现分析apache和nginx日志文件并输出访客ip列表的方法。分享给大家供大家参考。具体如下: 这里使用python分析apache和nginx日志文件输出...

AI人工智能 Python实现人机对话

AI人工智能 Python实现人机对话

在人工智能进展的如火如荼的今天,我们如果不尝试去接触新鲜事物,马上就要被世界淘汰啦~ 本文拟使用Python开发语言实现类似于WIndows平台的“小娜”,或者是IOS下的“Siri”。...

python opencv 直方图反向投影的方法

python opencv 直方图反向投影的方法

本文介绍了python opencv 直方图反向投影的方法,分享给大家,具体如下: 目标: 直方图反向投影 原理: 反向投影可以用来做图像分割,寻找感兴趣区间。它会输出与输入图像...

Python批量修改文件后缀的方法

Python批量修改文件后缀的方法

近期下载了很多各种教程, 但是不幸的是后缀名都是 ".mp4", 而本人喜欢 ".rmvb" 后缀,由于有轻微洁癖, 受不了后面的 ".mp4" 缀, 但是手动修改又太过繁琐, 所以用近...

Python操作配置文件ini的三种方法讲解

python 操作配置文件ini的三种方法 方法一:crudini 命令 说明 crudini命令是Linux下的一个操作配置文件的命令工具 用法 crudini --set [--...