使用python,爬取网站小说

目标

  • 将网站上的小说,保存到本地为txt文件

准备

  1. 安装python,cmd 指令窗口输入python --version 则安装成功
  2. 安装额外的库,需要用到以下库 requests,bs4。cmd 指令窗口输入pip install requests,pip install bs4。即可安装。
  3. 获取你要爬取小说的网站,具体到章节目录。
  4. 获取章节目录网站的请求标头,当你打开网站是按下F12,调出开发者模式,选择网络,点击全部,选择最上面这个,便可以找到当前网页的请求标头了,这可以看到常规的一些数据
    在这里插入图片描述

代码

import requests
from bs4 import BeautifulSoup
import os
import time
 
# 获取方式F12-》网络-》全部-》选择第一个-》翻到下面找到请求标头
#请求标头,可以填写部分参数
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
}
main_url = 'https://www.51shucheng.net/wangluo/jianwangchao'


# 把打开网页获取页面的步骤写成函数
def open_page(url):
    """
    html: url地址
    return : html的page页面
    """
    html = requests.get(url, headers=headers)
    #网站字体格式,可以在当前网页查看
    html.encoding = 'utf-8'
    html = html.text
    
    return html
 
# 把构建soup找到页面对应内容的步骤写成函数
def find_content(html, selector, class_):
    """
    html: 网页page页面
    selector: 对应的页面元素
    class_: 对应类名
    return : 想要的页面内容
    """
    soup = BeautifulSoup(html, features='lxml')
    wanted_content = soup.find_all(selector, class_=class_)
    
    return wanted_content
 
# 把小说内容写入文件中
def write_content(name, chapter_name, content):
    """
    name: 小说名称
    chapter_name: 章节名称
    content: 章节内容
    """
    
    # 如果小说的目录不存在,则创建目录;如果存在则删除重建一个
    path = os.path.join(f"./{name}")
    if os.path.exists(path):
        file = os.path.join(path, f"{chapter_name + '.txt'}")
        print(file)
        with open(file, 'w', encoding='utf-8') as f:
            f.write(content)
    else:
        os.mkdir(path)
        file = os.path.join(path, f"{chapter_name + '.txt'}")
        print(file)
        with open(file, 'w', encoding='utf-8') as f:
            f.write(content)
 
# 获取网页
main_html = open_page(main_url)
 
# 获得每部小说的url, "div"+"xxxx"为你要的类下内容
fictions = find_content(main_html, "div", "mulu-list")  #每章节名称
fiction_names = find_content(main_html, 'div', 'mulu-title')    # 每部小说的名称
fiction_urls = []    # 以列表形式存储小说第几部,第几部的名称,第几章,章节名称
 
for i in range(len(fictions)):
    urls = fictions[i].find_all("a")
    name = fiction_names[i].text    #如果只有一部小说,name可以直接命名
    for j in range(len(urls)):
        url, title = urls[j]['href'], urls[j].text  #url拼接成具体小说页的网站
        fiction_urls.append([i + 1, name, title, url])
 
# 获取每章节的内容
for i in range(len(fiction_urls)):
    num = fiction_urls[i][0] 
    name = fiction_urls[i][1]
    title = fiction_urls[i][2]    # 章节名称
    print(f"{'*'*5}开始第{num}部小说《{name}》的  {title}  爬取{'*'*5}")
    #打开具体章节页
    html = open_page(fiction_urls[i][3])
    content = find_content(html, "div", 'neirong')[0].text #获取具体章节页的小说内容
    write_content(name, title, content)
    time.sleep(num)
    
  • 这里说明以下find_content函数中的第三个参数,需要你在网页中去找到你要的具体参数填写。这很关键,只有选择对的
    才能得到你想要的效果。