【Python 爬虫之BeautifulSoup】零基础也能轻松掌握的学习路线与参考资料

news2025/1/22 12:18:00

在这里插入图片描述
BeautifulSoup是一种Python库,用于解析HTML和XML文档,并从中提取数据。它提供了Pythonic的解决方案来处理非结构化数据,因此可以轻松地从网页上提取数据。 使用BeautifulSoup编写爬虫,你可以自动化许多任务,比如数据抓取、提取、清理以及分析。BeautifulSoup的优点主要有以下:

  • 处理糟糕的HTML代码:大多数网站的HTML代码都很混乱,但 BeautifulSoup 能轻松处理。
  • 不需要额外的编程技巧:BeautifulSoup自带了很多实用的方法,你不需要额外的编程技巧就可以轻松地从 HTML 中提取信息。
  • 简单易用:BeautifulSoup的API是简单直观的,而且文档很详细。

下面我们将详细介绍使用BeautifulSoup进行爬虫的常见用法。

  1. 安装BeautifulSoup

PIP 是一个用来安装和管理 Python 包的工具,使用 pip 安装 Beautiful Soup 库非常容易。不需要在 Python 环境变量中配置 PYTHONPATH,也不需要下载源码,通过 pip 安装即可。

pip install beautifulsoup4

在 Python 代码中导入 beautiful soup 要写:

from bs4 import BeautifulSoup
  1. 准备网页

使用BeautifulSoup开发爬虫之前,需要准备网页。 可以直接通过 requests 库下载网页:

import requests

url = "https://www.baidu.com"
response = requests.get(url)

输出响应内容

print(response.content)

通过requests.get()函数发送一个HTTP GET请求并获得响应。该响应对象包含HTML源代码,可以通过response.content获取它。

  1. 解析HTML文档

使用BeautifulSoup解析HTML文档非常容易,只需在网站的源代码中提取所需的部分。这通常需要检查HTML页面的结构,确定所需元素的标记和类,然后使用BeautifulSoup的搜索方法从代码中提取这些元素的内容。

使用BeautifulSoup解析HTML需要:

  • 创建一个BeautifulSoup对象
  • 寻找需要解析的内容
  • 抽取内容

示例代码:

from bs4 import BeautifulSoup

定义一个简单的html页面并创建BeautifulSoup对象

html_doc =

<html><head><title>The Dormouse's story</title></head>
<body>
<p class="title"><b>The Dormouse's story</b></p>

<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>

<p class="story">...</p>
soup = BeautifulSoup(html_doc, 'html.parser')

#展示整个网页源码
print(soup.prettify())

#找到网页中所有标题
print(soup.title)

#找到含有class='title'的所有段落
print(soup.find_all('p', class_='title'))

#找到第一个<a>标签
print(soup.a)

#按照标签层级访问(下行遍历)
print(soup.head.title)

#按照标签层级访问(上行遍历)
print(soup.title.parent)

#查找所有链接
for link in soup.find_all('a'):
    print(link.get('href'))

#标准选择器查找
print(soup.select('body a'))

该示例中,我们创建了一个包含HTML文本的字符串。然后,我们创建了一个BeautifulSoup对象,并使用try以下方法搜索所需元素:

  • prettify() - 以易于阅读的方式打印整个页面的HTML源代码
  • title - 返回页面标题的原始HTML标记
  • find_all(‘tag’, class_=‘className’) - 找到所有具有class="className"的tag标记
  • a - 找到第一个的标记
  • head.title - 找到页面标题标记

上面的示例还展示了如何使用BeautifulSoup标准选择器查找元素。

  1. 选择器的使用

BeautifulSoup的选择器让你可以灵活地从复杂的HTML文档中选择所需的元素。以下是几个示例,演示了如何使用选择器从HTML文档中提取元素。

  • 通过标签名查找元素
soup.find_all('a')
  • 通过class查找元素
soup.find_all('p', class_='story')
  • 通过id查找元素
