利用Python进行网络爬虫:Beautiful Soup和Requests的应用【第131篇—Beautiful Soup】

news2024/11/18 19:29:25

利用Python进行网络爬虫:Beautiful Soup和Requests的应用

在网络数据变得日益丰富和重要的今天,网络爬虫成为了获取和分析数据的重要工具之一。Python作为一种强大而灵活的编程语言,在网络爬虫领域也拥有广泛的应用。本文将介绍如何使用Python中的两个流行库Beautiful Soup和Requests来创建简单而有效的网络爬虫,以便从网页中提取信息。
在这里插入图片描述

什么是Beautiful Soup和Requests?

  • Requests:是一个简单而优雅的HTTP库,用于发送HTTP请求。它使得从网站获取数据变得非常容易,而且可以处理各种类型的HTTP请求和响应。

  • Beautiful Soup:是一个用于解析HTML和XML文档的Python库。它提供了许多方便的方法来浏览、搜索和修改解析树,使得从网页中提取信息变得非常简单。

安装和导入库

首先,确保你已经安装了这两个库。你可以使用pip来安装它们:

pip install requests beautifulsoup4

安装完成后,让我们开始编写我们的网络爬虫!

示例:提取网页中的标题和链接

我们将以一个简单的例子开始,从一个网页中提取标题和链接。假设我们要从一个博客页面中提取标题和对应的文章链接。

import requests
from bs4 import BeautifulSoup

# 定义要爬取的网页地址
url = 'https://xxxx/blog'

# 发送HTTP请求获取页面内容
response = requests.get(url)

# 使用Beautiful Soup解析页面内容
soup = BeautifulSoup(response.text, 'html.parser')

# 找到所有的标题和链接
titles = soup.find_all('h2', class_='post-title')
links = [title.a['href'] for title in titles]

# 输出标题和链接
for i in range(len(titles)):
    print("标题:", titles[i].text.strip())
    print("链接:", links[i])
    print()

代码解析

  1. 我们首先导入了requestsBeautifulSoup库。
  2. 定义了要爬取的网页地址。
  3. 使用requests.get()方法发送HTTP请求,获取页面的响应内容。
  4. 通过BeautifulSoup将页面内容解析成一个HTML文档对象。
  5. 使用find_all()方法找到页面中所有的标题,指定了标题的标签为<h2>,并且指定了它们的类名为post-title
  6. 通过循环遍历每个标题,提取出标题文本和对应的链接。
  7. 最后输出标题和链接。

示例:提取网页中的图片链接和保存图片

在这个示例中,我们将学习如何从网页中提取图片链接,并将图片保存到本地文件系统中。

import os
import requests
from bs4 import BeautifulSoup

# 定义要爬取的网页地址
url = 'https://xxxx/gallery'

# 发送HTTP请求获取页面内容
response = requests.get(url)

# 使用Beautiful Soup解析页面内容
soup = BeautifulSoup(response.text, 'html.parser')

# 找到所有的图片链接
image_links = [img['src'] for img in soup.find_all('img')]

# 创建保存图片的文件夹
if not os.path.exists('images'):
    os.makedirs('images')

# 下载图片并保存到本地
for i, link in enumerate(image_links):
    image_name = f'image_{i}.jpg'
    image_path = os.path.join('images', image_name)
    with open(image_path, 'wb') as f:
        img_data = requests.get(link).content
        f.write(img_data)
    print(f"图片 '{image_name}' 已保存。")

代码解析

  1. 我们继续导入requestsBeautifulSoup库,以及Python的os模块。
  2. 定义了要爬取的网页地址。
  3. 发送HTTP请求并获取页面的响应内容。
  4. 使用BeautifulSoup解析页面内容。
  5. 使用find_all()方法找到页面中所有的图片标签,并提取出它们的src属性,即图片链接。
  6. 检查本地是否存在用于保存图片的文件夹,如果不存在则创建它。
  7. 使用循环遍历所有的图片链接,下载图片并保存到本地文件系统中。我们使用了enumerate()函数来同时获取图片的索引和链接。
  8. 每次下载完成后,打印出图片的保存信息。

示例:爬取动态加载的内容

有时,网页中的内容可能是通过 JavaScript 动态加载的,这时候我们不能简单地通过静态页面的解析来获取内容。我们需要使用更高级的技术,例如模拟浏览器行为或使用 AJAX 请求来获取动态内容。下面是一个示例,演示如何使用 Selenium 库来爬取动态加载的内容。

首先,确保你已经安装了 Selenium 库。你可以使用下面的命令进行安装:

pip install selenium

然后,下载并安装相应浏览器的 WebDriver。你可以从浏览器官方网站下载,例如 Chrome 的 WebDriver 可以从 Chrome WebDriver 获取。

