爬虫入门:从基础到实战全攻略
🧠 一、爬虫基础概念
1.1 爬虫定义
- 爬虫(Web Crawler)是模拟浏览器行为,自动向服务器发送请求并获取响应数据的一种程序。
- 主要用于从网页中提取结构化数据,供后续分析、展示或存储使用。
1.2 爬虫特点
- 数据碎片化:网页数据分散、不规则。
- 模拟用户行为:爬虫需要尽可能模拟正常用户的请求行为,以绕过反爬机制。
- 目标明确:聚焦爬虫有明确的目标网站与数据需求。
1.3 爬虫分类
类型 | 描述 |
---|---|
通用爬虫 | 面向大量网站抓取数据,如搜索引擎使用的爬虫 |
聚焦爬虫 | 有特定目标网站的数据采集任务 |
聚焦爬虫细分:
- 功能性爬虫:不直接获取数据,而是实现某些功能(如投票、抢票、短信轰炸等)
- 数据增量爬虫:持续获取新数据用于分析,常见于新闻资讯、价格监控等领域
1.4 爬虫流程
确认目标URL -> 发送请求 -> 获取响应 -> 提取数据 -> 处理/保存数据↖_____________可能继续解析新的URL__________________↙
1.5 Robots协议
- 是一个约定俗成的协议文件(
robots.txt
),用于告知爬虫哪些页面可以访问,哪些不能。 - 并非强制性标准,但应尊重该协议以避免法律风险。
1.6 爬虫的作用
- 数据采集(电商价格、天气预报、股票行情等)
- 软件测试(自动化测试接口)
- 抢票、刷票、短信轰炸(需谨慎使用)
- 网络安全(漏洞扫描、安全检测)
🔌 二、网络通信原理
2.1 基本流程
- 浏览器输入 URL(如
www.baidu.com
) - DNS 解析域名,返回 IP 地址
- 客户端(浏览器)通过 TCP/IP 协议连接服务器
- 发送 HTTP 请求
- 服务器处理请求并返回响应
- 客户端接收响应并渲染页面(HTML/CSS/JS)
2.2 URL 统一资源定位符
- 示例:
https://www.baidu.com/s?wd=搜索词
- 结构:
- 协议(http/https)
- 域名(主机名)
- 端口(默认80或443)
- 路径(路径+查询参数)
2.3 请求方法(HTTP Methods)
方法 | 描述 |
---|---|
GET | 请求获取资源,参数在URL中 |
POST | 提交数据给服务器,参数在请求体中 |
PUT | 更新资源 |
DELETE | 删除资源 |
2.4 请求组成
- 请求行(Method + Path + HTTP Version)
- 请求头(Headers)
- 请求体(Body,仅POST/PUT等有)
2.5 响应状态码
状态码 | 描述 | 备注 |
---|---|---|
200 | 请求成功 | 表示服务器已成功处理了请求,并返回请求的数据。 |
302 | 临时重定向 | 服务器要求客户端执行临时重定向(原始为GET请求),新的URL位于响应头中的 Location 字段。 |
303 | 查看其他位置 | 对于 POST 请求的响应,浏览器会自动重定向至新的 URL,该新地址位于 Location 中。 |
307 | 临时重定向 (GET) | 类似于 302,但明确指示 GET 请求应保持原样,不改变为 POST 或其他方法。 |
403 | 禁止访问 | 服务器理解请求,但拒绝执行它。可能是由于权限不足或被封禁 IP。 |
404 | 找不到页面 | 服务器找不到与请求 URI 相匹配的任何资源。 |
500 | 内部服务器错误 | 服务器遇到意外情况,无法完成请求。 |
503 | 服务不可用 | 通常是因为服务器正在进行维护或过载。可能会在响应中携带 Retry-After 头来提示客户端何时可以再次尝试连接。 |
📡 三、HTTP & HTTPS 协议详解
3.1 HTTP 协议
- 超文本传输协议,默认端口:80
- 明文传输,易被监听或篡改
3.2 HTTPS 协议
- HTTP + SSL/TLS 加密层,默认端口:443
- 更安全,防止中间人攻击
- 性能略低于 HTTP
3.3 SSL/TLS 的作用
- 数据加密:保证传输过程中的隐私
- 身份验证:确保客户端连接的是正确的服务器
🕵️♂️ 四、浏览器开发者工具(F12)
4.1 使用 F12 查看请求信息
- 打开“开发者工具” → Network(网络)面板
- 可查看:
- 请求 URL
- 请求方法(GET/POST)
- 请求头(Headers)
- 请求体(Body)
- 响应数据(Response)
- 响应状态码(Status Code)
4.2 注意事项
- 实际响应数据才是判断依据,不要依赖 Elements 中的 HTML 渲染结果。
- 有些数据由 JavaScript 动态加载,需查看 XHR/Fetch 请求。
📦 五、Requests 模块详解
5.1 requests 模块介绍
- Python 第三方库,用于发送 HTTP 请求
- 支持 GET、POST、PUT、DELETE 等多种方法
- 安装命令:
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
5.2 常用方法
import requestsurl = "https://www.baidu.com"
response = requests.get(url)print(response.status_code) # 响应状态码
print(response.text) # 响应文本(str类型)
print(response.content) # 响应字节流(bytes类型)
print(response.headers) # 响应头
print(response.url) # 最终请求的URL(可能重定向)
5.3 response.text vs response.content
属性 | 类型 | 特点 |
---|---|---|
.text | str | 自动解码(可能乱码) |
.content | bytes | 原始字节流,适合下载图片、视频等二进制数据 |
5.4 设置编码格式
response.encoding = 'utf-8' # 手动指定解码方式
5.5 下载图片示例
url = "https://example.com/image.jpg"
res = requests.get(url)
with open("image.jpg", "wb") as f:f.write(res.content)
🧪 六、User-Agent 和 Headers 设置
6.1 User-Agent 概述
- 标识客户端身份(浏览器型号、操作系统等)
- 服务器会根据 UA 判断是否为合法浏览器
- 如果 UA 不合法,可能被识别为爬虫,返回 403 或 503 错误
6.2 构建请求头
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36..."
}
response = requests.get(url, headers=headers)
6.3 构建 User-Agent 池
- 防止频繁使用单一 UA 被封禁
- 示例:
user_agents = ["Mozilla/5.0 (Windows NT 10.0; Win64; x64)...","Mozilla/5.0 (iPad; CPU OS 16_6 like Mac OS X)...",...
]
import random
headers = {"User-Agent": random.choice(user_agents)}
6.4 使用 fake_useragent 库
pip install fake_useragent -i https://pypi.tuna.tsinghua.edu.cn/simple
from fake_useragent import UserAgent
ua = UserAgent()
headers = {"User-Agent": ua.random}
🌐 七、带参数请求(GET)
7.1 参数传递方式
- URL 编码参数(GET 请求)
- 表单数据(POST 请求)
元素 | 说明 |
---|---|
键(Key) | 参数名称,如 q , form |
值(Value) | 对应的参数值,如 学习 , QBLH |
分隔符 | 使用 = 连接键与值,多个参数之间使用 & 分隔 |
7.2 URL 参数传参
params = {"q": "学习"}
response = requests.get("https://cn.bing.com/search", params=params)
7.3 urllib.parse 模块
- 用于手动进行 URL 编码/解码
from urllib.parse import quote, unquoteprint(quote("学习")) # 输出:%E5%AD%A6%E4%B9%A0
print(unquote("%E5%AD%A6%E4%B9%A0")) # 输出:学习
🛡️ 八、反爬机制与应对策略
8.1 常见反爬手段
类型 | 描述 |
---|---|
IP 封锁 | 识别频繁访问的IP地址 |
UA 识别 | 检查 User-Agent 是否异常 |
Cookie 限制 | 登录后才可访问 |
JS 渲染限制 | 数据由 JavaScript 异步加载 |
CAPTCHA 验证 | 图形验证码拦截爬虫 |
请求频率控制 | 单位时间内请求数量限制 |
8.2 反反爬策略
方法 | 描述 |
---|---|
使用代理IP池 | 避免固定IP被封锁 |
随机 User-Agent | 模拟不同浏览器 |
添加 Referer | 模拟从其他页面跳转而来 |
设置延迟 | 控制请求频率(time.sleep()) |
使用 Selenium | 模拟浏览器操作动态网页 |
使用 Headless 浏览器 | 如 Puppeteer、Playwright |
📌 九、实战案例:构建简单搜索引擎爬虫
import requests
from fake_useragent import UserAgent
from urllib.parse import quoteua = UserAgent()
headers = {"User-Agent": ua.random}keyword = input("请输入你要搜索的内容:")
encoded_kw = quote(keyword)
url = "https://cn.bing.com/search"
params = {"q": encoded_kw}response = requests.get(url, headers=headers, params=params)
print(response.text)
✅ 十、注意事项与最佳实践
- 遵守 robots.txt:避免非法抓取敏感数据。
- 设置请求间隔:使用
time.sleep()
防止频繁请求。 - 使用代理 IP 池:提高稳定性与隐蔽性。
- 记录日志:便于调试与追踪问题。
- 异常处理:添加 try-except 捕获网络异常。
- 合理设置超时时间:
requests.get(timeout=5)
- 定期更新 User-Agent 池
- 关注网站结构变化:防止因页面结构调整导致解析失败
相关文章:
爬虫入门:从基础到实战全攻略
🧠 一、爬虫基础概念 1.1 爬虫定义 爬虫(Web Crawler)是模拟浏览器行为,自动向服务器发送请求并获取响应数据的一种程序。主要用于从网页中提取结构化数据,供后续分析、展示或存储使用。 1.2 爬虫特点 数据碎片化&…...
qemu安装risc-V 64
参考这篇文章https://developer.aliyun.com/article/1323996,其中在wsl下面安装可能会报错环境变量中有空格。 # clean_path.sh#!/bin/bash# 备份旧 PATH OLD_PATH"$PATH"# 过滤掉包含空格、制表符、换行的路径 CLEAN_PATH"" IFS: read -ra PA…...

