python爬取奇书网小说

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、多线程

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一天两晒网

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值