初学者如何用 Python 写第一个爬虫?
?? 欢迎来到我的博客! 非常高兴能在这里与您相遇。在这里,您不仅能获得有趣的技术分享,还能感受到轻松愉快的氛围。无论您是编程新手,还是资深开发者,都能在这里找到属于您的知识宝藏,学习和成长。
?? 博客内容包括:
- Java核心技术与微服务:涵盖Java基础、JVM、并发编程、Redis、Kafka、Spring等,帮助您全面掌握企业级开发技术。
- 大数据技术:涵盖Hadoop(HDFS)、Hive、Spark、Flink、Kafka、Redis、ECharts、Zookeeper等相关技术。
- 开发工具:分享常用开发工具(IDEA、Git、Mac、Alfred、Typora等)的使用技巧,提升开发效率。
- 数据库与优化:总结MySQL及其他常用数据库技术,解决实际工作中的数据库问题。
- Python与大数据:专注于Python编程语言的深度学习,数据分析工具(如Pandas、NumPy)和大数据处理技术,帮助您掌握数据分析、数据挖掘、机器学习等技术。
- 数据结构与算法:总结数据结构与算法的核心知识,提升编程思维,帮助您应对大厂面试挑战。
?? 我的目标:持续学习与总结,分享技术心得与解决方案,和您一起探索技术的无限可能!在这里,我希望能与您共同进步,互相激励,成为更好的自己。
?? 欢迎订阅本专栏,与我一起在这个知识的海洋中不断学习、分享和成长!???
??版权声明:本博客所有内容均为原创,遵循CC 4.0 BY-SA协议,转载请注明出处。
目录
一、爬虫的基本概念
1. 爬虫的定义
2. 爬虫的主要工作流程
3. 常用 Python 工具
二、环境准备
1. 安装 Python
2. 安装必要库
三、写第一个简单的爬虫
1. 完整代码示例
2. 代码逐步解析
1)发送 HTTP 请求
2)检查请求状态
3)解析 HTML 数据
4)提取网页内容
5)打印结果
四、改进爬虫功能
1. 添加请求头
2. 控制爬取频率
3. 保存数据
五、应对复杂网页
1. 动态加载网页
2. 爬取图片或文件
六、爬虫的注意事项
1. 遵守法律和道德
2. 处理异常
3. 避免过于频繁的请求
网页爬虫是一种通过程序自动抓取网页数据的技术。对于初学者来说,使用 Python 写一个简单的爬虫是一个很好的入门项目。Python 提供了许多强大的工具和库,如 requests
和 BeautifulSoup
,可以帮助快速实现网页数据的爬取。
在本文中,我们将从爬虫的基本概念开始,逐步实现一个可以抓取网页内容的简单爬虫,并探讨如何改进爬虫以应对复杂场景。我们将从以下几个方面展开:
一、爬虫的基本概念
1. 爬虫的定义
爬虫(Web Crawler)是一种自动化脚本或程序,它会模拟用户访问网页的行为,从而提取网页中的特定内容。
2. 爬虫的主要工作流程
一个典型的爬虫任务通常包括以下步骤:
-
发送请求:通过 HTTP 协议访问目标网页,获取其 HTML 内容。
-
解析数据:对获取到的 HTML 进行解析,提取我们需要的数据。
-
存储数据:将提取到的数据保存到文件或数据库中,便于后续处理。
3. 常用 Python 工具
-
**requests**
:发送 HTTP 请求,获取网页内容。 -
**BeautifulSoup**
:解析 HTML 或 XML 数据,提取特定内容。 -
**re**
(正则表达式):对复杂文本模式进行匹配和提取。 -
**pandas**
:对数据进行清洗和分析。
二、环境准备
1. 安装 Python
确保你的计算机上已经安装了 Python(推荐使用 3.7 及以上版本)。如果尚未安装,可以从 Python 官方网站 下载并安装。
2. 安装必要库
打开命令行或终端,运行以下命令安装我们需要的 Python 库:
pip install requests beautifulsoup4
-
**requests**
:用于发送 HTTP 请求。 -
**beautifulsoup4**
:用于解析 HTML 数据。
三、写第一个简单的爬虫
我们来实现一个简单的爬虫,它将抓取某个网页的标题和正文内容。
1. 完整代码示例
以下代码实现了一个基本的爬虫:
import requests
from bs4 import BeautifulSoupdef simple_crawler(url):try:# 1. 发送请求response = requests.get(url)response.raise_for_status() # 检查请求是否成功# 2. 解析网页内容soup = BeautifulSoup(response.text, 'html.parser')# 3. 提取标题和段落内容title = soup.find('title').text # 获取网页标题paragraphs = soup.find_all('p') # 获取所有段落内容print(f"网页标题: {title}
")print("网页内容:")for p in paragraphs:print(p.text)except requests.exceptions.RequestException as e:print(f"请求失败: {e}")# 示例网址
url = "https://example.com" # 替换为你想爬取的网页地址
simple_crawler(url)
2. 代码逐步解析
1)发送 HTTP 请求
response = requests.get(url)
-
使用
requests.get()
方法向目标网址发送 GET 请求。 -
返回的
response
对象包含网页的所有内容,包括 HTML 源代码。
2)检查请求状态
response.raise_for_status()
- 通过
raise_for_status()
检查请求是否成功。如果返回的 HTTP 状态码表示错误(如 404 或 500),会抛出异常。
3)解析 HTML 数据
soup = BeautifulSoup(response.text, 'html.parser')
-
BeautifulSoup
用于解析 HTML 内容,并将其转化为 Python 对象,方便后续操作。 -
第二个参数
'html.parser'
指定使用 Python 内置的 HTML 解析器。
4)提取网页内容
title = soup.find('title').text
paragraphs = soup.find_all('p')
-
find('title')
方法返回<title>
标签的内容。 -
find_all('p')
方法返回所有段落标签<p>
,并以列表形式存储。
5)打印结果
for p in paragraphs:print(p.text)
- 遍历提取到的段落内容,并打印每个段落的文本。
四、改进爬虫功能
1. 添加请求头
一些网站会检测爬虫程序并阻止访问。可以通过添加请求头来模拟浏览器访问。
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)
2. 控制爬取频率
为了避免对目标网站造成过高的负载,可以在每次请求后添加延时。
import timedef delay_request(url):response = requests.get(url)time.sleep(2) # 等待 2 秒return response
3. 保存数据
将爬取的数据保存为文件或数据库。
保存到文件:
with open("output.txt", "w", encoding="utf-8") as f:f.write(f"标题: {title}
")for p in paragraphs:f.write(p.text + "
")
保存到 CSV 文件:
import csvwith open("output.csv", "w", newline="", encoding="utf-8") as csvfile:writer = csv.writer(csvfile)writer.writerow(["段落内容"])for p in paragraphs:writer.writerow([p.text])
五、应对复杂网页
1. 动态加载网页
对于 JavaScript 渲染的网页,requests
无法获取完整内容,可以使用 selenium
或 playwright
。
示例(使用 selenium):
from selenium import webdriverurl = "https://example.com"# 配置 WebDriver
driver = webdriver.Chrome()
driver.get(url)# 获取动态加载的内容
html = driver.page_source
print(html)# 关闭浏览器
driver.quit()
2. 爬取图片或文件
import os# 下载图片
img_url = "https://example.com/image.jpg"
response = requests.get(img_url)# 保存图片
with open("image.jpg", "wb") as f:f.write(response.content)
六、爬虫的注意事项
1. 遵守法律和道德
-
避免违反法律:确保爬取行为符合目标网站的使用条款。
-
尊重 robots.txt 文件:通过
robots.txt
查看目标网站的爬取限制。
2. 处理异常
对于网络请求失败、数据缺失等情况,添加异常处理逻辑:
try:response = requests.get(url)response.raise_for_status()
except requests.exceptions.RequestException as e:print(f"请求失败: {e}")
3. 避免过于频繁的请求
可以设置延时或使用代理 IP:
proxies = {"http": "http://123.45.67.89:8080","https": "http://123.45.67.89:8080"
}
response = requests.get(url, proxies=proxies)
相关文章:

初学者如何用 Python 写第一个爬虫?
?? 欢迎来到我的博客! 非常高兴能在这里与您相遇。在这里,您不仅能获得有趣的技术分享,还能感受到轻松愉快的氛围。无论您是编程新手,还是资深开发者,都能在这里找到属于您的知识宝藏,学习和成长。 ?? …...
Cocos Creator3.8.6拖拽物体的几种方式
文章目录 前言一、第一种通过UILocation二、第二种通过UIDelta实现总结 前言 在游戏开发中,拖拽物体是一个非常常见的交互功能,无论是用于UI元素的拖动,还是场景中物体的移动,拖拽操作都能极大地提升用户体验。Cocos Creator 3.8…...
分布式Session
我用「餐厅点餐代码实战」帮你彻底搞懂分布式Session,看完不仅能应对面试,还能直接应用到实际开发。先记住这个核心矛盾:多服务员如何记住同一顾客的喜好? 一、从生活场景理解Session的本质 传统单机场景(小餐馆&…...
Kotlin 运算符重载
在Kotlin中,常用的运算符重载函数名如下: 1.算术操作符: 加法:plus 减法:minus 乘法:times 除法:div 取模:rem 或 mod 整数除法:floorDiv 求幂:pow 自增&…...

OpenHarmony4.1-轻量与小型系统ubuntu开发环境
因OpenHarmony官网提供包含轻量、小型与标准系统的全量代码非常宠大,解包后大概需要70G以上硬盘空间,如要编译标准系统则需要140G以上空间。 如硬盘空间有限与只使用轻量/小型OpenHarmony系统,则可以下载并直接使用本人裁剪源码过的ubuntu硬盘…...

AVR 单片机硬件供电处理
摘自AVR 单片机应用笔记:AN2519 - AVR Microcontroller Hardware Design Considerations。 2. 供电 供电设计是任何硬件设计的关键一环,直接影响到系统的性能。在设计供电时,有两个重要的方面需要考虑:ESD 防护和噪声干扰。这些内…...
LeetCode 27 移除元素
LeetCode 27 - 移除元素(Remove Element)是一个简单但经典的双指针问题,主要考察数组操作的基本功。虽然问题容易,但掌握多种解法以及衍生的变体问题对解决更复杂的操作数组问题有帮助。 题目描述 输入:整数数组 nums…...
对“预训练”的理解
预训练有什么用 传统的机器学习是偏数学的,对数据的量不做过多要求,而深度学习的项目通常是有大量的数据可供使用。 在平常的任务或者项目中,我们可能并没有大量数据,只有少量数据,在这时我们就可以通过“借用”有大…...

论文阅读:CAN GENERATIVE LARGE LANGUAGE MODELS PERFORM ASR ERROR CORRECTION?
CAN GENERATIVE LARGE LANGUAGE MODELS PERFORM ASR ERROR CORRECTION? 生成式大语言模型能否进行自动语音识别(ASR)纠错? https://arxiv.org/pdf/2307.04172 文章目录 速览常规总结通俗版 摘要(Abstract)2. 引言&a…...
Stable Diffusion(SD)系列模型及关联算法深度解析
一、基础模型架构演进 SD v1.5 核心架构:基于Latent Diffusion Model(LDM),通过VAE将图像压缩至潜空间进行扩散训练,支持512x512分辨率生成,兼容二次元与写实风格混合创作12。 训练数据&…...

FPGA开发,使用Deepseek V3还是R1(3):系统级与RTL级
以下都是Deepseek生成的答案 FPGA开发,使用Deepseek V3还是R1(1):应用场景 FPGA开发,使用Deepseek V3还是R1(2):V3和R1的区别 FPGA开发,使用Deepseek V3还是R1&#x…...
logback日志输出配置范例
logback日志输出配置范例 在wutool中,提供了logback日志输出配置范例,实现日志文件大小限制、滚动覆盖策略、定时清理等功能。 关于wutool wutool是一个java代码片段收集库,针对特定场景提供轻量解决方案,只要按需选择代码片段…...

【开源免费】基于SpringBoot+Vue.JS酒店管理系统(JAVA毕业设计)
本文项目编号 T 224 ,文末自助获取源码 \color{red}{T224,文末自助获取源码} T224,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...

Unity中动态切换光照贴图LightProbe的方法
关键代码:LightmapSettings.lightmaps lightmapDatas; LightmapData中操作三张图:lightmapColor,lightmapDir,以及一张ShadowMap 这里只操作前两张: using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI;public cl…...
linux(2)用户管理
文章目录 1. 切换用户2. 添加删除用户3.写改密码 1. 切换用户 # 切换用户名,不切换工作目录 su 用户名 # 一起切换工作目录 su - 用户名 # 退出用户 exit2. 添加删除用户 # 添加用户 sudo adduser username # 推荐sudo useradd -m -s /bin/bash 用户名-m 如果创建…...

在鸿蒙HarmonyOS手机上安装hap应用
一、下载工具 安装hap包需要用到小工具 。 二、解压到目录后,进入该文件夹,打开命令行,如下图 三、将下载好的hap包放入刚才解压的文件夹内(假设hap包文件名为app.hap) 四、连接好手机和电脑,手机需要打…...

MacBook Pro使用FFmpeg捕获摄像头与麦克风推流音视频
FFmpeg查看macos系统音视频设备列表 ffmpeg -f avfoundation -list_devices true -i "" 使用摄像头及麦克风同时推送音频及视频流: ffmpeg -f avfoundation -pixel_format yuyv422 -framerate 30 -i "0:1" -c:v libx264 -preset ultrafast -b:v 1000k -…...
工程化与框架系列(8)--持续集成实践
持续集成实践 🔄 持续集成(Continuous Integration,简称CI)是现代前端开发流程中的重要环节,它通过自动化构建、测试和部署,帮助团队更快速、更可靠地交付高质量代码。本文将详细介绍前端持续集成的实践方…...
Python核心技术,Django学习基础入门教程(附环境安装包)
文章目录 前言1. 环境准备1.1Python安装1.2选择Python开发环境1.3 创建虚拟环境1.4 安装 Django 2. 创建 Django 项目3. Django项目结构介绍4. 启动开发服务器5. 创建 Django 应用6. 应用结构介绍7. 编写视图函数8. 配置 URL 映射9. 运行项目并访问视图10. 数据库配置与模型创建…...

【Qt-信号与槽】connect函数的用法
🏠个人主页:Yui_ 🍑操作环境:Qt Creator 🚀所属专栏:Qt 文章目录 1.信号和槽的概念1.1 信号的本质1.2 槽的本质1.3 补充说明2. 信号和槽的使用2.1 connect函数介绍2.2 connect函数的简单使用2.2.1 图形化方…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...

cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
Python 高效图像帧提取与视频编码:实战指南
Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

C++实现分布式网络通信框架RPC(2)——rpc发布端
有了上篇文章的项目的基本知识的了解,现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...