soup.find_all(id='link3')
  • 通过CSS选择器查找元素
soup.select('a[href^="http://"]')
  • 通过属性查找元素
soup.find_all('p', attrs={'class': 'story'})
  • 通过字符串查找文本
soup.find_all(string='Elsie')
  1. 实战应用

BeautifulSoup可以用于各种爬虫和数据抓取任务,下面是一些优秀的实战应用示例:

5.1 网站图片下载器

这个爬虫可以扫描网站上的所有图片并下载他们。只需要在 img_url 变量中提供爬取网站链接即可。

import requests
from bs4 import BeautifulSoup
import os

img_url = 'https://www.example.com'
output_dir = './download_images'

if not os.path.isdir(output_dir):
    os.makedirs(output_dir)

r = requests.get(img_url)

soup = BeautifulSoup(r.content)

imgs = soup.find_all('img')
print('Total images found:', len(imgs))

for img in imgs:
    img_src = img.get('src')
    if img_src.startswith('http'):
        img_name = img_src.split('/')[-1]
    else:
        img_src = img_url + img_src
        img_name = img_src.split('/')[-1]

    img_path = os.path.join(output_dir, img_name)

    if not os.path.isfile(img_path):
        with open(img_path, 'wb') as f:
            img_data = requests.get(img_src)
            f.write(img_data.content)

这个代码片段首先下载HTML文档,然后抓取包含在 img 标记内的图片链接。接下来,他会遍历所有图片链接,并将它们保存在本地文件。

5.2 网站链接列表生成器

这个爬虫可以从web页面上抓取链接并使用它们生成一个链接列表。

import requests
from bs4 import BeautifulSoup

page_url = 'https://www.example.com'
output_file = 'links.txt'

r = requests.get(page_url)

soup = BeautifulSoup(r.content)

links = soup.find_all('a')

with open(output_file, 'w') as f:
    for link in links:
        link_href = link.get('href')
        if link_href.startswith('http'):
            f.write(link_href + '\n')
        else:
            f.write(page_url + link_href + '\n')

这个代码片段会列出网页中所有链接,并将它们写入一个文本文件中。链接可以是绝对链接或相对链接。如果链接以’http’或’https’开头,它将被视为绝对链接,并将直接写入文件。

5.3 网站内容检索器

这个爬虫可以检索网站中的内容。只需在 search_terms 变量中提供要搜索的关键字, 程序将遍历网站上的所有文本,返回包含关键字的文本及其URL。

import requests
from bs4 import BeautifulSoup
import re

search_terms = 'python'
page_url = 'https://www.example.com'

r = requests.get(page_url)

soup = BeautifulSoup(r.content)

matching_sections = []

for tag in soup.find_all('p'):
    if re.search(search_terms, str(tag), re.IGNORECASE):
        matching_sections.append({'url': page_url, 'title': tag.text})

for link in soup.find_all('a'):
    if link.get('href') and page_url in link.get('href'):
        r = requests.get(link.get('href'))
        soup = BeautifulSoup(r.content)
        for tag in soup.find_all('p'):
            if re.search(search_terms, str(tag), re.IGNORECASE):
                matching_sections.append({'url':link.get('href'), 'title':tag.text})

for s in matching_sections:
    print('%s\n%s\n\n' % (s['url'], s['title']))

这个代码片段会遍历页面中的所有段落和链接,查找包含关键字的文本。如果有匹配的段落或链接,代码片段将记录URL和标题,并最终打印它们。

  1. 参考资料
  • Python Beautiful Soup documentation: https://www.crummy.com/software/BeautifulSoup/bs4/doc/
  • Python requests documentation: https://requests.readthedocs.io/en/master/
  • Introduction to Python web scraping with Beautiful Soup: https://realpython.com/python-web-scraping-practical-introduction/
  • Use Python and Beautiful Soup to Scrape Google News: https://www.twilio.com/blog/2017/12/scrape-google-news-with-python.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/522193.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实验三 Spark SQL基础编程

