笔下文学 python3 小说爬虫代码

import urllib.request

import re

from bs4 import BeautifulSoup

def urlopen(url):

    
    req = urllib.request.Request(url)

    req.add_header("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36")

    html = urllib.request.urlopen(req)

    html = html.read()

    return html


def txt_name(url):

    html = urlopen(url)

    html = html.decode('utf-8')

    htm = BeautifulSoup(html,'lxml')

    htm = htm.strong.string

    #第一个页面 小说名字获取

    return htm



def url_index(url):

    html = urlopen(url)

    html = html.decode('utf-8')

    htm = re.search(r'<a href="https://.*?/index.html"><img src="/images/dian.gif" border="0">',html)

    #这个 /images/dian.gif 有唯一性 所以我用正则表达式

    htm = htm.group()

    htm = BeautifulSoup(htm,'lxml')

    url = htm.a.attrs

    # 这一代html 代码拿到后就可以用 bs4 链接是a 然后a.attrs  这个方法会把链接变成一个字典 

    url = url['href']

    # href 这个字典的键就取得了小说列表链接

    return url

    #已经获取得小说index链接的列表地址

def url_one(url):

    con = urlopen(url)

    con = con.decode('utf-8')

    html = re.search(r'<dd><a href="\d*?.html">...*?</a></dd>',con)

    #这个内容的链接并没有按序排,但小说是一定需要按顺序排的 我找到第一个链接 然后按下一页的链接去获取

    #这样会很慢,但是我暂时没有其它办法

    html = html.group()

    html = BeautifulSoup(html,'lxml')

    url2 = html.a.attrs
    
    url2 = url2['href']

    url2 = url[:-10]+url2

    #这里获取到第一个链接的地址要加上页面地址才是一个完整的

    url = url2

    #获取第一章链接

    return url

def cont_list(url):

    html = urlopen(url)

    html = html.decode('utf-8')

    content = re.search(r'<a href=".*?\.html">下一页</a>',html)

    #这里就是开始访问第一个链接 然后找到里面的下一页链接

    content = content.group()

    htm = BeautifulSoup(content,'lxml')

    htm = htm.a.attrs

    htm = htm['href']

    url_2 = re.search (r'(https://www.bxwx9.org/.*?/.*?/.*?/)(.*?\.htm)',url)

    url_2 = url_2.group(1)

    url_2 = url_2+htm

    url = url_2

    #这里就是获取到的下一个链接

    #获取下一章链接

    return url




def contentlist(url):

    index = url_index(url)
    #这里获取小说列表的首页

    urlone = url_one(index)
    #这里是小说的第一章链接

    urllist = []

    #这里建个列表用来存小说链接 按先后顺序

    urllist.append(urlone)

    #这里先把第一个链接存进去

    while urlone != index:
        
        #这个循环的条件是如果下一页变成了小说列表页就退出因为最后一个页面是这样的

        urlone = cont_list(urlone)

        #这里每次循环就把urlone 改变成为下一个链接

        urllist.append(urlone)

        #这样就把获取到的链接存起来,这样就把所有的链接按顺序都存好了

        print(urlone)

    return urllist
        
def xia(url):

    name = txt_name(url)

    name = name+'.txt'

    list1 = contentlist(url)

    #现在找到所有的链接了就可以下载内容了

    for i in list1[:-1]:
        #这里写的是list1[:-1]就是不要最后一个链接 因为最后一个链接是小说列表页

        html = urlopen(i)

        #这里获取到小说内容页

        html = html.decode('utf-8')

        title = html

        title = BeautifulSoup(title,'lxml')

        #然后找到说小的标题

        title = title.find_all(id="title")

        #这返回的是一个列表所以要取出来

        title = title[0]

        title = title.string
        #title.string 这就只取字符串 这是内容标题

        htm = re.search(r'(<div id="adright"></div>)(.*?)(</div>)',html)

        htm = htm.group(2)

        #然后找内容  用正则吧  bs4 没有那么熟悉

        htm = BeautifulSoup(htm,'lxml')

        htm = htm.text

        #text 就是里面的内容

        aa = re.compile('\xa0')

        #然后取掉不能解码的内容

        content_htm = re.sub(aa,'',htm)

        #这就是小说的正文了

        with open(name,'a')as f:
            #然后打开方式用a是追加模式 可以写了一次再写一次
             
            f.write(title)
            #先写标题

            f.write(content_htm)
            #再写内容

        print(i)
        #输入写入的链接 为了方便看哈

        #cotnent_htm这是内容

url = 'https://www.bxwx9.org/binfo/5/5740.htm'

xia(url)




    
    


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值