鱼C论坛

 找回密码
 立即注册
查看: 2512|回复: 0

[作品展示] 用python爬虫获取小说

[复制链接]
发表于 2018-6-29 12:44:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 chenxz186 于 2018-6-29 16:55 编辑

        曾几何时,你是否见到某小说突然收费了,然后抓狂不断在网上查找哪里免费的下载资源,结果很多时候是找不到的,而且找到的也只是web上的,我们只能在浏览器上看,若没有网络那咋办呢?继续抓狂呗!
        我喜欢听小说,就是把小说下载下来后,放进小说软件上开启听书模式,然后静静的聆听起来。毕竟天天操电脑,眼睛也需要休息的,所以听听书也挺不错,喜欢听书的朋友可以用一些听书的软件,把下载好的小说放进去,开启听书模式就能听了。好了,废话不多说了,要尽快亮出今天的主角内容。
        近来我迷上一部小说《百炼成神》, 我们在https://m.sikushu.org/可以查找到,今天这个爬虫小程序能在此网上爬取所有的小说,只需要应用requests、bs4、os、time这四个模块,其中time模块只是为了测算整个过程耗费的时间,对整个程序没有根本性的作用,各位可根据实际情况取舍,其余三个模块在网上可以找到相关学习资料,我就不多说了,直接上代码。

代码:
  1. import requests
  2. import bs4
  3. import os
  4. import time


  5. def folder_func(folder_name='小说收藏'):
  6.     """生成文件夹"""
  7.     if os.path.exists(folder_name):
  8.         os.chdir(folder_name)
  9.         folder = os.getcwd()
  10.     else:
  11.         os.mkdir(folder_name)
  12.         os.chdir(folder_name)
  13.         folder = os.getcwd()
  14.     return folder


  15. def download_per_chapter_content(name, target, fiction_name, folder):
  16.     content = target.find('div', id="nr1").text.strip()
  17.     total_content = [name, content]
  18.     filename = folder + '/' + fiction_name + '.txt'
  19.     with open(filename, 'a', encoding='utf-8') as file:
  20.         file.writelines(total_content)


  21. def find_per_chapter(soup):
  22.     # 找出相关的 a 标签
  23.     a_tag = soup.find_all('a')
  24.     a_list = []
  25.     for each in a_tag:
  26.         if '.html' in each['href']:
  27.             # 找每一章的章节名称
  28.             chapter_name = each.text
  29.             # 找每一章的内容
  30.             chapter_url = 'https://m.sikushu.org' + each['href']
  31.             # 合并数据
  32.             a_list.append(['\n\n\n     ' + chapter_name + '     \n\n', chapter_url])
  33.     return a_list


  34. def find_page(soup):
  35.     page = 0
  36.     for each in soup.find_all('div', class_="page"):
  37.         if '输入页数' in each.text:
  38.             page += int(each.text.split('/', 1)[1].split('页)', 1)[0])
  39.     return page



  40. def find_fiction_name(soup):
  41.     fiction_name = soup.find('title').text.split('_', 1)[0]
  42.     return fiction_name


  43. def cooking_soup(res):
  44.     soup = bs4.BeautifulSoup(res.text, 'html.parser')
  45.     return soup


  46. def open_url(url):
  47.     headers = {
  48.         'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'}
  49.     res = requests.get(url, headers=headers)
  50.     res.encoding = 'gbk'
  51.     return res


  52. def timer(param_time):
  53.     hours = int(param_time // 3600)
  54.     minutes = int(param_time % 3600 // 60)
  55.     seconds = int(param_time % 3600 % 60)
  56.     mses = int((param_time % 3600 % 1) * 1000)
  57.     if param_time < 1:
  58.         time_meter = '%d 毫秒' % mses
  59.     elif 1 <= param_time < 60:
  60.         time_meter = '%d 秒 %d 毫秒' % (seconds, mses)
  61.     elif 60 <= param_time < 3600:
  62.         time_meter = '%d 分 %d 秒 %d 毫秒' % (minutes, seconds, mses)
  63.     else:
  64.         time_meter = '%d 时 %d 分 %d 秒 %d 毫秒' % (hours, minutes, seconds, mses)
  65.     return time_meter


  66. def main(start_time):
  67.     folder = folder_func()
  68.     print('\n \033[1;35m 例如《百炼成神》的目录网址是 "https://m.sikushu.org/93/93866" ,因为程序内'
  69.           '默认了\n "https://m.sikushu.org/" ,那么只需要在输入后半段"93/93866"就行\033[0m \n')
  70.     prompt = 'https://m.sikushu.org/' + input('请输入您要搜索的小说网址后半段,按上例来输入:')
  71.     response = open_url(prompt)
  72.     prompt_soup = cooking_soup(response)
  73.     fiction_name = find_fiction_name(prompt_soup)
  74.     page = find_page(prompt_soup)
  75.     print('页数有 ' + str(page) + ' 页')
  76.     count = 1
  77.     start = start_time
  78.     for i in range(1, page + 1):
  79.         url = '%s_%s/' % (prompt, str(i))
  80.         res = open_url(url)
  81.         soup = cooking_soup(res)
  82.         a_list = find_per_chapter(soup)
  83.         print(a_list)
  84.         for each_chapter in a_list:
  85.             chapter_res = open_url(each_chapter[1])
  86.             chapter_soup = cooking_soup(chapter_res)
  87.             download_per_chapter_content(each_chapter[0], chapter_soup, fiction_name, folder)

  88.         end_time = time.time()
  89.         end = end_time
  90.         cumulative_time = end_time - start_time
  91.         gap_time = end - start
  92.         print('第%d个网页下载完耗时: %s,累计耗时:%s \n\n' % (count, timer(gap_time), timer(cumulative_time)))
  93.         start = end_time
  94.         count += 1


  95. if __name__ == '__main__':
  96.     begin_time = time.time()
  97.     main(begin_time)
  98.     finish_time = time.time()
  99.     total_time = finish_time - begin_time
  100.     print('全程结束后所需要时间是:%s' % timer(total_time))
复制代码



例如我们要下载《白袍总管》, 就在 https://m.sikushu.org/ 搜索上输入 白袍总管 找到此书后
1.jpg
2.jpg
3.jpg
4.jpg
5.jpg

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-4 01:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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