python爬取奇书网小说

来源:互联网 发布:主机名和域名的区别 编辑:程序博客网 时间:2024/05/02 03:17

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-8from bs4 import BeautifulSoupimport urllibimport reimport 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_TYPEdef 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 urllisturllists=getLasturl()num=1for 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 "--------------------------------"

图1:



图2:



待优化:

1、try

2、多线程