当前位置:   article > 正文

用 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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

(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)
  • 1
  • 2
  • 3
  • 4

(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)
  • 1
  • 2
  • 3
  • 4

(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
  • 1
  • 2
  • 3
  • 4
  • 5

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

for i in range(1, len(context)):
    f.write(context[i] + '\n')
  • 1
  • 2
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/825097
推荐阅读
相关标签
  

闽ICP备14008679号