欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用python3爬取你喜欢的小说

程序员文章站 2024-03-18 09:59:52
...

运行代码之前需要安装几个模块和一个浏览器:
1、requests请求库
2、BeautifulSoup解析库
3、selenium自动化模块
4、Firefox火狐浏览器
5、selenium的火狐浏览器插件
具体安装方法度娘有教程。

import requests
from bs4 import BeautifulSoup
import time
import random
import os
import re
from selenium import webdriver
from selenium.webdriver.common.keys import Keys


def search(home_url, inputs):
    '''功能:(搜索)'''
    '''两个参数分别是:
    1、要爬取的小说url
    2、获取用户输入的小说名
    '''
    driver = webdriver.Firefox()
    driver.get(home_url)
    elem = driver.find_element_by_name("searchkey")
    elem.send_keys(inputs)  # 在输入框输入元素
    elem.send_keys(Keys.RETURN)  # 这个类似于模拟按键,Keys.RETURN参数是按回车键
    time.sleep(5)
    soup = BeautifulSoup(driver.page_source, 'lxml')
    driver.quit()
    try:
        if soup.find(class_='xxcont'):
            # 判断只有一部小说
            new_soup = soup.find(class_='btn-section-all').get('href')
            re_soup = re.search(r'\d{1,10}', new_soup).group()  # 提取url中间的数字
            return re_soup  # 返回url中间的那几个数字
        elif soup.find(class_='blocktitle').string == '出现错误!':
            # 判断是否输入错误
            return '搜索错误,可能没有该小说!'
    except:
        # 判断查到多部小说,选出指定一部
        if soup.select('.tit'):
            # print(soup.find(class_='tit').get_text().strip())  # 搜索到的结果
            for i in soup.select('h3.text-overflow a'):
                if i.get_text() in inputs:
                    re_soup = re.search(r'\d{1,10}', i.get('href')).group()
                    return re_soup  # 返回url中间的那几个数字
        else:
            return '未知错误,或请重新启动。。。!'


def request(url, headers):
    '''功能:(请求访问并返回text)'''
    '''两个参数分别是:
    1、要访问的url
    2、响应头
    '''
    r = requests.get(url, headers=headers)
    r.encoding = r.apparent_encoding
    if r.status_code == 200:
        return r.text
    return '请求访问失败!', r.status_code


def soup_request(_text, home_url):
    '''功能:(提取:书名和作者,各章节的url,章节名。)'''
    '''两个参数分别是:
    1、通过请求返回的源代码,注:字符串格式
    2、首页的url
    '''
    soup = BeautifulSoup(_text, 'lxml')
    title_author = soup.find(id='article-title').get_text().strip()  # 书名和作者
    title_author = re.sub(r'\n', ',', title_author)
    url_a_href = [home_url + i.get('href') for i in soup.select('#section-list > li > a')]  # 各章节的url
    url_title = [i.get_text() for i in soup.select('#section-list > li > a')]  # 章节名
    return title_author, url_a_href, url_title


def new_url(_text, home_url):
    '''功能:(获取下一页URL)'''
    '''两个参数分别是:
    1、通过请求返回的源代码,注:字符串格式
    2、首页的url
    '''
    soup = BeautifulSoup(_text, 'lxml')
    new_url = home_url + soup.find(class_='next').get('href')  # 获取下一页
    return new_url


def book_text(url, headers, home_url):
    '''功能:(提取章节里面的小说内容)'''
    '''三个参数分别是:
    1、要爬取的小说url
    2、响应头
    3、小说网址首页的url
    '''
    _text = ''
    urlnew = url
    while True:
        qingqiu = request(urlnew, headers)  # 请求url,并返回text
        soup = BeautifulSoup(qingqiu, 'lxml')
        text = soup.find(class_='size_1').get_text()
        _text += text
        if soup.find(id='nextChapterBtn').get_text() == '下一页':
            # 判断当前章节是否还有下一页
            new = soup.find(id='nextChapterBtn')
            urlnew = home_url + new.get('href')
            time.sleep(random.randint(1, 3))
        else:
            return _text


def preservation(url, headers, home_url, wenjian):
    '''功能:(储存数据)'''
    '''四个参数分别是:
    1、要爬取的小说url
    2、响应头
    3、小说网页首页的url
    4、文件夹'''
    a = 1  # 因为怕小说的章节名有时候不符合文件名的命名规则而报错,所以用a来代替章节
    while True:
        qingqiu = request(url, headers)  # 请求url,并返回text
        title, url, url_title = soup_request(qingqiu, home_url)
        # 判断是否有该小说名文件夹
        if os.path.exists(wenjian + title):
            pass
        else:
            os.mkdir(wenjian + title)

        for j, i in zip(url, url_title):
            book_t = book_text(j, headers, home_url)
            with open(wenjian + title + '/第' + str(a) + '章.txt', 'w', encoding='utf-8') as f:
                f.write(i)
                f.write(book_t)
            a += 1
            print(i)
            print('*' * 50)
        url = new_url(qingqiu, home_url)  # 提取下一页链接,直接覆盖原有的链接
        return '完成!'


def main():
    while True:
        headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36'}
        print('请输入小说名:(请输入准确书名,不支持模糊搜索。)')
        input_search = input('>>')
        wenjian = 'D:/IT/临时/'
        home_url = 'https://www.laiyetxt.com'  # 首页
        seasea = search(home_url, str(input_search))
        if re.match(r"\d{1,10}", str(seasea)) != None:
            url = home_url + '/mulu/' + str(seasea) + '_1.html'  # 小说网址
            if url:
                print(url)
                find =  input('已找到搜索结果,是否下载:(y/n)')
                if find == 'y':
                    prv = preservation(url, headers, home_url, wenjian)
                elif find == 'n':
                    pass
                else:
                    print('输入错误,正在退出程序。。。')
                    exit()
        else:
            print(seasea)


if __name__ == '__main__':
    main()

来看看执行结果:
使用python3爬取你喜欢的小说使用python3爬取你喜欢的小说使用python3爬取你喜欢的小说打开文件夹看看
使用python3爬取你喜欢的小说使用python3爬取你喜欢的小说使用python3爬取你喜欢的小说等待下载完成,你就能无广告的看小说啦

注:如有侵犯网站权的,请告知小编,小编立即删除当前文章。

相关标签: python爬虫

上一篇: HBase分布式环境安装部署

下一篇: