查看: 537|回复: 1

[编程交流] 多线程任意网站小说下载配置版

[复制链接]
发表于 2020-8-9 15:46 | 显示全部楼层 |阅读模式
Gu_city 2020-8-9 15:46 537 1 显示全部楼层
疫情在家太无聊,就开始看小说,但是发现很多小说不是要开会员就是带有大量广告,
于是就有了爬取小说的想法,但是每次搜索到的网站都是不一样的,总不能每次都
重新写个爬虫啊,于是就有了这个整合版本的,这是第一版灵感来自于一个看书软件
但是软件被收购了以后就不维护了,现在不能用了,只能自己动手解决这些问题了
贴代码
  1. import configparser, os, requests, chardet, time, refrom lxml import etree
  2. from multiprocessing import Pool
  3. from requests.adapters import HTTPAdapter
  4. from urllib.parse import urljoin  # 网址绝对路径与相对路径拼接

  5. xzwz = ''  # 下载小说的网址
  6. ml = ''  # 得到目录页连接
  7. bt = ''  # 得到目录页标题
  8. zw = ''  # 得到小说正文

  9. headers = {
  10.     'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108

  11. Safari/537.36',

  12. }


  13. def mkdir(path):  # 创建目录

  14.     isExists = os.path.exists(path)  # 判断路径是否存在  # 存在     True  # 不存在   False
  15.     if not isExists:  # 判断结果  # 如果不存在则创建目录
  16.         os.makedirs(path)  # 创建目录操作函数
  17.         print(path + ' 创建成功')
  18.         return True
  19.     else:
  20.         # 如果目录存在则不创建,并提示目录已存在
  21.         print(path + ' 目录已存在')
  22.         return False


  23. def duini():
  24.     global xzwz, bt, zw, ml
  25.     # print('读取网址列表')
  26.     cf = configparser.ConfigParser()
  27.     cf.read("网址接口.ini")

  28.     wzlist = cf.options('下载页')
  29.     # print(wzlist)
  30.     # print(type(wzlist))
  31.     wzm = wzlist[0]
  32.     print(wzm)

  33.     xzwz = cf.get('下载页', wzm)
  34.     ml = cf.get(wzm, '目录连接')
  35.     bt = cf.get(wzm, '目录标题')
  36.     zw = cf.get(wzm, '正文')
  37.     # print(pjt)
  38.     # print(wzlist[0])
  39.     # print(xzwz)
  40.     # print(bt)
  41.     path = os.getcwd() + '/小说下载'
  42.     mkdir(path)
  43.     os.chdir(path)


  44. def huoqulist():
  45.     global xzwz, ml, bt
  46.     print('获取列表中.......')
  47.     print(xzwz)
  48.     # print(type(xzwz))
  49.     # print(type(ml)  ,bt,zw)
  50.     s = requests.Session()
  51.     s.mount('http://', HTTPAdapter(max_retries=3))
  52.     s.mount('https://', HTTPAdapter(max_retries=3))
  53.     try:
  54.         html = requests.get(xzwz, headers=headers)
  55.         e = chardet.detect(html.content)['encoding']
  56.         html.encoding = e
  57.         # print(html.text)
  58.         txt = etree.HTML(html.text)
  59.         # print(txt)
  60.         tlj = txt.xpath(ml)
  61.         tbt = txt.xpath(bt)  # text() 为提取文字内容,不然就要在下面  写  i.text
  62.         bturl = []
  63.         print('一共有  %d   章' % len(tlj))
  64.         if len(tlj) == 0 or len(tbt) == 0:
  65.             print('目录获取失败,检查下载页面和正则配置是否正确')
  66.         else:
  67.             for i in range(len(tlj)):
  68.                 name = re.sub('[\/:*?"“”<>~  !,:‘’|]', '', tbt[i])#文件名安全化处理
  69.                 # print(name)
  70.                 fullurl = urljoin(xzwz, tlj[i])
  71.                 bturl.append(fullurl + '|' + name)
  72.                 # 分割写法   url = ulist.split('|')[0]
  73.                 # print(i)
  74.             #print(bturl)
  75.             return (bturl)
  76.     except requests.exceptions.RequestException as e:
  77.         print(e)


  78. def test(i, url_1, zw):
  79.     # print(i, pjt, url_1)
  80.     time.sleep(1)
  81.     wjm = url_1.split('|')[1]
  82.     lj = url_1.split('|')[0]

  83.     wj = os.getcwd() + '/{}.txt'.format(wjm)
  84.     if not os.path.exists(wj):
  85.         print(i, wjm)
  86.         s = requests.Session()
  87.         s.mount('http://', HTTPAdapter(max_retries=3))
  88.         s.mount('https://', HTTPAdapter(max_retries=3))
  89.         try:
  90.             html = requests.get(lj, headers=headers, timeout=5)
  91.             e = chardet.detect(html.content)['encoding']
  92.             html.encoding = e
  93.             txt = etree.HTML(html.text)
  94.             nr = txt.xpath(zw)
  95.             wb = ''
  96.             for x in nr:
  97.                 # print(x)
  98.                 wb = wb + x
  99.             # print(wb)
  100.             time.sleep(0.5)
  101.             # print(wj)
  102.             with open(wj, 'w', encoding='GBK') as f:
  103.                 f.write(wb)
  104.         except requests.exceptions.RequestException as e:
  105.             print(e)


  106. def is_number(s):  # 判断是否为数字
  107.     try:
  108.         float(s)
  109.         return True
  110.     except ValueError:
  111.         pass

  112.     try:
  113.         import unicodedata
  114.         unicodedata.numeric(s)
  115.         return True
  116.     except (TypeError, ValueError):
  117.         pass

  118.     return False


  119. if __name__ == '__main__':
  120.     print('start')
  121.     duini()
  122.     time.sleep(1)
  123.     clist = huoqulist()
  124.     #input()
  125.     pool = Pool(processes=30)
  126.     if len(clist) > 0:
  127.         for i in range(len(clist)):
  128.             # print(i)
  129.             url_1 = clist[i]
  130.             pool.apply_async(test, args=(i, url_1, zw))  # 维持执行的进程总数为10,当一个进程执行完后启动一

  131. 个新进程.test  为进程名字
  132.         pool.close()
  133.         pool.join()
  134.     else:
  135.         print('clist  列表为空列表')

  136. # test(1, 'http://www.xbiquge.la/10/10489/9700534.html|第459章冥丹')
复制代码
使用方法:把附件解压出来跟程序放在同一文件夹就可以了
需要xpath正则基础,各目录提取需要自己写
我自己适配了几个网址,其他的自己添加
大部分可以用第一种配置就可以了
图片说明粉色是下载的网址  一定要是小说的目录那一页
红色是用的那个配置   名字要一样
G%9W3]SUIO6UD5983_X1RNJ.png (87.3 KB, 下载次数: 0)

QQ截图20200809154544.jpg

网址接口.zip

392 Bytes, 下载次数: 8, 下载积分: 牛币 -2 个

发表于 2020-8-10 16:47 | 显示全部楼层
谢谢大佬,拿来研究下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则 返回列表 发新帖

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