实验三 Spark SQL基础编程 1.实验目的 1. 掌握 Spark SQL 的基本编程方法&#xff1b; 2. 熟悉 RDD 到 DataFrame 的转化方法&#xff1b; 3. 熟悉利用 Spark SQL 管理来自不同数据源的数据。 2.实验内容 1&#xff0e;Spark SQL 基本操作 将下列 JSON 格式数据复制到 Li…

CF1245D Shichikuji and Power Grid 题解

CF1245D Shichikuji and Power Grid 题解 题目链接字面描述题面翻译样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示 思路点拨代码实现 题目 链接 https://www.luogu.com.cn/problem/CF1245D 字面描述 题面翻译 已知一个平面上有 n n n 个城市&#x…

计网笔记 数据链路层 (1-2) 封装成帧、差错控制、流量控制与可靠传输、停止等待协议、后退N帧协议(GBN)、选择重传协议(SR)

文章目录 前言在这里插入图片描述 零、数据链路层基本概念一、功能0、数据链路层功能概述1、封装成帧和透明传输1.1封装成帧1.2 透明传输1.3组帧方法 2、数据链路层的差错控制2.0差错从何而来2.1位错&#xff08;比特错&#xff0c;1变成0&#xff0c;0变成1&#xff09;2.2帧错…

干货 | ChatGPT使用指南,让你轻松上车AI世界!

Hello&#xff0c;大家好&#xff01; 这里是壹脑云科研圈&#xff0c;我是喵君姐姐~ 聊天机器人&#xff08;Chatbot&#xff09;是一种人工智能应用&#xff0c;可以模拟人类对话行为&#xff0c;以自然语言进行交互。 在过去的几年里&#xff0c;随着自然语言处理技术和深…

Springboot +Flowable,定时器的简单使用

一.流程定义定时激活 之前介绍流程定义的时候&#xff0c;流程都是定义好之后立马就激活了&#xff0c;其实在流程定义的这个过程中&#xff0c;我们还可以设置一个激活时间&#xff0c;也就是流程定义好之后&#xff0c;并不会立马激活&#xff08;不激活就不能据此流程定义创…

操作系统作业 第37-40章

第四次作业 第37章 本章作业需要使用提供的disk.py程序。该程序可以模拟磁盘的工作。在默认情况下&#xff0c;磁盘调度方法为FIFO。对于时间的计算&#xff0c;假设旋转一度为1个时间单位&#xff0c;旋转完整一圈需要360个时间单位&#xff0c;而一个磁道上默认有12个扇区&…

实验二 RDD基础编程

实验二 RDD基础编程 前提是配置好大数据环节。 hadoop&#xff0c;spark&#xff0c;scala等必须的软件 以及下载pyshark 1.实验目的 1. 掌握 RDD 基本操作&#xff1b; 2. 熟悉使用 RDD 编程解决实际具体问题的方法&#xff1b; 2.实验内容 本人仅提供测试代码&#xff01;…

策划专业技能提升攻略,让你在职场中脱颖而出

作为一个10多年的老策划&#xff0c;刚入行的时候也走过很多弯路&#xff0c;后来加入到一家在国内比较知名的策划公司&#xff08;老板也是当年的十大知名策划人&#xff09;才真正让我实现水平的跃升。 当时公司经常有内训&#xff0c;新人的第一课就是策划人应该如何快速入…

FreeRTOS-事件组详解

✅作者简介&#xff1a;嵌入式入坑者&#xff0c;与大家一起加油&#xff0c;希望文章能够帮助各位&#xff01;&#xff01;&#xff01;&#xff01; &#x1f4c3;个人主页&#xff1a;rivencode的个人主页 &#x1f525;系列专栏&#xff1a;玩转FreeRTOS &#x1f4ac;保持…

深入理解JVM读书笔记与实战_01_Java内存区域与内存溢出异常

