用 Python 爬取网页小说

参考博客:完全小白篇-使用Python爬取网络小说

1 完整代码

import requests
import re
from bs4 import BeautifulSoup
# from docx import Document


#创建正则表达式对象,r是为了避免对'/'的错误解析
findTitle = re.compile(r'<h1>(.*?)</h1>',re.S)
findContext = re.compile(r'<p>(.*?)</p>',re.S)

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36'}


# 输入小说第一章网址
def getNovel(url, f):
    # 存放下一章的链接
    link = url
    # 最后一章中,点击“下一章”会回到目录
    while(link != "http://yk360.kekikc.xyz/413/"):
        # 获取网页源码
        data = requests.get(url = link, headers = headers)
        #上文我们已经看到是UTF-8的编码格式,这里照搬按此解析即可
        data.encoding = 'UTF-8'
	    #解析得到网站的信息
        soup = BeautifulSoup(data.text, 'html.parser')
        # print(soup)

        # 提取章节名
        for item in soup.find_all('div', class_="m-title col-md-12"):
            item = str(item)
            title = re.findall(findTitle, item)[0]
            print(title)
            f.write(title + '\n')
        # 提取章节内容
        for item in soup.find_all('div',id="content"):
            item = str(item)
            context = re.findall(findContext, item)
            for i in range(1, len(context)):
                f.write(context[i] + '\n')
            f.write('\n\n')
            # print(context)
            # print(len(context))

        # 跳转到下一章
        for item in soup.find_all('li', class_="col-md-4 col-xs-12 col-sm-12"):
            nextChp = item.find_all('a')
            tmpLink = nextChp[0].get('href')
            # print(tmpLink)
            link = "http://yk360.kekikc.xyz" + tmpLink



#小说第一章的网址
baseurl = "http://yk360.kekikc.xyz/413/57269.html"
with open("output.txt", "w") as f:
    getNovel(baseurl, f)

2 分析小说第一章的网页

http://yk360.kekikc.xyz/413/57269.html 为例
(1)查看网页编码格式,在 head 标签里能找到
在这里插入图片描述

(2)查看章节名存放位置
在这里插入图片描述

(3)查看章节内容存放位置
在这里插入图片描述

(4)查看各章节间的跳转关系,最后一章的下一章是列表页面
在这里插入图片描述

3 代码实现

(1)获取网页源码
设置 requests.get() 中的 headers 参数,用来模拟浏览器进行访问

# 获取网页源码
data = requests.get(url = link, headers = headers)
#上文我们已经看到是UTF-8的编码格式,这里照搬按此解析即可
data.encoding = 'UTF-8'
#解析得到网站的信息
soup = BeautifulSoup(data.text, 'html.parser')
print(soup)

(2)提取章节名
章节名存放在 class 为 m-title col-md-12 的 div 中的 h1 标签里,采用正则提取 findTitle = re.compile(r'<h1>(.*?)</h1>',re.S)

for item in soup.find_all('div', class_="m-title col-md-12"):
    item = str(item)
    title = re.findall(findTitle, item)[0]
    print(title)

(3)提取章节内容
章节内容存放在 id 为 content 的 div 中的 p 标签里,采用正则提取 findContext = re.compile(r'<p>(.*?)</p>',re.S)

for item in soup.find_all('div',id="content"):
    item = str(item)
    context = re.findall(findContext, item)
    print(context)

(4)跳转到下一章
下一章链接存放在 class 为 col-md-4 col-xs-12 col-sm-12 的 li 中的 a 标签里

for item in soup.find_all('li', class_="col-md-4 col-xs-12 col-sm-12"):
    nextChp = item.find_all('a')
    tmpLink = nextChp[0].get('href')
    print(tmpLink)
    link = "http://yk360.kekikc.xyz" + tmpLink

(5)将提取内容存入 TXT 文档中,其中需要注意存放章节内容时,第一个 p 标签内容为广告,需要跳过(所有的 p 标签内容按顺序存入 context 数组中,context 长度等于 p 标签个数)

for i in range(1, len(context)):
    f.write(context[i] + '\n')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值