爬取《茅山后裔》小说

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Yk_0311/article/details/82986931

以前看过这小说,觉得写得很不错,所以觉得自己将其爬取下来

爬取的思路

1

先找到资源页:https://www.88dus.com/xiaoshuo/0/801/
然后你可以看到所有章节
右击并选择检查项,选择Elements选项卡
你可以发现所有章节的信息都在
在这里插入图片描述
如图所示的标签下
我利用了CSS选择器将其选择出来,并提取章节的名称和url

2

将提取出的url加在https://www.88dus.com/xiaoshuo/0/801/后面,这样就可以访问到每一个章节,最后再将文本提取出来保存
爬取的代码

'''
爬取《茅山后裔小说》
资源页:https://www.88dus.com/xiaoshuo/0/801/
'''

import requests
from bs4 import BeautifulSoup
import time


def get_html(url):
    hd = {'User-Agent': 'Mozilla/5.0'}  # 模拟浏览器进行访问
    r = requests.get(url, headers=hd)
    r.raise_for_status()  # 抛出异常
    r.encoding = r.apparent_encoding
    # print(r.text)
    return r.text


def get_partURL(html, MList):
    '''
    function:从页面中获得部分url
    :param html:
    :param MList: 存储url和章节名称的列表
    :return:
    '''
    soup = BeautifulSoup(html, 'html.parser')
    TagList = soup.select('div.mulu ul li a')  # 利用CSS选择器得到存储信息的标签
    for tag in TagList:
        MList.append([tag['href'], tag.string])  # 将url添加到列表当中


def get_text(item):
    '''
    获得文本信息
    :param item:MList中的一个单元
    :return:章节的文本信息
    '''
    url = 'https://www.88dus.com/xiaoshuo/0/801/' + item[0]  # 组成完整的链接,是一个章节的链接
    html = get_html(url)
    soup = BeautifulSoup(html, 'html.parser')
    text = str(soup.select('div.yd_text2')[0])  # 找到标签然后转换为文本
    text = text.replace('<div class="yd_text2">', '').replace("<br/>", "").replace('</div>', 'end')  # 替换字符串
    text = item[1] + '\n' + text  # 将章节的名称加上
    return text


def save(text):
    '''
    function:保存为txt文件
    :param text: 文本信息
    :return:
    '''
    path = 'D:\IDE\Pycharm\MySpider\DEMO1\\《茅山后裔》.txt'
    with open(path, 'a', encoding='utf-8') as f:
        f.write(text + '\n')


def main():
    MList = []
    url = 'https://www.88dus.com/xiaoshuo/0/801/'  # 资源页
    html = get_html(url)  # 获得资源页的HTML
    get_partURL(html, MList)  # 解析页面得到url与章节的名称,并存入MList
    allamount = len(MList)  # 用来实现进度
    num = 0
    for item in MList:  # 遍历其中的单元
        try:
            text = get_text(item)  # 获得文本文件
            save(text)  # 保存
            num = num + 1
            print('进度:{}%'.format(round(num * 100 / allamount)))
            time.sleep(1)  # 爬取的速度限制一下,不要给网页太大的压力
        except:
            continue


main()

最后main()函数中的异常处理,是因为访问某些章节可能会不成功,所以except中进行了跳过异常。

爬取下的文本放在了github上
链接:https://github.com/YilK/Web-Crawler/blob/master/DEMO02-《茅山后裔》小说的爬取/《茅山后裔》.txt

猜你喜欢

转载自blog.csdn.net/Yk_0311/article/details/82986931