使用Python语言编写一个简单的网页爬虫,用于抓取网站上的图片并保存到本地。

1. 简介

1.1. Python简介

嘿,朋友!欢迎来到Python的奇妙世界。Python是一种高级编程语言,就像一位博学多才的老教授,既懂得科学计算,又会搞艺术创作。无论你是要分析数据、编写网页爬虫,还是开发游戏,Python都能轻松应对。它的语法简洁明了,就像一首优美的诗歌,让人读起来心情愉悦。

1.2. 网页爬虫简介

网页爬虫,听起来是不是有点像科幻电影里的机器人?其实,它就是一种自动化程序,能够像一只勤劳的小蜜蜂一样,在互联网的花丛中采集数据。通过编写网页爬虫,你可以抓取网页上的各种信息,比如新闻标题、商品价格、图片链接等。这就像是给你一双透视眼,让你看到隐藏在网页背后的宝藏。

1.3. 目标与需求

我们的目标是写一个Python网页爬虫,专门用来抓取江河湖海的图片。想象一下,你坐在电脑前,轻轻一点鼠标,就能把世界各地的美丽风景尽收眼底,是不是很棒呢?为了实现这个目标,我们需要完成以下几个步骤:安装环境、编写代码、测试优化。准备好了吗?让我们一起开启这场冒险之旅吧!


2. 环境准备

2.1. 安装Python

首先,我们要确保你的电脑上已经安装了Python。如果没有的话,别担心,安装过程非常简单。你可以访问Python官网,下载最新版本的Python安装包。安装完成后,打开命令提示符(Windows)或终端(Mac/Linux),输入python --version,如果显示了Python的版本号,那就说明安装成功了。

2.2. 安装所需库

接下来,我们需要安装一些第三方库,这些库就像是Python的超级武器,能让我们的爬虫更加强大。我们将使用以下四个库:

  • requests:用于发送HTTP请求,获取网页内容。
    • BeautifulSoup4:用于解析HTML文档,提取有用信息。
    • os:用于操作文件和目录。
    • re:正则表达式模块,用于处理字符串匹配和替换。
      2.2.1 requests
pip install requests

2.2.2 BeautifulSoup4

pip install beautifulsoup4

2.2.3 os

pip install os

2.2.4 re

pip install re
2.3. 验证安装

安装完成后,我们可以简单测试一下这些库是否安装成功。打开你的IDE(如PyCharm、VS Code等),新建一个Python文件,然后输入以下代码:

import requests
from bs4 import BeautifulSoup
import os
import reprint("All libraries are installed successfully!")

如果运行后没有报错,并且输出了“All libraries are installed successfully!”,那就说明你的环境已经准备好了。接下来,我们就可以开始编写我们的爬虫代码了!


3. 编写代码

3.1. 导入所需库

首先,我们需要导入前面安装好的几个库。这些库就像是我们的工具箱,里面装满了各种有用的工具。

import requests
from bs4 import BeautifulSoup
import os
import re
3.2. 发送请求,获取网页内容

接下来,我们要向目标网站发送一个HTTP GET请求,获取网页的HTML内容。这里以百度图片为例,搜索关键词为“江河湖海”。

