1、python2.7
2、pycharm
3、奇书网:https://www.qisuu.com/
如上图,导航栏中的分类是包含奇书网的所有图书,打开其中一个分类
如上图,打开奇幻玄幻分类,在这个网页中,每一本书对应的是一本书
如上图,点开书名,进入相应的图书页
如上图,点开【TXT格式下载】会进入这个页面,这个页面也就是书本在奇书网的位置
一开始我以为获取奇书网的所有书本名,只有在把书本名替换【http://dzs.qisuu.com/从骑士到国王.txt】中的书本名就可以获取奇书网的所有书,但是。
想太多了,奇书网的书本放置名是一定遵循这个规则。
举个栗子:比如书本名【营养快线】,它的地址可能会是【http://dzs.qisuu.com/17.txt】
再举个例子:比如【青梅绿茶】,它的地址可能会是【http://dzs.qisuu.com/青梅绿茶.etxt】
再举个例子:比如【青梅绿茶】,他的作者是A,它的地址可能会是【http://dzs.qisuu.com/A.etxt】,但是这个地址打开什么都没有,吧A替换为青梅绿茶,进去,找到了
所以说这个替换的思路是不可行的
只能一个页面一个页面获取。打开首页,获取导航栏中的分类——>进入分类——>进入书本——>进入TXT下载
------------------------------------------------------------------------------------------------------------------------------------------------------
首页:https://www.qisuu.com/
奇幻玄幻分类页面:https://www.qisuu.com/soft/sort01/
武侠仙侠分类页面:https://www.qisuu.com/soft/sort02/
每个书本的页面:https://www.qisuu.com/36774.html
-------------------------------------------------------------------------------------------------------------------------------------------------------
在首页,使用浏览器,谷歌右键,检查【鼠标在分类栏更容易找到】,如下图:
format3 = formatHtml.find_all("div", r'nav')获得这些标签,但是标签中是有【首页】,我们并不需要是首页,可以看到首页的target是_self,而分类是_blank。
l=haf.find_all("a",target=re.compile("_blank")),获取正确的分类,但是我们只需要href字段的内容,l为一个集合,我们可以遍历集合中的每个元素,而这些元素是一个个标签,对于标签我们可以这样取值:
for i in l: Txturl= i["href"] //这个Txturl就是href中的内容【/soft/sort01/】 TXT_TYPE.append(Txturl) //一个集合保存这个数据备用
此时,TXT_TYPE这个集合就是所有的分类,首页地址+分类+index.html就是该分类的地址,【index.html】可以不使用,在一个分类中是有很多分页,分类的第一页是没有index.html。但是第二页为:https://www.qisuu.com/soft/sort01/index_2.html
,但是我这次是进首页后,获取所有的页面链接,就是不需要在这里进行每个分页的跳转,至进入首页就可以,所有index.html也已不用拼接
进入分类中,检查,如下图:
黑框中就是所有的小说的链接,任一打开:
黑框中是书本的链接,我们需要获取到这个值,在跟官网链接拼接,就能找到书
p=x.find_all("a"),这一步获取所有a标签,一下时代码,代码中我已添加注释,
#coding:utf-8
from bs4 import BeautifulSoup
import urllib
import re
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
frist_url = "https://www.qisuu.com/"
def getSoup(urlStr):
page = urllib.urlopen(urlStr)
html = page.read()
formatHtmlStr=BeautifulSoup(html)
return formatHtmlStr
#没有包需要先去安装
def getUrl():
TXT_TYPE = []
formatHtml = getSoup(str(frist_url))
format3 = formatHtml.find_all("div", r'nav')
for haf in format3:
l=haf.find_all("a",target=re.compile("_blank"))
for i in l:
Txturl= i["href"]
TXT_TYPE.append(Txturl)
return TXT_TYPE
def getLasturl():
urllist = []
for type1 in getUrl():
filename=str(type1).split("/")[2]
second_url=frist_url+type1+"index.html"
formatHtml = getSoup(str(second_url))
pp = formatHtml.find_all("select")
for ps in pp:
for o in ps:
typeurl=o["value"]
urllist.append(typeurl+"-"+filename)
return urllist
urllists=getLasturl()
num=1
for urlStr in urllists:
urls=str(urlStr).split("-")
if urls[1]=="sort01": #为了一会保存书的时候分目录
booktype="奇幻玄幻"
elif urls[1]=="sort02":
booktype = "武侠仙侠"
elif urls[1] == "sort03":
booktype = "女频言情"
elif urls[1] == "sort04":
booktype = "现代都市"
elif urls[1] == "sort05":
booktype = "历史军事"
elif urls[1] == "sort06":
booktype = "游戏竞技"
elif urls[1] == "sort07":
booktype = "科幻灵异"
elif urls[1] == "sort08":
booktype = "美文同人"
elif urls[1] == "sort09":
booktype = "剧本教程"
elif urls[1] == "sort010":
booktype = "名著杂志"
newurl=frist_url+urls[0]
lasthtml = getSoup(str(newurl))
booklist = lasthtml.find_all("div", 'listBox')
for x in booklist:
p=x.find_all("a")
st="《"
for i in p:
ht=i["href"]
lens=ht.split("/")
if len(lens)==2 and st in i.text:
bookname = i.text.split("《")[1].split("》")[0].decode("utf-8").replace("/","之")#有些书名中是包含“/”字符,不替换掉保存的时候回出错,/之前或解析成目录
lasturl=frist_url+ht
deephtml = getSoup(str(lasturl))
val =deephtml.find_all("a", 'downButton')#【图1】,代码下边补
print "val len:"+str(len(val))
if len(val)<3:
continue
try:
webus=val[1]["href"]#获取标签【图2】,代码下边补
writer = deephtml.find_all("li", 'small')[6].text.split(":")[1]#再次获取标签,在从所有标签的集合中去第七个,获取解释,【书籍作者:果的战斗】,切分去真正的作者名字
if writer in webus:#//如果作者名字在这个链接中
webut=webus.replace(writer,bookname)#第三个例子,如果【txt】下载进入的地址中的书名是作者名字,就替换为之前进入书本链接时的书名
else:
webut=webus
except:
print "this hive a Error"
continue
else:
if ".etxt" in webut:#避免第二个例子
deurl=webut.replace(".etxt",".txt")
elif ".txt" in webut:
deurl=webut
filename = "D:\\nov\\%s.txt" % (booktype+"\\"+bookname.decode("utf-8"))#拼接保存后的小说的目录和名字
print filename
try:
urllib.urlretrieve(deurl.encode('gb2312'), filename)#下载小说至D盘nov目录下的书本分类中
except:
print "urlretrieve hive a Error"
continue
print num
num += 1
print "--------------------------------"
书籍作者:果的战斗】,切分去真正的作者名字
if writer in webus:#//如果作者名字在这个链接中
webut=webus.replace(writer,bookname)#第三个例子,如果【txt】下载进入的地址中的书名是作者名字,就替换为之前进入书本链接时的书名
else:
webut=webus
except:
print "this hive a Error"
continue
else:
if ".etxt" in webut:#避免第二个例子
deurl=webut.replace(".etxt",".txt")
elif ".txt" in webut:
deurl=webut
filename = "D:\\nov\\%s.txt" % (booktype+"\\"+bookname.decode("utf-8"))#拼接保存后的小说的目录和名字
print filename
try:
urllib.urlretrieve(deurl.encode('gb2312'), filename)#下载小说至D盘nov目录下的书本分类中
except:
print "urlretrieve hive a Error"
continue
print num
num += 1
print "--------------------------------"
图1:
图2:
待优化:
1、try
2、多线程