爬取小说案例-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)也发布了相应的教学视频
相关推荐
engchina9 分钟前
如何在 Python 中忽略烦人的警告?
开发语言·人工智能·python
qq_3758726937 分钟前
15爬虫:下载器中间件
爬虫
Dream_Snowar1 小时前
速通Python 第四节——函数
开发语言·python·算法
西猫雷婶1 小时前
python学opencv|读取图像(十四)BGR图像和HSV图像通道拆分
开发语言·python·opencv
汪洪墩2 小时前
【Mars3d】设置backgroundImage、map.scene.skyBox、backgroundImage来回切换
开发语言·javascript·python·ecmascript·webgl·cesium
程序员shen1616113 小时前
抖音短视频saas矩阵源码系统开发所需掌握的技术
java·前端·数据库·python·算法
人人人人一样一样3 小时前
作业Python
python
四口鲸鱼爱吃盐3 小时前
Pytorch | 利用VMI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击
人工智能·pytorch·python
四口鲸鱼爱吃盐4 小时前
Pytorch | 利用PI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击
人工智能·pytorch·python