url = "https://image.baidu.com/search/index?tn=baiduimage&word=%E6%B1%9F%E6%B7%B1%E6%B5%B7%E6%B0%B4&ie=utf-8&fr=alambic"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"}response = requests.get(url, headers=headers)html_content = response.text```
#### 3.3. 提取图片链接有了网页的HTML内容后,我们就可以使用BeautifulSoup来解析它,并提取出所有图片的链接。这个过程就像是在一个巨大的迷宫里寻找宝藏一样刺激。
```python
soup = BeautifulSoup(html_content, 'html.parser')
images = soup.find_all('img')
image_links = [img['data-src'] for img in images if 'data-src' in img.attrs]
3.4. 下载图片并保存到本地

最后一步是将提取到的图片链接逐个下载下来,并保存到指定的文件夹中。我们可以使用os库来创建文件夹,然后将图片保存进去。

if not os.path.exists('river_lake_sea_images'):os.makedirs('river_lake_sea_images')
for link in image_links:response = requests.get(link, headers=headers)with open(f'river_lake_sea_images/{os.path.basename(link)}', 'wb') as file:file.write(response.content)```
#### 3.5. 完整代码示例将上面的所有代码整合在一起,就是一个完整的网页爬虫程序了。以下是完整的代码示例:
```python
import requests
from bs4 import BeautifulSoup
import os
import re# Step 1: Send request to get web content
url = "https://image.baidu.com/search/index?tn=baiduimage&word=%E6%B1%9F%E6%B7%B1%E6%B5%B7%E6%B0%B4&ie=utf-8&fr=alambic"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"}response = requests.get(url, headers=headers)html_content = response.text
# Step 2: Parse HTML and extract image links
soup = BeautifulSoup(html_content, 'html.parser')
images = soup.find_all('img')
image_links = [img['data-src'] for img in images if 'data-src' in img.attrs]# Step 3: Create directory and save images locally
if not os.path.exists('river_lake_sea_images'):os.makedirs('river_lake_sea_images')
for link in image_links:response = requests.get(link, headers=headers)with open(f'river_lake_sea_images/{os.path.basename(link)}', 'wb') as file:file.write(response.content)
print("Images downloaded successfully!")

4. 测试与优化

4.1. 测试抓取的图片数量和完整性

运行上述代码后,你应该会在当前目录下看到一个名为river_lake_sea_images的文件夹,里面存放着从百度图片搜索结果中下载的所有江河湖海图片。你可以手动检查一下这些图片的数量和质量,确保它们都符合预期。如果发现某些图片没有下载成功或者质量不佳,可以尝试调整代码中的参数或重新运行程序。

4.2. 优化代码,提高抓取效率和稳定性

虽然上述代码已经能够完成任务,但我们还可以进一步优化它,使其更加高效和稳定。例如:

  • 增加异常处理:在网络请求和文件操作过程中添加异常处理机制,防止因个别错误导致整个程序崩溃。
    • 多线程下载:使用多线程技术同时下载多个图片,提高下载速度。但需要注意的是,过多的线程可能会导致网络拥堵或被目标网站封禁IP地址。因此,需要根据实际情况合理设置线程数量。
    • 缓存机制:对于已经下载过的图片链接,可以将其存储在一个文件中作为缓存。下次运行时先检查缓存中是否有该链接对应的图片文件,如果有则直接跳过下载步骤。这样可以大大减少重复下载的时间和流量消耗。
    • 日志记录:在程序中添加日志记录功能,记录每次请求的URL、状态码以及下载的文件名等信息。这样有助于后期分析和调试问题。
      通过以上方法,我们可以使爬虫程序更加健壮和高效。当然,具体实现方式还需要根据实际需求进行调整和完善。希望这篇博客对你有所帮助!如果你有任何问题或建议,欢迎留言讨论哦~

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

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

相关文章

消防设施操作员高频考点

1、职业是指从业人员为获取主要生活来源所从事的社会工作类别。(正确) 2、职业活动以获得现金或实物等报酬为目的,这属于职业特征的(A)。 A、目的性 B、社会性 C、稳定性 D、规范性 解析:…

传输层协议TCP

一.TCP协议格式 对于传输层协议我们之前是学过了UDP,对于传输层协议是存在了一定的了解的,所以现在我们再来看TCP协议格式: 我们之前学过UDP的报文格式,所以源端口和目的端口是不需要进行再次讲解的,对于32序号和确认序…

【面试题】接口怎么测试?如何定位前后端的Bug?

接口怎么测试? 接口测试用来验证不同软件组件之间的交互是否正常。包括验证数据传输,参数传递,我在多个项目中有过测试接口的经验。(… 当进行接口测试时,会使用Postman和Python的Requests库。首先根据接口文档设计测…

【单点知识】基于PyTorch讲解自动编码器(Autoencoder)及其变种

文章目录 0. 前言1. 自动编码器的基本概念1.1 定义1.2 目标1.3 结构 2. PyTorch实现自动编码器2.1 导入必要的库2.2 定义自动编码器模型2.3 加载数据2.4 训练自动编码器 3. 自动编码器的意义4. 自动编码器的应用4.1 图像处理4.2自然语言处理:4.3推荐系统&#xff1a…

Redis篇

Redis使用场景 一、缓存穿透: 一个get请求: api/news/getById/1 1.缓存穿透:查询一个不存在的数据,mysql查询不到数据也不会直接写入缓存,导致每次请求都直接请求查询数据库,导致数据库的压力增大从而宕机 2.解决方案一:缓存空数据&#x…

每日一练:前缀和-矩阵区域和

1314. 矩阵区域和 - 力扣&#xff08;LeetCode&#xff09; 题目要求&#xff1a; 给你一个 m x n 的矩阵 mat 和一个整数 k &#xff0c;请你返回一个矩阵 answer &#xff0c;其中每个 answer[i][j] 是所有满足下述条件的元素 mat[r][c] 的和&#xff1a; i - k < r &…

革新车间照明,分布式IO模块引领智能制造新纪元

在智能制造的浪潮中&#xff0c;每一个细节的优化都是推动生产效率与能耗管理迈向新高度的关键。车间照明系统&#xff0c;作为生产环境中不可或缺的一环&#xff0c;其智能化升级正成为众多企业转型升级的重要着力点。 一、从传统到智能&#xff1a;照明系统的变革之旅 传统…

Oracle19C AWR报告分析之Operating System Statistics

Oracle19C AWR报告分析之Operating System Statistics 一、分析数据二、详细分析三、总结建议 Oracle 19C的AWR&#xff08;Automatic Workload Repository&#xff09;报告中的Operating System Statistics部分提供了操作系统层面的性能统计数据。这些指标对于分析数据库性能的…

项目进度计划表:详细的甘特图的制作步骤

甘特图&#xff08;Gantt chart&#xff09;&#xff0c;又称为横道图、条状图&#xff08;Bar chart&#xff09;&#xff0c;是一种用于管理时间和任务活动的工具。 甘特图由亨利劳伦斯甘特&#xff08;Henry Laurence Gantt&#xff09;发明&#xff0c;是一种通过条状图来…

【PyTorch][chapter 28] 揭秘 Transformer:缩放定律指南

概括 我们介绍了 LLM 的各种缩放定律&#xff0c;研究了模型损失如何随着训练数据和参数数量的增加而变化。讨论包括对用于解释 LLM 缩放定律的 IsoLoss 轮廓和 IsoFLOPs 切片的解释&#xff0c;从而为优化计算资源提供了见解。 最后&#xff0c;我们讨论了 FLOP 和 FLOPS 的概…

JavaSE(十四)——文件操作和IO

文章目录 文件操作和IO文件相关概念Java操作文件文件系统操作文件内容操作字节流FileOutputStreamFileInputStream代码演示 字符流FileWriterFileReader代码演示 缓冲流转换流 案例练习 文件操作和IO 文件相关概念 文件 通常指的是包含用户数据的文件&#xff0c;如文本文件、…

通过 SSH 管理 WordPress 网站的文件和目录

对于已经具备SSH基础知识的WordPress用户&#xff0c;进一步学习如何通过SSH命令管理网站的文件和目录至关重要。本文将介绍一些初级级别的SSH命令&#xff0c;帮助你更高效地管理WordPress网站的文件系统。 什么是 SSH 及其优势 SSH&#xff08;Secure Shell&#xff09;是一…

Cargo Rust 的包管理器

Cargo->Rust 的包管理器 Cargi简介Cargo 的主要功能1. 创建项目2. 管理依赖3. 构建项目4. 运行项目5. 测试代码6. 检查代码7. 生成文档8. 发布和分享包 Cargo 的核心文件1. Cargo.toml2. Cargo.lock **Cargo 的生态系统** 常用命令总结Hello, Cargo! 示例 Cargi简介 Cargo …

VTK知识学习(10)- 渲染引擎

1、前言 vtkProp; vtkAbstractMapper; vtkProperty; vtkCamera; vtkLight; vtkRenderer; vtkRenderWindow; vtkRenderWindowInteractor; vtkTransform; vtkLookupTable;………… 这些类都是与数据显示或渲染相关的。 用计算机图形学的专业词汇来说&#xff0c;就是它…

汽车安全再进化 - SemiDrive X9HP 与环景影像系统 AVM 的系统整合

当今汽车工业正面临著前所未有的挑战与机遇&#xff0c;随著自动驾驶技术的迅速发展&#xff0c;汽车的安全性与性能需求日益提高。在这样的背景下&#xff0c;汽车 AVM&#xff08;Automotive Visual Monitoring&#xff09;标准应运而生&#xff0c;成为促进汽车智能化和安全…

STL——vector(1)

博客ID&#xff1a;LanFuRenC系列专栏&#xff1a;C语言重点部分 C语言注意点 C基础 Linux 数据结构 C注意点 今日好题 声明等级&#xff1a;黑色->蓝色->红色 欢迎新粉加入&#xff0c;会一直努力提供更优质的编程博客&#xff0c;希望大家三连支持一下啦 目录 尾…

typecho博客主题美化总结篇—php单文件相册管理

看过我前面两期博客的都知道&#xff0c;最近lz在专心建设自己的博客。因为是基于typecho,用的朴素简洁的博客主题&#xff0c;就注定了各个模块都需要自己亲力亲为的去设计&#xff0c;开发。不过这种经由自己手从无到有&#xff0c;从朴素空白到唯美充实的过程确实也很值得期…

每日一练:【动态规划算法】斐波那契数列模型之

1. 第 N 个泰波那契数&#xff08;easy&#xff09; 1. 题目链接&#xff1a;1137. 第 N 个泰波那契数 2. 题目描述 3.题目分析 这题我们要求第n个泰波那契Tn的值&#xff0c;很明显的使用动态规划算法。 4.动态规划算法流程 1. 状态表示&#xff1a; 根据题目的要求及公…

SQL DQL查询操作

1.基本查询 select name,employee.workno,employee.age from employee;select employee.idcard as 身份证号 from employee;select employee.entrydate from employee; select distinct employee.entrydate from employee; 2.条件查询 where select * from employee where i…

Mysql 版本升级-二进制安装方式

8.0.20 -8.0.40 总体参考见下 fw_error_www 前置环境说明 glibc 版本&#xff0c;安装mysql二进制文件时需要匹配&#xff0c;安装的版本只能比系统的低 ldd --version# 查看库的位置 ldd which top | grep "libc.so"逻辑备份 卸载旧版本相关数据&#xff08;注…