文章目录 运行时数据区域问题引入 运行时数据区域 Java虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区。运行时数据区包括了程序计数器、虚拟机栈、本地方法栈、方法区和堆。 程序计数器&#xff1a;程序计数器是线程私有的内存&#xff0c;用来记住…

vue:组件使用v-model实现2个组件间的数据双向绑定

一、需要实现的需求&#xff1a; 子组件输入框的数据发生改变&#xff0c;父组件的数据跟着实时改变&#xff1b; 父组件的数据发生改变&#xff0c;子组件的数据跟着实时改变。 二、实现思路&#xff1a; 1、&#xff08;1&#xff09;在父组件引入子组件。&#xff08;2&…

CAN总线要点总结(CAN2.0A/B)

个人博客原文链接&#xff1a;CAN总线要点总结&#xff08;CAN2.0A/B&#xff09; 前言 工作也有几年了&#xff0c;在项目中也接触过几次CAN总线&#xff0c;但总是止步于会用即可&#xff0c;对于很多细节上的东西有时还是稀里糊涂的状态&#xff0c;这几天正好有点时间&am…

【亲测有效】pycharm不显示软件包

http://pypi.hustunique.com/ https://pypi.mirrors.ustc.edu.cn/ http://pypi.tuna.tsinghua.edu.cn/simple/ http://mirrors.aliyun.com/pypi/simple/ http://pypi.douban.com/simple/2023.5.13 亲测有效

单点登录系统:登录,登出,拦截器

什么是单点登录&#xff1f; 单点登录&#xff08;Single Sign On&#xff09;&#xff0c;简称为 SSO&#xff0c;是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中&#xff0c;用户只需要登录一次就可以访问所有相互信任的应用系统。 假设一个企业…

贪心算法(无规则)

目录 1.easy1.455. 分发饼干2.1005. K 次取反后最大化的数组和3.860. 柠檬水找零 2.medium1.序列问题1.376. 摆动序列2.738. 单调递增的数字 2.贪心解决股票问题1.122. 买卖股票的最佳时机 II 3.两个维度权衡问题1.135. 分发糖果*2.406. 根据身高重建队列(linklist&#xff0c;…

【WOA-LSTM】基于WOA优化 LSTM神经网络预测研究(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Neuron 2.4.0 发布:体验下一代工业物联网连接和管理

近日&#xff0c;EMQ 旗下的工业协议网关软件 Neuron 发布了最新的 2.4.0 版本。 该版本新增了包括 ABB COMLI 在内的四个南向驱动和一个北向应用&#xff0c;同时对现有的插件功能和 UI 进行了优化。 快速体验 Neuron 新版本 新增驱动插件满足不同场景需求 IEC61850 MMS 和 …

springboot项目如何优雅停机

文章目录 前言kill -9 pid的危害如何优雅的停机理论步骤优雅方式1、kill -15 pid 命令停机2、ApplicationContext close停机3、actuator shutdown 停机 前言 相信很多同学都会用Kill -9 PID来杀死进程&#xff0c;如果用在我们微服务项目里面&#xff0c;突然杀死进程会有什么…

计算机组成原理基础练习题第二章

1.下面四种语言中&#xff0c;()更适应网络环境 A、FORTRAN    B、JavaC、C        D、PASCAL 2.下列叙述中正确的是&#xff08;&#xff09; A.终端是计算机硬件的一部分,好比电视中的小屏幕 B. ALU是代数逻辑单元的缩写 C.导航用计算机属于一般用途计算…

网络数据链路层介绍

文章目录 一、以太网二、以太网的帧格式三、局域网通信的原理四、ARP协议1.ARP协议的介绍2.ARP协议的工作流程3.ARP数据报格式 一、以太网 以太网并不是一种具体的网络&#xff0c;而是一种技术标准&#xff0c;它既包含了数据链路层的内容&#xff0c;也包含了一些物理层的内…