从网上下载小说_keywords:python、multiprocess
# -*- 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的更多相关文章
- 批量下载小说网站上的小说(python爬虫)
随便说点什么 因为在学python,所有自然而然的就掉进了爬虫这个坑里,好吧,主要是因为我觉得爬虫比较酷,才入坑的. 想想看,你可以批量自动的采集互联网上海量的资料数据,是多么令人激动啊! 所以我就被 ...
- python爬虫之小说网站--下载小说(正则表达式)
python爬虫之小说网站--下载小说(正则表达式) 思路: 1.找到要下载的小说首页,打开网页源代码进行分析(例:https://www.kanunu8.com/files/old/2011/244 ...
- 使用Python开发小说下载器,不再为下载小说而发愁 #华为云·寻找黑马程序员#
需求分析 免费的小说网比较多,我看的比较多的是笔趣阁.这个网站基本收费的章节刚更新,它就能同步更新,简直不要太叼.既然要批量下载小说,肯定要分析这个网站了- 在搜索栏输入地址后,发送post请求获取数 ...
- 【Python 爬虫系列】从某网站下载小说《鬼吹灯》,正则解析html
import re import urllib.request import urllib.parse import urllib.error as err import time # 下载 seed ...
- 自己封装的Windows7 64位旗舰版,微软官网上下载的Windows7原版镜像制作,绝对纯净版
MSDN官网上下载的Windows7 64位 旗舰版原版镜像制作,绝对纯净版,无任何精简,不捆绑任何第三方软件.浏览器插件,不含任何木马.病毒等. 集成: 1.Office2010 2.DirectX ...
- 网上下载的CHM帮助文件打不开的解决办法。
我的机器 装的是 Windows server 2008 操作系统.他的安全性比较高. 我在网上下载了一个 CHM 帮助文档.结果打不开. 现象: 打开时 ,提示 安全警告, 提示:来自Interne ...
- (原)下载pubFig的python代码
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5715305.html pubFig数据库网址: http://www.cs.columbia.edu/ ...
- AutoPy首页、文档和下载 - 跨平台的Python GUI工具包 - 开源中国社区
AutoPy首页.文档和下载 - 跨平台的Python GUI工具包 - 开源中国社区 AutoPy是一个简单跨平台的 Python GUI工具包,可以控制鼠标,键盘,匹配颜色和屏幕上的位图.使用纯A ...
- 生成网上下载的EF项目对应的数据库
生成网上下载的EF项目对应的数据库 网上下载的用EF做的小项目,结果没有配有数据库的,用VS打开来看了一下,看到Migrations文件夹,应该可以用EF命令来生成这个数据库了 打开appsettin ...
随机推荐
- [DBSDFZOJ 多校联训] 就
就 背景描述 一排 N 个数, 第 i 个数是 Ai , 你要找出 K 个不相邻的数, 使得他们的和最大. 请求出这个最大和. 输入格式 第一行两个整数 N 和 K. 接下来一行 N 个整数, 第 i ...
- 中间人攻击利用框架bettercap测试
0x00前言 上篇提到内网渗透很有趣,这次就从一款新工具说起: bettercap 0x01简介 bettercap可用来实现各种中间人攻击,模块化,便携.易扩展 0x02特点 提到中间人攻击,最知名 ...
- Android App 注射&&Drozer Use
x01 准备工作 测试环境: 1) 手机root权限 2) Adb.exe 3) 手机usb连接开启debug模式(在设置>关于手机>连续点击多次版本号,即可开启开发者模式) 4) Win ...
- Alpha Scrum7
Alpha Scrum7 牛肉面不要牛肉不要面 Alpha项目冲刺(团队作业5) 各个成员在 Alpha 阶段认领的任务 林志松:项目发布 陈远军.陈彬:播放器各环境的测试 项目的发布说明 本版本的新 ...
- 1067. [SCOI2007]降雨量【线段树】
Description 我们常常会说这样的话:“X年是自Y年以来降雨量最多的”.它的含义是X年的降雨量不超过Y年,且对于任意 Y<Z<X,Z年的降雨量严格小于X年.例如2002,2003, ...
- POJ1039 Pipe
嘟嘟嘟 大致题意:按顺序给出\(n\)个拐点表示一个管道,注意这些点是管道的上端点,下端点是对应的\((x_i, y_i - 1)\).从管道口射进一束光,问能达到最远的位置的横坐标.若穿过管道,输出 ...
- SpringBoot实战(二)之计划任务
计划任务这个对于Java开发者们,应该不陌生了,非常常用又非常常见.比如jdk自带的Timer 实现例子如下: class MyTask extends TimerTask{ @Override pu ...
- mysql5.6编译安装
1.安装编译源码所需的工具和库 yum install gcc gcc-c++ ncurses-devel perl -y yum -y install wget gcc-c++ ncurses nc ...
- maven 编译替换占位符
首先开启资源配置的插件,由此插件替换占位符 <plugin> <groupId>org.apache.maven.plugins</groupId> <art ...
- PAT——1031. 查验身份证
一个合法的身份证号码由17位地区.日期编号和顺序编号加1位校验码组成.校验码的计算规则如下: 首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8, ...