找回密码
  注册[Register]
查看: 839|回复: 8

[其他] 知轩藏书下载工具

  [复制链接]
发表于 2020-7-27 20:20 来自手机 | 显示全部楼层 |阅读模式
禁止求评分、诱导评分、互刷评分、互刷悬赏值,违规者封号处理。
禁止发布推广、邀请码、邀请链接、二维码或者有利益相关的任何推广行为。
所有非原创软件请发布在【精品软件区】,发帖必须按照本版块版规格式发帖。

知轩藏书是比较不错的精校小说下载网站, 可惜某些时候经常被和谐, 所以做了个下载工具, 吧已经有的都扒下来
脚本是python3.7.1写的, 懒得写界面了, 直接贴脚本

运行以后会根据C_IndexMin和C_IndexMax值下载对应的小说, 目前C_IndexMax设置3W够用了, 知轩现在最大编号才1W2
下载目录为脚本当前目录的\Download\知轩藏书\
如果运行一半关闭再自动会从头开始, 但是已经下载完毕的书会校验, 如果正常就不重复下载了(某些网络波动, 下载的时候正好无法访问导致下载失败)

我是用pycharm写的, 但是用python自带的idle也能直接运行, 就是下载进度信息不能覆盖挺难看的
如果用pycharm运行没问题

