from urllib.request import quote
import urllib.request
from bs4 import BeautifulSoup
import re
import multiprocessing
import os
import time
def start():
for txt in range(0, 999):
start = int(input("请输入开始章节(从1开始):"))-1
if start < 0 or start > len(chapter_link)-1:
print("开始章节错误,请重新输入")
else:
break
return start
def end():
for txt in range(0, 999):
end = int(input("请输入最后章节(最大为总章节数):"))-1
if end < 0 or end > len(chapter_link)-1:
print("结束章节错误,请重新输入")
else:
break
return end
def all():
filter_chapter_link = r'<a href="(.+?)">.+?</a>'
book_txt = str(soup.find_all(name="a", attrs={"href": re.compile(r"/\w+/\w+.html")}))
chapter_link_1 = re.findall(filter_chapter_link, book_txt) # 链接
chapter_link_2 = "http://www.x23us.us" + " http://www.x23us.us".join(chapter_link_1)
chapter_link = chapter_link_2.split(' ')
name=soup.h1.string
return chapter_link,name
def chapter():
links=[]
i=0
for link_chapter in range(start,end+1):
links.append(chapter_link[start+i])
i=i+1
return links
def mkdir(path):
floder=os.path.exists(path)
if not floder:
os.makedirs(path)
print("创建成功")
else:
print("文件已存在")
def remadir():
img_path2 = "E:/txt/" + name
if not os.path.exists(img_path2):
os.rename(img_path, img_path2)
print("已全部下载完成!")
else:
downloadtime = time.strftime("%Y%m%d%I%M%S", time.localtime())
os.rename(img_path, img_path2 + downloadtime)
print("已全部下载完成!\n"+"文件名:" +name + " 已存在,重命名为:" + name+ downloadtime + "\n" + "请勿重复操作")
def download(url):
req = urllib.request.Request(url) # 请求链接
req.add_header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0'} # 添加数据头
page = urllib.request.urlopen(req).read()
html = page.decode('gbk')
soup = BeautifulSoup(html, "html.parser")
book_txt = soup.find_all(name="div", attrs={"id": "content"})
txt = soup.find_all(name="h1")
name=re.sub(r'<h1>|</h1>|\|/|<|>|:|\?|\*|"|\|', '',str(txt[0]))
filter_order = r'http://www.x23us.us/.+?/(.+?).html'
order = re.findall(filter_order, url)[0]
book = name+"\n"+(
re.sub(r'<div id="content" name="content">|</div>|<br/>\n<br/>| |\n', '', str(book_txt[0]))).strip()+"\n\n" # 对过滤和编辑
f = open("E:/txt/txt/" + order+".txt", "a") # a代表追加模式,不覆盖
f.write(book.encode('gbk', 'ignore').decode('gbk'))
f.close()
print(name+"下载完成")
def change():
txtname = os.listdir("E:/txt/"+name+"/")
i = 0
txts = []
for txt in range(0, len(txtname)):
a = "E:/txt/"+name+"/"+txtname[i]
f1 = open(a, "r")
lines = f1.readlines()
o= "\n" + "".join(lines)
txts.append(o)
f1.close()
os.remove(a)
i = i + 1
txts1 = "".join(txts)
g = open("E:/txt/"+name+"/"+name+".txt", "a")
g.write(txts1)
g.close()
if __name__ == '__main__':
for txt in range(0, 999):
a = quote(input("请输入书名(精确):").encode('GBK')) # 接受一个值,编码为GBK,再转换为url编码 (顶点的编码为GBK,UTF-8和GBK的url编码不一样)
if len(a) > 1:
url = "http://www.x23us.us/modules/article/search.php?searchkey=" + a # 搜索的链接
req = urllib.request.Request(url) # 请求链接
req.add_header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0'} # 添加数据头
page = urllib.request.urlopen(req).read() # 打开链接,并读取
html = page.decode('gbk') # 顶点编码为gbk,把显示的内容转换为gbk编码
soup = BeautifulSoup(html, "html.parser")
b = len(soup.find_all(name="div", attrs={"class": "layout"}))
if b == 0:
print("搜索成功")
break
else:
print("无结果,请重新输入!")
else:
print("请输入至少2个字符长度!")
chapter_link=all()[0]
name=all()[1]
print("一共有" + str(len(chapter_link)) + "章")
start=start()
end=end()
img_path = "E:/txt/txt/"
mkdir(img_path)
links = chapter()
pool = multiprocessing.Pool(processes=10)
pool.map(download, links)
pool.close()
pool.join()
remadir()
change()
time.sleep(5)
- python 全栈开发,Day137(爬虫系列之第4章-scrapy框架)
一.scrapy框架简介 1. 介绍 Scrapy一个开源和协作的框架,其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的,使用它可以以快速.简单.可扩展的方式从网站中提取所需的数据.但目前S ...
- 【Python爬虫实战】多线程爬虫---糗事百科段子爬取
多线程爬虫:即程序中的某些程序段并行执行,合理地设置多线程,可以让爬虫效率更高糗事百科段子普通爬虫和多线程爬虫分析该网址链接得出:https://www.qiushibaike.com/8hr/pag ...
- python 全栈开发,Day135(爬虫系列之第2章-BS和Xpath模块)
一.BeautifulSoup 1. 简介 简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: ''' Beautiful Soup提供一些简单 ...
- python 全栈开发,Day134(爬虫系列之第1章-requests模块)
一.爬虫系列之第1章-requests模块 爬虫简介 概述 近年来,随着网络应用的逐渐扩展和深入,如何高效的获取网上数据成为了无数公司和个人的追求,在大数据时代,谁掌握了更多的数据,谁就可以获得更高的 ...
- python 全栈开发,Day136(爬虫系列之第3章-Selenium模块)
一.Selenium 简介 selenium最初是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动浏览器,完全 ...
- Python爬虫开发:反爬虫措施以及爬虫编写注意事项
- Python 之糗事百科多线程爬虫案例
import requests from lxml import etree import json import threading import queue # 采集html类 class Get ...
- python运维开发(十七)----jQuery续(示例)web框架django
内容目录: jQuery示例 前端插件 web框架 Django框架 jQuery示例 dom事件绑定,dom绑定在form表单提交按钮地方都会绑定一个onclick事件,所有查看网站的人都能看到代码 ...
- Java 多线程爬虫及分布式爬虫架构探索
这是 Java 爬虫系列博文的第五篇,在上一篇 Java 爬虫服务器被屏蔽,不要慌,咱们换一台服务器 中,我们简单的聊反爬虫策略和反反爬虫方法,主要针对的是 IP 被封及其对应办法.前面几篇文章我们把 ...
随机推荐
- Linux环境下安装nginx
#一般我们都需要先装pcre, zlib,前者为了重写rewrite,后者为了gzip压缩cd /usr/local/devmkdir nginxcd nginxmkdir softcd soft # ...
- 使用Python画一个带坐标轴的圆
Download Microsoft Visual Studio Microsoft Visual Studio enables you develop your python Application ...
- Flash Alternativa 3D引擎-基础理论
自由行走的花 网站设计,flash网站设计与动画制作,web,as3 2010-12-31 14:29 [转]Flash Alternativa 3D引擎-基础理论 <本文转载自:http:// ...
- QWaiteCondition思考4
引用 http://blog.csdn.net/flyoxs/article/details/54617342 简单用法 QWaitCondition 用于多线程的同步,一个线程调用QWaitCond ...
- 2.ReactJS基础(虚拟DOM,JSX语法)
将脚手架(create-react-app)创建的todolist项目精简为hello world示例 即,删除自动生成的样式文件.logo.svt.App.test.js.serviceWorker ...
- matlab 曲线拟合小记
在matlab中经常需要对数据进行曲线拟合,如最常见的多项式拟合,一般可以通过cftool调用曲线拟合工具(curve fit tool),通过图形界面可以很方便的进行曲线拟合,但是有些时候也会遇到不 ...
- linux配置服务器
梳理一下这次配置服务器的思路. 1,挂载磁盘 Java和neigx上传到根目录下,tomcat放在data目录下,数据库新建文件夹也在data下, 2,配置环境变量 3,nginx修改域名 4,数据库 ...
- Codeforces 1105B:Zuhair and Strings(字符串水题)
time limit per test: 1 second memory limit per test: 256 megabytes input: standard input output: sta ...
- Spring ConditionalOnProperty
Spring Annotation @ConditionalOnProperty spring doc解释 @Conditional: Indicates that a component is on ...
- Python的内置方法——补充
七 __setitem__,__getitem__,__delitem__ class Foo: def __init__(self,name): self.name=name def __getit ...