爬取小说案例-BeautifulSoup教学篇

前言

当我们进行爬取各种资源,拿到源码进行解析数据的时候,会用到各种解析方式,本文介绍的爬取小说的一个案例,使用比较受欢迎的python第三方库BeautifuSoup来进行解析数据。

导航

BeautifulSoup

BeautifulSoup介绍

BeautifulSoup 是一个用于从 HTML 和 XML 文件中提取数据的 Python 库。它提供了一些简单的函数用来处理导航、搜索、修改分析树等功能。它能够帮助开发者高效地从网页等结构化文档中抓取和解析信息,比如提取网页中的文本、链接、图片等各种元素。

BeautifulSoup的使用

BeautifulSoup不是python标准库的一部分,因此需要在终端使用pip命令单独安装。此外,BeautifulSoup支持多种解析器,包括Python标准库中的HTML解析器、lxml HTML解析器以及html5lib等,我们常用的就是lxml Html解析器,这些解析其也需要单独安装。

bash 复制代码
pip install beautifulsoup4
pip install lxml

BeautifulSoup的使用一般包含四个步骤

1. 导入库

python 复制代码
from bs4 import BeautifulSoup
import requests # 数据请求模块

2. 实例化对象

python 复制代码
url='http://xxx.com'
response=requests.get(url=url)
soup=BeautifulSoup(response.text,'lxml')

3. 提取数据

提取数据方式分为很多种,其中find(),find_all()方法进行查找数据比较常见,find()函数用于查找单个元素,而find_all()函数用于查找多个元素,其中可以通过class属性和id属性以及标签来进行定位。 如下面示例:

python 复制代码
# 用标签定位查找-->定位标签为link的元素
soup.link

# 用class属性进行查找-->查找class属性为info的div元素,find()函数只取第一个元素
soup.find("div",class_="info")
# find_all函数查找多个元素
soup.find_all("div",class_="info")

# 用id属性进行定位查找-->查找id为content的div元素,只取第一个
soup.find("div",id = "content")
# find_all函数用于查找多个元素
soup.find_all("div",id = "content")

查找到元素就要提取其中的文字或者属性,其中常见的有三种

  • .string:获取标签内的文本内容,只适用于只有一个子节点的标签
  • .text:获取标签及其所有子节点的文本内容
  • .attrs:获取标签的所有属性,返回一个字典
python 复制代码
# 获取id为content的div元素的所有文本内容
soup.find("div",id = "content").text
# 获取class为info的div元素的文本内容
soup.find("div",class_="info").string
# 获取p标签的所有属性,返回一个字典
soup.p.attrs

下面通过爬取起点小说网的万相之王并把每章的内容储存到本地为例,来实战BeautifulSoup的应用。

python 复制代码
import requests # 数据请求模块
import bs4 from BeautifulSoup # 导入BeautifulSoup库,bs4为别名
import  lxml # 用于解析xml和html文件
import os # 文件管理模块

# 创建chapter文件夹,用于储存每章的小说内容
if not os.path.exists("./chapter"):
    os.mkdir("./chapter")