下面是一个示例代码,演示了如何使用 Selenium 来爬取动态加载的内容:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
import time

# 设置 Chrome WebDriver 的路径
webdriver_path = '/path/to/chromedriver'

# 创建 Chrome WebDriver
service = Service(webdriver_path)
chrome_options = Options()
chrome_options.add_argument("--headless")  # 无头模式,不打开浏览器界面
driver = webdriver.Chrome(service=service, options=chrome_options)

# 加载页面
driver.get("https://xxxx/dynamic-content")

# 模拟滚动浏览器窗口,触发动态加载
for i in range(5):
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(2)  # 等待页面加载

# 提取动态加载的内容
elements = driver.find_elements(By.XPATH, "//div[@class='dynamic-content']")
for element in elements:
    print(element.text)

# 关闭 WebDriver
driver.quit()

代码解析

  1. 我们导入了 webdriver 模块以及一些相关的类和方法。
  2. 设置了 Chrome WebDriver 的路径,创建了 Chrome WebDriver 实例。
  3. 使用 get() 方法加载目标网页。
  4. 使用 execute_script() 方法模拟滚动浏览器窗口,触发动态加载内容的加载。
  5. 使用 find_elements() 方法通过 XPath 查找动态加载的内容元素。
  6. 遍历找到的元素并输出它们的文本内容。
  7. 最后关闭 WebDriver。

示例:处理登录认证

有些网站需要用户登录后才能访问某些页面或获取某些内容。下面是一个示例,演示了如何使用 Selenium 模拟登录认证,然后爬取登录后的内容。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

# 设置 Chrome WebDriver 的路径
webdriver_path = '/path/to/chromedriver'

# 创建 Chrome WebDriver
driver = webdriver.Chrome(webdriver_path)

# 加载登录页面
driver.get("https://xxxx/login")

# 找到用户名和密码输入框,并输入登录信息
username_field = driver.find_element(By.ID, "username")
password_field = driver.find_element(By.ID, "password")

username_field.send_keys("your_username")
password_field.send_keys("your_password")

# 找到登录按钮并点击
login_button = driver.find_element(By.XPATH, "//button[@type='submit']")
login_button.click()

# 登录成功后,等待一段时间,确保页面加载完成
driver.implicitly_wait(10)  # 等待时间可以根据实际情况调整。在这里,我们等待了 10 秒钟,以确保页面加载完成。你也可以根据实际情况调整等待时间。


一旦登录成功并且页面加载完成,你就可以开始爬取登录后的内容了。以下是一个简单的示例,演示了如何查找登录后页面中的某些元素并提取它们的文本内容:

# 爬取登录后页面的内容
welcome_message = driver.find_element(By.XPATH, "//h1[contains(text(), 'Welcome')]").text
user_info = driver.find_element(By.XPATH, "//div[@class='user-info']").text

print("欢迎信息:", welcome_message)
print("用户信息:", user_info)

# 关闭 WebDriver
driver.quit()

代码解析

  1. 使用 find_element() 方法查找用户名和密码输入框,并使用 send_keys() 方法输入登录信息。
  2. 使用 find_element() 方法找到登录按钮,并使用 click() 方法点击按钮进行登录。
  3. 使用 implicitly_wait() 方法等待一段时间,确保页面加载完成。
  4. 使用 find_element() 方法查找登录后页面中的元素,并提取它们的文本内容。
  5. 输出提取到的内容。
  6. 最后关闭 WebDriver。

在前面的示例中,我们使用了硬编码的方式来输入用户名和密码。然而,在实际情况中,我们可能需要更安全和更灵活的方法来处理用户凭据。下面是一个示例,演示了如何使用 getpass 模块来安全地输入密码,并且如何从外部文件中读取凭据信息。

首先,确保你已经安装了 getpass 模块:

pip install getpass

然后,假设我们有一个外部文件 credentials.txt,其中包含用户名和密码,格式如下:

username: your_username
password: your_password

以下是相应的代码示例:

from selenium import webdriver
from selenium.webdriver.common.by import By
from getpass import getpass

# 设置 Chrome WebDriver 的路径
webdriver_path = '/path/to/chromedriver'

# 创建 Chrome WebDriver
driver = webdriver.Chrome(webdriver_path)

# 加载登录页面
driver.get("https://xxx/login")

# 从外部文件读取用户名和密码
with open("credentials.txt", "r") as file:
    lines = file.readlines()
    username = lines[0].strip().split(": ")[1]
    password = lines[1].strip().split(": ")[1]

# 输入用户名
username_field = driver.find_element(By.ID, "username")
username_field.send_keys(username)

# 输入密码(安全方式)
password = getpass("请输入密码:")
password_field = driver.find_element(By.ID, "password")
password_field.send_keys(password)

