Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤+实战技巧)
一、爬虫完整工作流程
以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明:
1. 目标分析与前期准备
- 网站技术分析:
- 使用浏览器开发者工具(F12)检查:
- Network面板查看数据加载方式(XHR请求/静态HTML)
- Elements面板分析DOM结构
- 识别反爬机制:
- 检查
robots.txt
(如:https://www.zhihu.com/robots.txt) - 测试直接访问是否返回完整数据
- 检查
- 使用浏览器开发者工具(F12)检查:
- 法律风险评估:
- 检查网站服务条款(如微博禁止未经授权的爬取)
- 控制爬取频率(建议≥3秒/请求)
实战案例:爬取知乎热榜需要先模拟登录获取cookies
2. 发送HTTP请求(核心环节)
请求方式选择
场景 | 工具 | 示例代码 |
---|---|---|
简单静态页 | requests | requests.get(url, headers=headers) |
动态渲染页 | selenium | driver.get(url); html = driver.page_source |
大规模爬取 | Scrapy | yield scrapy.Request(url, callback=self.parse) |
关键请求参数
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36","Cookie": "session_id=abc123","Referer": "https://www.example.com"
}proxies = {"http": "http://10.10.1.10:3128","https": "http://10.10.1.10:1080"
}response = requests.get(url,headers=headers,proxies=proxies,timeout=10
)
高级技巧
- 自动重试机制(应对429/503错误)
from tenacity import retry, stop_after_attempt@retry(stop=stop_after_attempt(3))
def fetch_url(url):return requests.get(url)
3. 内容解析(数据提取核心)
解析工具对比
工具 | 速度 | 易用性 | 适用场景 | 示例 |
---|---|---|---|---|
BeautifulSoup | 慢 | ★★★★★ | 简单页面 | soup.select('div.main') |
lxml | 快 | ★★★★ | XPath复杂查询 | tree.xpath('//div[@class="main"]') |
PyQuery | 中 | ★★★★ | jQuery风格 | doc('div.main').text() |
**实战解析示例
# BeautifulSoup + CSS选择器
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
titles = [h2.text for h2 in soup.select('h2.title')]# lxml + XPath(适合复杂嵌套)
from lxml import etree
tree = etree.HTML(html)
prices = tree.xpath('//span[@class="price"]/text()')# 正则表达式(提取特定模式)
import re
phones = re.findall(r'1[3-9]\d{9}', html)
4. 数据清洗与验证
- 文本处理:
- 去除空白字符:
text.strip()
- 统一编码:
text.encode('utf-8').decode('utf-8')
- 去除空白字符:
- 数据验证:
- 手机号校验:
re.match(r'^1[3-9]\d{9}$', phone)
- 邮箱校验:
re.match(r'^[\w.-]+@[\w.-]+\.\w+$', email)
- 手机号校验:
5. 数据存储方案
存储方式对比
存储类型 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
CSV | 无需数据库,Excel可打开 | 无索引,查询慢 | 小型数据集(<10万条) |
MySQL | 支持复杂查询,事务 | 需要维护数据库 | 结构化数据存储 |
MongoDB | 灵活Schema,适合JSON | 占用内存大 | 非结构化数据(如网页快照) |
Redis | 内存存储,速度快 | 数据易丢失 | 临时缓存/去重队列 |
**代码示例
# CSV存储
import csv
with open('data.csv', 'a', newline='') as f:writer = csv.writer(f)writer.writerow(['title', 'price'])# MySQL存储
import pymysql
conn = pymysql.connect(host='localhost', user='root', password='123456', db='spider')
cursor = conn.cursor()
cursor.execute("INSERT INTO products VALUES (%s, %s)", ('iPhone', 5999))
conn.commit()# MongoDB存储
from pymongo import MongoClient
client = MongoClient('mongodb://localhost:27017/')
db = client['spider_db']
db.products.insert_one({"name": "iPhone", "price": 5999})
6. 反爬对抗策略
常见反爬手段及破解方法
反爬类型 | 破解方案 | 实现代码 |
---|---|---|
User-Agent检测 | 轮换UA | headers['User-Agent'] = random.choice(ua_list) |
IP限制 | 代理IP池 | requests.get(url, proxies={"http": proxy}) |
验证码 | OCR识别/打码平台 | 使用ddddocr 库 |
行为分析 | 模拟鼠标移动 | selenium.ActionChains(driver).move_by_offset(10, 20) |
高级技巧
- 浏览器指纹模拟(使用
undetected-chromedriver
) - WebSocket协议抓取(如股票实时数据)
- 分布式爬虫架构(Scrapy+Redis)
7. 任务调度与监控
- 定时任务:
- 简单方案:
APScheduler
from apscheduler.schedulers.blocking import BlockingScheduler sched = BlockingScheduler() @sched.scheduled_job('interval', hours=1) def job():run_spider() sched.start()
- 简单方案:
- 异常监控:
- 邮件报警:
smtplib
发送错误日志 - Prometheus+Grafana监控爬虫状态
- 邮件报警:
二、完整爬虫项目架构
├── spiders/ # 爬虫核心
│ ├── base_spider.py # 基础爬虫类
│ ├── zhihu_spider.py # 知乎爬虫实现
│ └── douban_spider.py # 豆瓣爬虫实现
├── utils/
│ ├── proxy.py # 代理IP管理
│ ├── captcha.py # 验证码处理
│ └── logger.py # 日志系统
├── storage/
│ ├── mysql_client.py # 数据库操作
│ └── file_store.py # 文件存储
└── config.py # 全局配置
三、性能优化要点
-
并发控制:
- 多线程:
concurrent.futures.ThreadPoolExecutor
- 异步IO:
aiohttp
+asyncio
import aiohttp async def fetch(session, url):async with session.get(url) as response:return await response.text()
- 多线程:
-
缓存利用:
- 使用
requests-cache
避免重复请求
import requests_cache requests_cache.install_cache('demo_cache')
- 使用
-
增量爬取:
- 记录已爬URL:
Redis集合
去重 - 基于时间戳:只爬取
last_modified
之后的数据
- 记录已爬URL:
四、法律与道德规范
- 遵守
robots.txt
协议 - 控制爬取频率(≥3秒/请求)
- 不爬取敏感数据(用户隐私、商业秘密)
- 商用前获取网站授权
五、学习路线建议
- 初级阶段:
requests
+BeautifulSoup
实战 - 中级阶段:
Scrapy
框架 + 反爬破解 - 高级阶段:
- 分布式爬虫(Scrapy-Redis)
- 智能解析(机器学习识别页面结构)
- 浏览器自动化集群(Selenium Grid)
建议从豆瓣电影Top250这类开放数据开始练习,逐步挑战更复杂的网站如电商、社交媒体平台。
相关文章:
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...

ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...

相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...

【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...