# 起点小说网网址
url="https://www.qidian.com/book/1027368101/"
# 请求头  Users-Agent为浏览器的标识,Cookie为会话标识
headers={
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
    "Cookie":"e1=%7B%22l6%22%3A%221%22%2C%22l7%22%3A%22%22%2C%22l1%22%3A%22%22%2C%22l3%22%3A%22%22%2C%22pid%22%3A%22qd_P_xiangqing%22%2C%22eid%22%3A%22%22%7D; e2=%7B%22l6%22%3A%221%22%2C%22l7%22%3A%22%22%2C%22l1%22%3A3%2C%22l3%22%3A%22%22%2C%22pid%22%3A%22qd_P_xiangqing%22%2C%22eid%22%3A%22qd_H_shuyouclass%22%7D; _csrfToken=zK5XAjMErDwmXg9Ea69GM5HZPBLGGvNdK3kHgmXC; newstatisticUUID=1725338674_1056963668; fu=1252791423; supportwebp=true; supportWebp=true; se_ref=; traffic_search_engine=; e1=%7B%22l6%22%3A%22%22%2C%22l7%22%3A%22%22%2C%22l1%22%3A2%2C%22l3%22%3A%22%22%2C%22pid%22%3A%22qd_p_qidian%22%2C%22eid%22%3A%22%22%7D; e2=%7B%22l6%22%3A%22%22%2C%22l7%22%3A%22%22%2C%22l1%22%3A2%2C%22l3%22%3A%22%22%2C%22pid%22%3A%22qd_p_qidian%22%2C%22eid%22%3A%22%22%7D; traffic_utm_referer=https%3A//cn.bing.com/; w_tsfp=ltvuV0MF2utBvS0Q6qjolUqqEzwudzw4h0wpEaR0f5thQLErU5mG04d7v8/yNXPa58xnvd7DsZoyJTLYCJI3dwMUR5rEdN0ViQ2Yw4l0jocQAEY2QJiOX1cXJu0j7GFDL3hCNxS00jA8eIUd379yilkMsyN1zap3TO14fstJ019E6KDQmI5uDW3HlFWQRzaLbjcMcuqPr6g18L5a5T3Y5QmqeAh8UbtA2BOQh3ofXX1250K5d+oLNh6vK8z7SqA="
}
# 发送get请求
response = requests.get(url,headers=headers)
# 利用BeautifulSoup库进行数据解析
soup = BeautifulSoup(response.text, 'lxml')
# 查找每个章节所在的所有li标签-->类名为"chapter-item"
chapter=soup.find_all('li',class_='chapter-item')
# 对每个章节进行遍历
for li_data in chapter:
    # 每章章节名 strip()去除空格
    chapter_title=li_data.text.strip()
    # 每章的地址
    chapter_href=li_data.a["href"]
    # https协议
    chapter_href="https:"+chapter_href

    try:
        # 对每章的url地址进行请求
        chapter_detail = requests.get(url=chapter_href, headers=headers)
        # 解析数据
        soup_detail = BeautifulSoup(chapter_detail.text, 'lxml')
        chapter_detail_data = soup_detail.find("main",class_="content").text
        print(chapter_detail_data)
        # 把每章都写入本地
        with open("./chapter/" + chapter_title + '.md', 'w', encoding='utf-8') as f:
            f.write(chapter_detail_data)
            print("chapter:" + chapter_title + " 写入成功")
    except:
        print(f"需要登录才能查看完整的章节:{chapter_title},{chapter_href}")

成果

共勉

自给自足的光,永远不会暗!

博客

  • 本人是一个渗透爱好者,不时会在微信公众号(laity的渗透测试之路)更新一些实战渗透的实战案例,感兴趣的同学可以关注一下,大家一起进步。
    • 之前在公众号发布了一个kali破解WiFi的文章,感兴趣的同学可以去看一下,在b站(up主:laity1717)也发布了相应的教学视频
相关推荐
m0_74824534几秒前
python——Django 框架
开发语言·python·django
java1234_小锋28 分钟前
一周学会Flask3 Python Web开发-客户端状态信息Cookie以及加密
前端·python·flask·flask3
B站计算机毕业设计超人1 小时前
计算机毕业设计Python+DeepSeek-R1高考推荐系统 高考分数线预测 大数据毕设(源码+LW文档+PPT+讲解)
大数据·python·机器学习·网络爬虫·课程设计·数据可视化·推荐算法
winfredzhang2 小时前
Python实战:Excel中文转拼音工具开发教程
python·安全·excel·汉字·pinyin·缩写
奔跑吧邓邓子2 小时前
【Python爬虫(34)】Python多进程编程:开启高效并行世界的钥匙
开发语言·爬虫·python·多进程
wang_yb3 小时前
『Python底层原理』--Python属性的工作原理
python·databook
量化投资技术3 小时前
【量化策略】趋势跟踪策略
python·量化交易·量化·量化投资·qmt·miniqmt
伊一大数据&人工智能学习日志3 小时前
自然语言处理NLP 04案例——苏宁易购优质评论与差评分析
人工智能·python·机器学习·自然语言处理·数据挖掘
刀客1233 小时前
python3+TensorFlow 2.x(六)自编码器
人工智能·python·tensorflow
微刻时光3 小时前
影刀RPA中级证书-Excel进阶-开票清单
经验分享·python·低代码·rpa·影刀·影刀证书·影刀实战