# 找到登录按钮并点击
login_button = driver.find_element(By.XPATH, "//button[@type='submit']")
login_button.click()

# 登录成功后,等待一段时间,确保页面加载完成
driver.implicitly_wait(10)

# 爬取登录后页面的内容
welcome_message = driver.find_element(By.XPATH, "//h1[contains(text(), 'Welcome')]").text
user_info = driver.find_element(By.XPATH, "//div[@class='user-info']").text

print("欢迎信息:", welcome_message)
print("用户信息:", user_info)

# 关闭 WebDriver
driver.quit()

代码解析

  1. 使用 getpass() 函数安全地输入密码,这样密码不会在控制台中显示出来。
  2. 使用文件读取操作从外部文件中读取用户名和密码,这样可以将凭据信息存储在安全的地方,避免了硬编码的方式。

总结:

在本文中,我们介绍了如何使用 Python 中的 Requests 和 Beautiful Soup 库以及 Selenium 模块来创建网络爬虫,并展示了不同场景下的实际应用。

首先,我们使用 Requests 和 Beautiful Soup 演示了如何从静态网页中提取信息,包括文本内容、链接和图片链接。这使得我们能够快速、有效地从网页中获取所需的数据。

接着,我们展示了如何使用 Selenium 模拟登录认证并爬取登录后的内容。登录认证是访问某些网站或页面所必需的操作之一,而使用 Selenium 可以模拟用户的真实操作,从而实现登录认证并获取登录后页面的内容。

最后,我们介绍了如何安全地处理用户凭据,包括使用 getpass 模块安全输入密码以及从外部文件中读取用户名和密码。这样的做法使得我们的代码更加安全和灵活,有效地保护用户的隐私信息。

通过本文的学习,读者可以掌握使用 Python 进行网络爬虫的基本原理和方法,并且了解如何处理一些常见的爬虫场景,如静态网页数据提取、动态加载内容和登录认证等。同时,我们也强调了在进行网络爬虫时需要遵守相关的法律法规和网站的使用规则,以避免侵犯他人的权益。

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

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

相关文章

【智能硬件、大模型、LLM 智能音箱】MBO:基于树莓派、ChatGPT 的桌面机器人

MAKER:David Packman/译:趣无尽(转载请注明出处) 这是国外 Maker David Packman 制作的基于树莓派机器人 MBO,该机器人的外观设计灵感来自动漫 Adventure Time 中的机器人 MBO。它具有强大的交互功能,可实现脱机唤醒词检测、调用 ChatGPT 3.5 进行聊天、机器视觉对图像进…

解决Git:Author identity unknown Please tell me who you are.

报错信息&#xff1a; 意思&#xff1a; 作者身份未知 ***请告诉我你是谁。 解决办法&#xff1a; git config --global user.name "你的名字"git config --global user.email "你的邮箱"

Android 15 首个开发者预览版到来

作者 / 工程副总裁 Dave Burke Android 15 的首个开发者预览版现已发布&#xff0c;以便各位开发者能与我们通力协作&#xff0c;打造更优秀的 Android 平台。 在 Android 15 中&#xff0c;我们继续致力于打造一个既能提升工作效率&#xff0c;又能提供全新功能的平台。这些新…

蓝桥杯-模拟-4402. 刷题统计

题目 思路 代码 a,b,nmap(int,input().split()) sa*5b*2 resn//s*7 # 存在周期 d[a,a,a,a,a,b,b] n%s i0 while n>0: # 对剩余数量进行枚举&#xff0c;如果等于0&#xff0c;相当于还会再进去加一天n-d[i]i1res1 print(res)

es 聚合操作(一)

前言 Elasticsearch除搜索以外&#xff0c;提供了针对ES 数据进行统计分析的功能。聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如&#xff1a; 衣服品牌的受欢迎程度这些衣服的平均价格、最高价格、最低价格这些衣服的每天、每月销量如何 使用…

cpp qt 一个奇怪的bug

今天在用cpp qt的时候发现了一个奇怪的东西 这是我的源代码 #include "mywidget.h" #include <QPushButton>myWidget::myWidget(QWidget *parent): QWidget(parent) {QPushButton * btn1 new QPushButton;btn1->show();btn1->setParent(this);btn1-&g…

在集群模式下,Redis 的 key 是如何寻址的?分布式寻址都有哪些算法?了解一致性 hash 算法吗?

目录 一、分布式寻址算法 1. hash 算法 2. 一致性 hash 算法 3. Redis cluster 的 hash slot 算法 二、Redis cluster 的高可用与主备切换原理 1. 判断节点宕机 2. 从节点过滤 3. 从节点选举 4. 与哨兵比较 一、分布式寻址算法 hash 算法(大量缓存重建) 一致性 hash…

【代码随想录 | 链表 02】反转链表

