Python實現(xiàn)的飛速中文網(wǎng)小說下載腳本
1.JavaScript 加密什么的最討厭了 :-(
1).eval 一個不依賴外部變量的函數(shù)立即調(diào)用很天真,看我 nodejs 來干掉你!
2).HTTP 請求的驗證首先嘗試 Referer,「小甜餅」沒有想像中的那么重要。
3).curl 和各命令行工具處理起文本很順手呢
4).但是 Python 也沒多幾行呢
2.Requests 效率比 lxml 自己那個好太多
3.progressbar 太先進了,我還是自個兒寫吧……
4.argparse 寫 Python 命令行程序必備啊~
5.string.Template也很好用哦
6.以下是主代碼啦,除了標(biāo)準(zhǔn)庫以及 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='下載飛速中文網(wǎng)小說')
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)
相關(guān)文章
Python tkinter庫實現(xiàn)登錄注冊基本功能
Python自帶了tkinter模塊,實質(zhì)上是一種流行的面向?qū)ο蟮腉UI工具包 TK 的Python編程接口,提供了快速便利地創(chuàng)建GUI應(yīng)用程序的方法,下面這篇文章主要給大家介紹了關(guān)于tkinter庫制作一個簡單的登錄注冊小程序,需要的朋友可以參考下2022-12-12
pandas中std和numpy的np.std區(qū)別及說明
這篇文章主要介紹了pandas中std和numpy的np.std區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08
初學(xué)者學(xué)習(xí)Python好還是Java好
在本篇文章里小編給大家分享的是關(guān)于初學(xué)者學(xué)習(xí)Python好還是Java好的相關(guān)內(nèi)容,需要的朋友們可以學(xué)習(xí)下。2020-05-05

