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-8import sysfrom functools import partialfrom string import Templateimport argparseimport base64from urllib.parse import unquotefrom lxml.html import fromstringimport requestsfrom htmlutils import extractTextfrom termutils import foreachsession = 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 Truedef 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 # 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('
', '').replace('
', '\n\n') title = l.text write(title) write('\n\n') write(text) write('\n') return titleif __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)