JDBC连不上mysql:Unable to load authentication plugin ‘caching_sha2_password‘.
最近为一个spring-boot项目下了mysql-9.3.0,结果因为mysql版本太新一直报错连不上。 错误如下: 2025-06-01 16:19:43.516 ERROR 22088 --- [http-nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispat…...
AsyncIOScheduler与BackgroundScheduler的线程模型对比
1. BackgroundScheduler的线程机制 多线程模型:BackgroundScheduler基于线程池执行任务,默认通过ThreadPoolExecutor创建独立线程处理任务,每个任务运行在单独的线程中,主线程不会被阻塞。适用场景:适合同步…...
Python+MongoDb使用手册(精简)
这里是学了下面链接的内容,加上一些自己学习的内容综合的,大家也可以去看看这篇文章,写的特别好 【python】在Python中操作MongoDB的详细用法教程与实战案例分享_python轻松入门,基础语法到高阶实战教学-CSDN专栏 1 库࿱…...
前端面经 协商缓存和强缓存
HHTTPTTP缓存 协商缓存和强缓存 核心区别是否向服务器发起请求验证资源过期 强缓存 浏览器直接读取本地缓存,不发请求 HTTP响应头 Cache-Control:max-age3600资源有效期 Expires优先级低 如果有效浏览器返回200(浏览器换伪造的200) 应用静态资源 协商缓存 OK如果 1强缓…...

MacOS安装Docker Desktop并汉化
1. 安装Docker Desktop 到Docker Desktop For Mac下载对应系统的Docker Desktop 安装包,下载后安装,没有账号需要注册,然后登陆即可。 2. 汉化 前往汉化包下载链接下载对应系统的.asar文件 然后将安装好的文件覆盖原先的文件app.asar文件…...

Centos系统搭建主备DNS服务
目录 一、主DNS服务器配置 1.安装 BIND 软件包 2.配置主配置文件 3.创建正向区域文件 4.创建区域数据文件 5.检查配置语法并重启服务 二、从DNS服务配置 1.安装 BIND 软件包 2.配置主配置文件 3.创建缓存目录 4.启动并设置开机自启 一、主DNS服务器配置 1.安装 BIN…...
VUE项目部署IIS服务器手册
IIS部署Vue项目完整手册 📋 目录 基础概念准备工作Vue项目构建web.config详解IIS部署步骤不同场景配置常见问题实用配置模板 基础概念 Vue单页应用(SPA)工作原理 重要理解:Vue项目是单页应用,这意味着:…...

使用 HTML + JavaScript 实现在线考试系统
在现代的在线教育平台中,在线考试系统是不可或缺的一部分。本文将通过一个完整的示例,演示如何使用 HTML、CSS 和 JavaScript 构建一个支持多种题型的在线考试系统。 效果演示 项目概述 本项目主要包含以下核心功能: 支持4种常见题型&…...

谷歌工作自动化——仙盟大衍灵机——仙盟创梦IDE
下载地址 https://chromewebstore.google.com/detail/selenium-ide/mooikfkahbdckldjjndioackbalphokd https://chrome.zzzmh.cn/info/mooikfkahbdckldjjndioackbalphokd...
嵌入式(C语言篇)Day13
嵌入式Day13 一段话总结 文档主要介绍带有头指针和尾指针的单链表的实现及操作,涵盖创建、销毁、头插、尾插、按索引/数据增删查、遍历等核心操作,强调头插/尾插时间复杂度为O(1),按索引/数据操作需遍历链表、时间复杂度为O(n),并…...
Oracle 的V$LOCK 视图详解
Oracle 的V$LOCK 视图详解 V$LOCK 是 Oracle 数据库中最重要的动态性能视图之一,用于显示当前数据库中锁的持有和等待情况。 一、V$LOCK 视图结构 列名数据类型描述SIDNUMBER持有或等待锁的会话标识符TYPEVARCHAR2(2)锁类型标识符ID1NUMBER锁标识符1(…...

秒杀系统—1.架构设计和方案简介
大纲 1.秒杀系统的方案设计要点 2.秒杀系统的数据 页面 接口的处理方案 3.秒杀系统的负载均衡方案底层相关 4.秒杀系统的限流机制和超卖问题处理 5.秒杀系统的异步下单和高可用方案 1.秒杀系统的方案设计要点 (1)秒杀促销活动的数据处理 (2)秒杀促销活动的页面处理 (…...

基于FashionMnist数据集的自监督学习(生成式自监督学习AE算法)
目录 一,生成式自监督学习 1.1 简介 1.2 核心思想 1.3 常见算法 1.3.1 自动编码器(Autoencoder) 1.3.2 生成对抗网络(GANs) 1.3.3 变分自编码器(VAE) 1.3.4 Transformer-based 模型&…...

从监控到告警:Prometheus+Grafana+Alertmanager+告警通知服务全链路落地实践
文章目录 一、引言1.1 监控告警的必要性1.2 监控告警的基本原理1.2.1 指标采集与存储1.2.2 告警规则与触发机制1.2.3 多渠道通知与闭环 二、技术选型与架构设计2.1 为什么选择 Prometheus 及其生态2.1.1 Prometheus 优势分析2.1.2 Grafana 可视化能力2.1.3 Alertmanager 灵活告…...
AUTOSAR图解==>AUTOSAR_EXP_AIADASAndVMC
AUTOSAR高级驾驶辅助系统与车辆运动控制接口详解 基于AUTOSAR R22-11标准的ADAS与VMC接口规范解析 目录 1. 引言2. 术语和概念说明 2.1 坐标系统2.2 定义 2.2.1 乘用车重心2.2.2 极坐标系统2.2.3 车辆加速度/推进力方向2.2.4 倾斜方向2.2.5 方向盘角度2.2.6 道路变量2.2.7 曲率…...

WPF【09】WPF基础入门 (三层架构与MVC架构)
9-2 【操作】WPF 基础入门 新建一项目 Create a new project - WPF Application (A project for creating a .NET Core WPF Application) - Next - .NET 5.0 (Current) - Create 项目创建完成,VS自动打开 GUI用户界面,格式是 .xaml文件,跟xm…...

macOS 风格番茄计时器:设计与实现详解
macOS 风格番茄计时器:设计与实现详解 概述 本文介绍一款采用 macOS 设计语言的网页版番茄计时器实现。该计时器完全遵循苹果的人机界面指南(HIG),提供原汁原味的 macOS 使用体验,同时具备响应式设计和深色模式支持。 核心特性 原生 macOS…...
中文NLP with fastai - Fastai Part4
使用fastai进行自然语言处理 在之前的教程中,我们已经了解了如何利用预训练模型并对其进行微调,以执行图像分类任务(MNIST)。应用于图像的迁移学习原理同样也可以应用于NLP任务。在本教程中,我们将使用名为AWD_LSTM的预训练模型来对中文电影评论进行分类。AWD_LSTM是LSTM…...

oracle goldengate实现远程抽取postgresql 到 postgresql的实时同步【绝对无坑版,亲测流程验证】
oracle goldengate实现postgresql 到 postgresql的实时同步 源端:postgresql1 -> postgresql2 流复制主备同步 目标端:postgresql 数据库版本:postgresql 12.14 ogg版本:21.3 架构图: 数据库安装以及流复制主备…...
【MYSQL】索引篇(一)
1.为什么要有索引 索引的本质是一种数据结构,她的作用其实就是更好更快的帮我们找到数据库中存储的数据,就好比一本书,你想要找到指定的内容,但是如果在没有目录的情况下,你只能一页页的进行寻找,这样效率…...

ISCC-2025-web-wp
web 校赛 校赛靠着ENOCH师傅发力,也是一路躺进了区域赛,E师傅不好意思发这抽象比赛的wp(这比赛确实啥必到让人大开眼界,反正明年我是肯定不会打了),我就顺手要过来连着区域赛的一起发了 web 150分 按照提示进入/includes/fla…...
鸿蒙分辨率
鸿蒙手机App界面开发,UI元素应该以什么哪种屏幕尺寸为基准?换言之,做鸿蒙手机APP UI设计时,应该以哪种屏 PX转VP 华为开发者问答 | 华为开发者联盟 各单位换算API 华为开发者问答 | 华为开发者联盟 开源鸿蒙更改DPI 如何在Op…...
@Docker Compose 部署 Pushgateway
文章目录 Docker Compose 部署 Pushgateway1. 目的2. 适用范围3. 先决条件4. 部署步骤4.1 创建项目目录4.2 创建 docker-compose.yml 文件4.3 启动 Pushgateway 服务4.4 验证服务运行状态4.5 测试 Pushgateway 访问 5. 配置 Prometheus 采集 Pushgateway 数据6. 日常维护6.1 查…...
我们来学mysql -- 从库重启,是否同步主库数据
从库重启后,通常不需要重新复制主库的全部数据,然后再开启复制。MySQL 的主从复制机制设计了优雅的恢复流程,可以在从库重启后继续从上次中断的位置继续复制,前提是相关的日志和状态信息完整。 以下是详细解释: 从库…...

King3399(ubuntu文件系统)iic(i2c)功能测试
0 引言 前面两篇博文简要介绍了板子上uart部分的内容,但在驱动开发时,我们遇到的外设更多的是以i2c或spi进行通信,本文将对king3399的i2c进行测试并对硬件电路、设备树与驱动程序进行分析 如果使用的i2c设备不是mma8452,建议先看…...

德思特新闻 | 德思特与es:saar正式建立合作伙伴关系
德思特新闻 2025年5月9日,德思特科技有限公司(以下简称“德思特”)与德国嵌入式系统专家es:saar GmbH正式达成合作伙伴关系。此次合作旨在将 es:saar 的先进嵌入式开发与测试工具引入中国及亚太市场,助力本地客户提升产品开发效率…...

基于原生JavaScript前端和 Flask 后端的Todo 应用
Demo地址:https://gitcode.com/rmbnetlife/todo-app-js-flask.git Python Todo 应用 这是一个使用Python Flask框架开发的简单待办事项(Todo)应用,采用前后端分离架构。本项目实现了待办事项的添加、删除、状态切换等基本功能,并提供了直观…...
一些Dify聊天系统组件流程图架构图
分享一些有助于深入理解Dify聊天模块的架构图 整体组件架构图 #mermaid-svg-0e2XalGLqrRbH1Jy {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-0e2XalGLqrRbH1Jy .error-icon{fill:#552222;}#mermaid-svg-0e2XalGLq…...