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

👽发现宝藏

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。

利用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.mfbz.cn/a/466052.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于多尺度视网膜增强图像去雾算法(MSR,Multi-Scale Retinex),Matalb实现

博主简介&#xff1a; 专注、专一于Matlab图像处理学习、交流&#xff0c;matlab图像代码/项目合作可以联系&#xff08;QQ:3249726188&#xff09; 个人主页&#xff1a;Matlab_ImagePro-CSDN博客 原则&#xff1a;代码均由本人编写完成&#xff0c;非中介&#xff0c;提供有偿…

Mit6.s081 前置开发环境: 虚拟机ubuntu + ssh + vscode

虚拟机 ssh vscode 前置条件 下载VMware Download VMware Workstation ProUbuntuUbuntu系统下载 | Ubuntu vscode Visual Studio Code - Code Editing. Redefined Ubuntu版本&#xff1a;20.04 Ubuntu基本操作 ubuntu 安装 ssh 服务 sudo apt-get install openssh-serv…

前端学习之css伪元素选择器

伪元素选择器 &#xff08;注释是对各个内容的解释与理解&#xff09; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>伪元素选择器</title><!-- 双冒号开头一般都称为伪元素&#xff0c;…

Redis命名设计

可读性和管理性 以项目名为前缀(防止key冲突)&#xff0c;用冒号分隔&#xff0c;比如项目名:表名:id zh(知乎):news_data(新闻数据):2(主键id) zh:news_data:2 精简性 key的命名&#xff0c;尽量精简&#xff0c;key的名字长度对内存的占用不可忽视&#xff0c;我们来实际…

读者交流群

自开设公众号以来&#xff0c;收到众多读者的关注&#xff0c;所以我很高兴在这里向大家推荐加入我的技术交流群。如果你对Java和Go语言有兴趣&#xff0c;想要与其他同好分享经验和知识&#xff0c;那么这个读者群将是一个理想的选择。 在这个读者群中&#xff0c;我们有机会与…

git基础命令(四)之分支命令

目录 基础概念git branch-r-a-v-vv-avv重命名分支删除分支git branch -h git checkout创建新的分支追踪远程分支同时切换到该分支创建新的分支并切换到该分支撤销对文件的修改&#xff0c;恢复到最近的提交状态&#xff1a;丢弃本地所有修改git checkout -h git merge合并指定分…

docker 安装minio,详细图解

废话不多说&#xff0c;直接上干货 docker 安装minio 拉取镜像 docker pull minio/minio创建数据目录、配置目录 mkdir /opt/minio/data mkdir /opt/minio/config启动容器 docker run -p 9000:9000 -p 9090:9090 \--name minio \-d --restartalways \-e "MINIO_ACCESS_KE…

[全网首发中文版]LLM4Decompile: Decompiling Binary Code with Large Language Models

LLM4Decompile: Decompiling Binary Code with Large Language Models 摘要 反编译的目的是将编译后的代码恢复为人类可读的源代码&#xff0c;但在名称和结构等细节上遇到了困难。 大型语言模型&#xff08;大语言模型&#xff09;显示出编程任务的前景&#xff0c;激励其应…

如何用大模型做出一款属于自己的 AI 应用?

语言模型是怎么回事 语言模型&#xff08; language model&#xff0c;LM &#xff09;简单来说&#xff0c;就是利用自然语言构建的模型。 自然语言就是我们日常生活、学习和工作中常用的文字。语言模型就是利用自然 语言文本构建的&#xff0c;根据给定文本&#xff0c;输出…

jquery 合并单元格

原始表格 合并后的单元格 直接上代码 //合并第一列单元格//给tbody下的第一行(tr:first-child)第一个单元格(td).eq(0))//加上rowspan 长度是这个表格tr的长度(attr(rowspan, $("tbody tr").length);)$(tbody tr:first-child td).eq(0).attr(rowspan, $("t…

idea2023 运行多 springboot 实例

概要 1、修改idea运行多实例&#xff08;本地测试负载&#xff09; 你可能用到其他 1、改造项目缓存token 至redis 支持负载均衡部署 SpringSecurity6.0RedisJWTMP基于token认证功能开发&#xff08;源码级剖析可用于实际生产项目&#xff09;_springsecurity redis管理token…

算法导论第十二章练习参考答案(22) - 12.1-12.4

Exercise 12.1-1 任何时候&#xff0c;如果一个节点有一个子节点&#xff0c;就把它当作右子节点&#xff0c;左子节点为NIL。 Exercise 12.1-2 二叉搜索树的属性保证了左子树的所有节点都更小&#xff0c;右子树的所有节点都更大。最小堆属性只保证一般的子节点大于父节点的关…

3.18 杂题小结

类似的对于n个物体根据其某种递减关系选择的题目可以利用数位 &#xff1a;当前字符可以选也可以不选 &#xff01;&#xff1a;当前字符无法选 思路&#xff1a;需要同一位置多次比对的一般使用动态规划&#xff08;背包中物品是否拿取、字符串取舍与修改方式等&#xff09;…

2024华为OD统一考试(C卷)最新题库(Java Python C++)

关于华为OD ​ 华为的员工补充途径有三种&#xff0c;分别是校招、OD转正和社招。校招是华为唯一的正式员工入职途径&#xff0c;但是从近几届开始竞争非常激烈&#xff0c;尤其是在CV、AI、NLP等赛道上&#xff0c;所以对于C9等专业的学生来说&#xff0c;可以考虑转向一些冷…

Python轴承故障诊断 (17)基于TCN-CNN并行的一维故障信号识别模型

往期精彩内容&#xff1a; Python-凯斯西储大学&#xff08;CWRU&#xff09;轴承数据解读与分类处理 Python轴承故障诊断 (一)短时傅里叶变换STFT Python轴承故障诊断 (二)连续小波变换CWT_pyts 小波变换 故障-CSDN博客 Python轴承故障诊断 (三)经验模态分解EMD_轴承诊断 …

Cannot access aliyunmaven ( xxx ) in offline mode and the artifact

记一次Maven无脑报错 报错提示&#xff1a; Cannot access aliyunmaven (https://maven.aliyun.com/repository/public) in offline mode and the artifact 当看到这个报错信息后&#xff0c;首先想到的就是maven环境变量是否配置正确&#xff0c;然而经过一番查看后&#xf…

minio数据迁移工具rclone使用

文章目录 前言一、下载rclone二、安装配置三、迁移命令结尾 前言 Rclone是一个命令行程序&#xff0c;用于管理云存储上的文件。它是云供应商的web存储接口的一个功能丰富的替代品。超过40种云存储产品支持rclone&#xff0c;包括S3对象存储、企业和消费者文件存储服务以及标准…

mysql 索引(为什么选择B+ Tree?)

索引实现原理 索引&#xff1a;排好序的数据结构 优点&#xff1a;降低I/O成本&#xff0c;CPU的资源消耗&#xff08;数据持久化在磁盘中&#xff0c;每次查询都得与磁盘交互&#xff09; 缺点&#xff1a;更新表效率变慢&#xff0c;&#xff08;更新表数据&#xff0c;还要…

DockerFile遇到的坑

CMD 命令的坑 dockerfile 中的 CMD 命令在docker run -it 不会执行 CMD 命令。 FROM golang WORKDIR / COPY . ./All-in-one CMD ["/bin/sh","-c","touch /kkk.txt && ls -la"] RUN echo alias ll"ls -la" > ~/.bashrc(不…

【LeetCode热题100】101. 对称二叉树(二叉树)

一.题目要求 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 二.题目难度 简单 三.输入样例 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&a…