# -*- coding: utf-8 -*-
__author__ = "YuDian" from multiprocessing import Pool # Pool用来创建进程池
import os, time
from urllib import request # 访问网页
from bs4 import BeautifulSoup # 第三方库,能更好的对HTML进行解析 '''
基本思路:1.从一个盗版小说网站上得到一些小说的名字和对应的链接;
2.选定一本小说名,通过对应的链接得到小说的所有章节链接;
3.通过所有所有的章节链接通过对每个章节的网页进行分析,得到小说正文。分别存在不同的文档中(使用多进程)
4.将文档按顺序拼接,得到最终文档,删除中间文档。
''' def download(head, filename, ProNum, start, end, PageLinks): # 向函数传入请求头、文件名、进程序号、始末章节、章节链表
print(os.getpid()) # 打印该进程id
for page in range(start, end + 1):
PageUrl = PageLinks[page]
PageReq = request.Request(PageUrl, headers=head)
response = request.urlopen(PageReq)
PageHtml = BeautifulSoup(response, 'lxml') title = PageHtml.find('div', class_='entry-single').h1.string # 分析得到小说标题
print(title, 'is downloading...')
print(os.getpid())
if page == start:
f = open(filename + str(ProNum) + '.txt', 'w') # 小说名+进程序号作为文件名
f.write('\n' + title + '\n')
else:
f = open(filename + str(ProNum) + '.txt', 'a')
f.write('\n' + title + '\n')
text = PageHtml.find('div', id='booktext').children
for i in text:
if (i.find('div') == -1):
if len(i) > 1:
newstr = str(i).replace('\n', '').replace('\xa0', ' ').replace('\ue810', '').replace('\ue420',
'').replace(
'\ue2f0', '').replace('\ue0df', '') # 根据输出的情况手动将不能编码的字符进行转换
try: # 保证在遇到不能打印的字符时,程序能进行运行。
f.write(newstr)
except Exception as e:
print(e) # 第一步:从网站上得到所有的小说名字和对应链接 if __name__ == '__main__':
AllLinks = {} # AllLinks用来存放小说名称和对应链接
url = r'http://www.kushubao.com/xiaoshuodaquan/3.html' # 网站网址
HeadUrl = r'http://www.kushubao.com' # 因为从网址上爬到的小说链接只有后面的/xxxx所以要自己补全URL。
head = {} # 以浏览器的方式进行访问
head[
'User-Agent'] = 'Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19'
req = request.Request(url, headers=head)
response = request.urlopen(req) # 返回的response通过response.read().decode('uth-8')就可以输出网页的HTML
html = BeautifulSoup(response, 'lxml') # 将response变为BeautifulSoup能处理的对象
novellist = html.find(class_='novellist') # 定位到小说名和对应链接在的地方
novels = novellist.find_all('a') # 得到所有的小说名和链接在的HTML语句,.find_all()方法得到的是一个list
for novel in novels:
AllLinks[novel.string] = str(HeadUrl + novel.get('href')) # 第一步到这里结束。此时所有的小说名和对应的完整链接都存放在名为AllLinks的字典中。
#
# 第二步:通过指定小说名,从AllLinks中得到该小说的对应链接,然后下载所有的小说章节。 name = '神灵契约' # 指定的小说名称
NovelUrl = AllLinks[name]
NovelReq = request.Request(NovelUrl, headers=head)
PageLinks = [] # 列表,用来存放所有的小说章节链接。
# 不用字典的理由:因为元素在字典里面是无序排列的,在第三步要按顺序从低章到高章下载。所以直接用了一个list。反正章节名可以在没章里面搞到。
response = request.urlopen(NovelReq)
html = BeautifulSoup(response, 'lxml') # html 中放的就是有每章的名字和链接的BeautifulSoup对象。可以用html.pretty()进行查看
LinkTag = html.find('div', id='xslist')
PageList = LinkTag.find_all('a')
for page in PageList:
PageLinks.append(NovelUrl + page.get('href')) # 自此,第二步结束,得到的章节链接仿真了PageLinks的链表中。 # 第三步,多并程下载小说内容 ProcessNumber = 11 # 要开的进程数
p = Pool() # 创建进程池。由于参数缺省,默认为运行电脑的核数
StartTime = time.time() # 开始时间
StartPage = 0
for process in range(ProcessNumber): # 用来创建进程
if (process < ProcessNumber - 1):
EndPage = int(len(PageLinks) / ProcessNumber * (process + 1) - 1)
else:
EndPage = len(PageLinks) - 1
# 得到每个进程下载起始章节。
print('进程序号:', process + 1, '始末章节:%s--->%s' % (StartPage, EndPage))
p.apply_async(download, args=(head, name, process, StartPage, EndPage, PageLinks))
StartPage = EndPage + 1
p.close() # close和join要放到for循环外。
p.join()
EndTime = time.time()
print('Total run time=%.3f' % (EndTime - StartTime)) # 第三步结束。(download传入的参量太多了。) # 第4步:将所有分开的章节整合到一起,并删除临时章节。 wr = open(name + '.txt', 'w') # 最后存放的文件名
for i in range(ProcessNumber):
re = open(name + str(i) + '.txt', 'r')
lines = re.readlines()
wr.writelines(lines)
re.close()
wr.close()
# 文件合并完毕
for i in range(ProcessNumber):
try:
os.remove(name + str(i) + '.txt') # 移除文件
except Exception as e:
print('文件:', name + str(i) + '.txt', '无法删除')

从网上下载小说_keywords:python、multiprocess的更多相关文章

  1. 批量下载小说网站上的小说(python爬虫)

    随便说点什么 因为在学python,所有自然而然的就掉进了爬虫这个坑里,好吧,主要是因为我觉得爬虫比较酷,才入坑的. 想想看,你可以批量自动的采集互联网上海量的资料数据,是多么令人激动啊! 所以我就被 ...

  2. python爬虫之小说网站--下载小说(正则表达式)

    python爬虫之小说网站--下载小说(正则表达式) 思路: 1.找到要下载的小说首页,打开网页源代码进行分析(例:https://www.kanunu8.com/files/old/2011/244 ...

  3. 使用Python开发小说下载器,不再为下载小说而发愁 #华为云·寻找黑马程序员#

    需求分析 免费的小说网比较多,我看的比较多的是笔趣阁.这个网站基本收费的章节刚更新,它就能同步更新,简直不要太叼.既然要批量下载小说,肯定要分析这个网站了- 在搜索栏输入地址后,发送post请求获取数 ...

  4. 【Python 爬虫系列】从某网站下载小说《鬼吹灯》,正则解析html

    import re import urllib.request import urllib.parse import urllib.error as err import time # 下载 seed ...

  5. 自己封装的Windows7 64位旗舰版,微软官网上下载的Windows7原版镜像制作,绝对纯净版

    MSDN官网上下载的Windows7 64位 旗舰版原版镜像制作,绝对纯净版,无任何精简,不捆绑任何第三方软件.浏览器插件,不含任何木马.病毒等. 集成: 1.Office2010 2.DirectX ...

  6. 网上下载的CHM帮助文件打不开的解决办法。

    我的机器 装的是 Windows server 2008 操作系统.他的安全性比较高. 我在网上下载了一个 CHM 帮助文档.结果打不开. 现象: 打开时 ,提示 安全警告, 提示:来自Interne ...

  7. (原)下载pubFig的python代码

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5715305.html pubFig数据库网址: http://www.cs.columbia.edu/ ...

  8. AutoPy首页、文档和下载 - 跨平台的Python GUI工具包 - 开源中国社区

    AutoPy首页.文档和下载 - 跨平台的Python GUI工具包 - 开源中国社区 AutoPy是一个简单跨平台的 Python GUI工具包,可以控制鼠标,键盘,匹配颜色和屏幕上的位图.使用纯A ...

  9. 生成网上下载的EF项目对应的数据库

    生成网上下载的EF项目对应的数据库 网上下载的用EF做的小项目,结果没有配有数据库的,用VS打开来看了一下,看到Migrations文件夹,应该可以用EF命令来生成这个数据库了 打开appsettin ...

随机推荐

  1. docker 17.09.0-ce 启动更换网络地址

    一.环境准备 环境1 台虚拟机,系统为centos7 二.17.09.0-ce 安装 卸载安装的所有Docker组件 在 Docker17.03.0-ce 版本中,与在 Docker 1.12 中引入 ...

  2. ZT C/C++变量命名规则,个人习惯总结

    C/C++变量命名规则,个人习惯总结 (2012-10-31 13:48:10) 转载▼ 标签: c/c变量命名规则 c语言变量命名 c变量命名 规则规范 it 分类: C/VC C_C++变量命名规 ...

  3. Design Pattern: Gof

    Design Pattern: Gof 如果您学习设计模式(Design Pattern),看到Gof这个字,可不要呆呆的没有反应,Gof即Gang of four,也就是四人帮的意思,该设计模式名书 ...

  4. CXF+JAXB处理复杂数据

    CXF+JAXB处理复杂数据   CXF默认使用JAXB 来实现对象和XML之间的映射.在前面的例子 中,使用CXF发布的Webservice,其方法的参数和返回值都是简单类型. 本文讨论对象复杂性的 ...

  5. IDEA 常用插件收藏

    1.maven helper 查看maven依赖,解决jar包冲突. 2.Alibaba Java Coding Guidelines  代码风格遵循阿里java规范. 3.Lombok 简化实体中的 ...

  6. Linux磁盘管理.md

    df df 即“可用磁盘”disk free,用于显示文件系统的磁盘使用情况.默认情况下 df 命令将以每块 1K 的单位进行显示所有当前已挂载的文件系统,如果你想以人类易读的格式显示 df 命令的输 ...

  7. iOS开发中的Markdown渲染

    iOS开发中的Markdown渲染 BearyChat的消息是全面支持Markdown语法的,所以在开发BearyChat的iOS客户端的时候需要处理Markdown的渲染. 主要是两套实现方案: 直 ...

  8. 获取主机ip地址

    直接访问http://icanhazip.com

  9. PHP扩展模块redis安装

    PHP扩展redis模块安装 当我们安装好php之后可能会忘记装一些模块,或者需要增加模块的时候我们可以使用扩展模块安装. 查看php加载了哪些模块,使用命令 /usr/local/php/bin/p ...

  10. Luogu[P1108] 低价购买

    \(Link\) \(\mathcal{\color{red}{Description}}\) 请你求出一个数列的最长下降子序列长度,并为此求出其方案数. \[1 \leq N \leq 5000\] ...