131727mbwhh33i39gmra3a.png

  1. import os
  2. import re
  3. import urllib.request
  4. import contextlib
  5. import json
  6. import sys

  7. #大牛破解论坛 - 黑暗煎饼果子

  8. lWorkPath = os.getcwd() + '\\Download\\知轩藏书\\'
  9. if not os.path.exists(lWorkPath):
  10.     os.makedirs(lWorkPath)
  11. lBooksPath = lWorkPath + 'Books\\'
  12. if not os.path.exists(lBooksPath):
  13.     os.makedirs(lBooksPath)
  14. C_URLInfo = r'http://www.zxcs.me/post/%d'
  15. C_URLDownload = r'http://www.zxcs.me/download.php?id=%d'

  16. C_IndexMin = 1090 #知轩最小书籍编号是1090
  17. C_IndexMax = 30000

  18. lURLOpener = urllib.request.build_opener(urllib.request.HTTPHandler)
  19. urllib.request.install_opener(lURLOpener)
  20. lURLOpener.addheaders = [
  21.     ('Host', 'http://www.zxcs.me'),
  22.     ('Connection', 'keep-alive'),
  23.     ('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36'),
  24. ]

  25. def DownloadProgress(blocknum, bs, size):
  26.     '''''
  27.     blocknum:已经下载的数据块
  28.     bs:数据块的大小
  29.     size:远程文件的大小
  30.    '''
  31.     per = 100.0 * blocknum * bs / size
  32.     if per > 100 :
  33.         per = 100
  34.     sys.stdout.write('正在下载: %.2f%%' % per)
  35.     sys.stdout.write('\r')
  36.     sys.stdout.flush()

  37. lJSONFile = lWorkPath + 'List.json'

  38. if os.path.exists(lJSONFile):
  39.     with open(lJSONFile, 'r', encoding='utf-8') as f:
  40.         lJBooks = json.load(f)
  41. else:
  42.     lJBooks = {}

  43. for lIndex in range(C_IndexMin, C_IndexMax + 1):
  44.     print()

  45.     lID = str(lIndex)

  46.     lJBook = lJBooks.get(lID, {})

  47.     lFileName = lJBook.get('File', '')
  48.     if (lFileName != '') and os.path.exists(lBooksPath + lFileName):
  49.         if 'Size' not in lJBook:
  50.             lJBook['Size'] = os.path.getsize(lBooksPath + lFileName)
  51.             lJBooks[lID] = lJBook
  52.             with open(lJSONFile, 'w', encoding='utf-8') as f:
  53.                 json.dump(lJBooks, f, ensure_ascii=False)
  54.         print('%d 已存在' % lIndex)
  55.         print()
  56.         continue

  57.     # 获取书籍信息
  58.     try:
  59.         lHTML = lURLOpener.open(C_URLInfo % lIndex).read().decode('utf-8')
  60.         # 找信息部分 <div id="content">
  61.         lHTMLClass = re.compile(r'(?<=<div id="content">)[^\f]+?(?=</div>)').search(lHTML)
  62.         if lHTMLClass:
  63.             # 取Title
  64.             lTitle = re.compile(r'(?<=<h1>).+?(?=</h1>)').search(lHTMLClass.group(0)).group(0)
  65.             # 书名
  66.             lJBook['Name'] = re.compile(r'(?<=《).+?(?=》)').search(lTitle).group(0)
  67.             # 作者
  68.             lJBook['Author'] = re.compile(r'(?<=作者:).+').search(lTitle).group(0)
  69.             # 分类
  70.             # lJBook['Sort'] = re.compile(r'(?<=<a >).+?(?=</a>)').search(lHTMLClass.group(0)).group(0)
  71.             lTempStr = re.compile(r'<a >.+?</a>').search(lHTMLClass.group(0)).group(0)
  72.             lJBook['Sort'] = re.compile(r'(?<=>).+(?=<)').search(lTempStr).group(0)
  73.             # 标签
  74.             # lJBook['Tag'] = re.compile(r'(?<=<a href="http://www.zxcs.me/tag/[^\s>]+?">).+?(?=</a>)').search(lHTMLClass.group(0)).group(0)
  75.             lTempStr = re.compile(r'<a href="http://www.zxcs.me/tag/[^\s>]+?">.+?</a>').search(lHTMLClass.group(0)).group(0)
  76.             lJBook['Tag'] = re.compile(r'(?<=>).+(?=<)').search(lTempStr).group(0)

  77.             lJBook['Desc'] = re.compile(r'(?<=【内容简介】:)[^\f\v]+?(?=</p>)').search(lHTML).group(0).replace('<br />', '').replace(' ', ' ')
  78.     except Exception as e:
  79.         print('[%d]获取信息失败: %s' % (lIndex, e))
  80.         continue

  81.     # 获取书籍文件
  82.     try:
  83.         # 下载页面
  84.         lHTML = lURLOpener.open(C_URLDownload % lIndex).read().decode('utf-8')
  85.         # 下载地址列表
  86.         lDownloadURLList = re.compile(r'(?<=<span class="downfile"><a href=").+?(?=")').findall(lHTML)
  87.         if not lDownloadURLList:
  88.             raise Exception('无法获取下载地址')
  89.     except Exception as E:
  90.         print(E)
  91.         continue

  92.     try:
  93.         lDownloaded = False
  94.         lErrors = []
  95.         for lDownloadURL in lDownloadURLList:
  96.             try:
  97.                 lFileExt = re.compile(r'\.[^\./]+

  98. ).search(lDownloadURL).group(0)
  99.                 lFileName = lID + lFileExt
  100.                 lJBook['File'] = lFileName

  101.                 # 先获取要下载的文件大小
  102.                 lFileSize = 0
  103.                 try:
  104.                     with contextlib.closing(urllib.request.urlopen(lDownloadURL, None)) as UR:
  105.                         lHeaders = UR.info()
  106.                         lFileSize = int(lHeaders['Content-Length'])
  107.                 except Exception as E:
  108.                     lFileSize = 0
  109.                     print('获取文件大小失败: %s' % E)

  110.                 # 下载
  111.                 urllib.request.urlretrieve(lDownloadURL, lBooksPath + lFileName, DownloadProgress)

  112.                 # 校验文件大小
  113.                 lRFileSize = int(os.path.getsize(lBooksPath + lFileName))
  114.                 if lRFileSize != lFileSize:
  115.                     raise Exception('文件大小不一致')

  116.                 lJBook['Size'] = lFileSize
  117.                 lDownloaded = True
  118.                 break
  119.             except Exception as E:
  120.                 lErrors.append(E)

  121.         if lDownloaded:
  122.             lJBooks[lID] = lJBook
  123.             with open(lJSONFile, 'w', encoding='utf-8') as f:
  124.                 json.dump(lJBooks, f, ensure_ascii=False)
  125.             print('[%d]下载完成%s' % (lIndex, ' ' * 10))
  126.         else:
  127.             # 下载失败, 从json内删除
  128.             if lID in lJBooks:
  129.                 del lJBooks[lID]
  130.             raise Exception(lErrors)
  131.     except Exception as E:
  132.         if (lFileName != '') and os.path.exists(lBooksPath + lFileName):
  133.             os.remove(lBooksPath + lFileName)
  134.         print('[%d]下载失败: %s' % (lIndex, E))

  135. input('按任意键结束')
复制代码


如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2020-7-27 20:20 | 显示全部楼层
6666666666
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2020-7-27 20:20 | 显示全部楼层
感谢楼主分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2020-7-27 20:33 | 显示全部楼层
谢谢分享
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2020-7-27 20:45 | 显示全部楼层
谢谢大牛
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2020-7-27 20:51 | 显示全部楼层
好的,非常感谢
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2020-7-27 20:58 | 显示全部楼层
6666
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

发表于 2020-7-28 08:47 | 显示全部楼层
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复

使用道具 举报

发表于 2020-7-28 19:03 | 显示全部楼层
谢谢大佬
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【热心值】和【牛币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 有用 没用

使用道具 举报

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

RSS订阅|手机版|小黑屋|广告投放|大牛论坛

GMT+8, 2024-6-4 22:41 , Processed in 0.036754 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表