文章目录 2.反转链表2.1题目2.2解法2.2.1双指针法2.2.2递归法 2.反转链表 2.1题目 206.反转链表——力扣链接 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例一&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;…

重建大师出现图中密集匹配失败的情况,是什么原因导致的?

可以检查瓦块是否位于测区边缘&#xff0c;边缘瓦块可以忽略&#xff1b;如果是中间区域的话&#xff0c;可能中间文件有异常&#xff0c;可以新建个reconstruction&#xff0c;然后单独提交失败的瓦块。 重建大师是一款专为超大规模实景三维数据生产而设计的集群并行处理软件&…

数据结构:7、队列

一、队列的概念与结构 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为队尾 出队列&#xff1a;进行删除操作的一端称为队头…

Cisco Packet Tracer模拟器实现路由器的路由配置及网络的安全配置

1. 内容 1. 配置路由器实现多个不同网络间的通信&#xff0c;路由器提供的路由协议包括静态路由协议、RIP动态路由、OSPF动态路由协议等等&#xff0c;训练内容包括路由器的静态路由配置、路由器的RIP动态路由配置、路由器的OSPF动态路由配置以及路由器的路由重分布配置。 2.…

Css基础——溢出文字省略号表达

1. 单行文本溢出显示省略号&#xff1a; 1.1、方法&#xff1a; 1. 先强制一行内显示文本*/ white-space: nowrap; &#xff08; 默认 normal 自动换行&#xff09; 2. 超出的部分隐藏*/ overflow: hidden; 3. 文字用省略号替代超出的部分*/ text-overflow: ellipsis; 1.2、代…

实战 | 基于YOLOv9和OpenCV实现车辆跟踪计数(步骤 + 源码)

导 读 本文主要介绍使用YOLOv9和OpenCV实现车辆跟踪计数&#xff08;步骤 源码&#xff09;。 实现步骤 监控摄像头可以有效地用于各种场景下的车辆计数和交通流量统计。先进的计算机视觉技术&#xff08;例如对象检测和跟踪&#xff09;可应用于监控录像&#xff0c;…

单调队列 维护区间最值(板子+两道练手)

1.P1886 滑动窗口 /【模板】单调队列https://www.luogu.com.cn/problem/P1886 板子题&#xff0c;传送门在上方 // Problem: // P1886 滑动窗口 /【模板】单调队列 // // Contest: Luogu // URL: https://www.luogu.com.cn/problem/P1886 // Memory Limit: 500 MB //…

Zookeeper3.5.9源码编译和启动

目录 参考链接1. 下载源码2. 准备更高版本的JDK和Maven环境Java 8Maven 3.6.3 3. 用IDEA打开项目进行编译和启动3.1. 设置maven版本3.2. 设置JDK版本为1.83.3. 切换 Maven profiles 选项到 java-build3.4. 执行 Ant build 生成和编译Java文件3.4.1. 执行ant build-generated而非…

微信小程序之vue按钮切换内容变化

效果图如下&#xff1b; 上代码 <template><view class"content"><view class"searchDiv"><view class"paytab"><view class"buttab" v-for"(t,index) in tabList" :key"index" clic…

叶子分享站PHP源码

叶子网盘分享站PHP网站源码&#xff0c;创建无限级文件夹&#xff0c;上传文件&#xff0c;可进行删除&#xff0c;下载等能很好的兼容服务器。方便管理者操作&#xff0c;查看更多的下载资源以及文章&#xff0c;新增分享功能&#xff0c;异步上传文件/资源等 PHP网盘源码优势…

Docker进阶:容器与镜像的导入和导出

Docker进阶&#xff1a;容器与镜像的导入和导出 1、容器&#xff08;Container&#xff09;和镜像&#xff08;Image&#xff09;的区别2、导出 Docker 容器3、导入 Docker 容器快照为镜像4、导出 Docker 镜像5、导入 Docker 镜像6、docker export 和 docker save区别7、docker…

优先级队列 priority_queue 的使用及示例代码

一、简介 priority_queue 即 优先级队列&#xff08;一种特殊的队列&#xff0c;其中的元素按照一定的优先级顺序排列&#xff0c;每次取出时都会取出具有最高优先级的元素&#xff0c;或者说可以获取队列中的最大/最小元素&#xff09;&#xff0c;它是C标准模板库&#xff0…

构建部署_Jenkins介绍与安装

构建部署_Jenkins介绍与安装 构建部署_Jenkins介绍与安装Jenkins介绍Jenkins安装 构建部署_Jenkins介绍与安装 Jenkins介绍 Jenkins是一个可扩展的持续集成引擎。 持续集成&#xff0c;就是通常所说的CI&#xff08;Continues Integration&#xff09;&#xff0c;可以说是现…