Python爬虫进阶教程!搞定动态渲染、反爬、批量爬取与数据存储(实战向)
看完上一篇零基础爬虫入门教程,相信大家已经可以熟练爬取静态网页、抓取简单文本并保存本地文件。但很多小伙伴实操后会发现一个问题:入门代码只能爬简单静态页面,遇到大部分现代网站直接失效。
比如:网页数据是滚动加载的、普通请求抓不到内容、频繁请求被封IP、数据杂乱无法统计、网站直接拦截爬虫请求等。这些问题,都是进阶爬虫必须解决的核心痛点。
今天这篇进阶实战教程,专门承接入门内容,不讲空洞原理,只讲工作、练手高频用到的进阶技能:动态网页爬取、高阶反爬绕过、批量分页爬取、Excel结构化存储、多线程提速、IP限流规避,全程附带可直接运行的完整代码。
合规前置提醒:本文所有案例仅用于个人编程学习、技术练手,禁止用于商业爬取、批量薅数据、攻击服务器、抓取隐私及付费内容,合规爬虫是技术学习的底线!
一、先搞懂:入门爬虫为什么会失效?
入门阶段我们用 requests + BeautifulSoup 爬取的是静态HTML页面,也就是网页一次性加载完成、源码中直接包含所有数据的页面。
而现在90%的网站都是动态JS渲染页面,核心特点:
-
初始HTML源码为空,数据靠AJAX接口异步加载
-
滚动页面、点击按钮后才会加载新数据
-
数据接口加密、携带校验参数,直接请求会报错
-
网站存在UA校验、Cookie校验、频率限制、指纹校验等反爬机制
所以进阶爬虫的核心学习目标:突破静态限制,适配动态网站,规避基础反爬,实现批量自动化爬取。
二、进阶必备库安装(一次性配齐)
除了入门的两个基础库,进阶需要用到动态爬取、数据存储、提速延时核心库,终端一键安装:
pip install requests beautifulsoup4 selenium openpyxl time random
库功能简单说明:
-
selenium:模拟真实浏览器,破解JS动态渲染数据
-
openpyxl:将爬虫数据保存为Excel表格,结构化存储,方便统计分析
-
time + random:实现随机延时,模拟人类浏览行为,规避IP封禁
三、核心进阶1:动态JS网页爬虫(解决数据加载为空)
这是新手进阶最大的卡点!静态爬虫抓不到动态数据,我们直接用 Selenium 模拟真人打开浏览器、等待页面加载,完美获取渲染后的完整数据。
优势:无需分析复杂接口、无需破解加密参数、适配所有动态网页,新手友好。
完整实战代码(可直接运行)
# 导入进阶所需库 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Options import time import random # 配置浏览器参数,优化爬虫效果 chrome_options = Options() # 可选:无头模式,后台运行浏览器,不弹出窗口 # chrome_options.add_argument("--headless=new") # 伪装浏览器,规避基础反爬 chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36") # 禁止弹窗、规避自动化检测 chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"]) chrome_options.add_experimental_option("useAutomationExtension", False) # 初始化浏览器 driver = webdriver.Chrome(options=chrome_options) # 设置页面加载超时时间 driver.set_page_load_timeout(10) # 目标网页(动态公开测试页面) url = "https://www.baidu.com" try: # 打开网页 driver.get(url) # 随机延时,模拟真人浏览(核心防封) time.sleep(random.uniform(1, 3)) # 获取页面标题和动态渲染后的完整数据 title = driver.title print(f"网页标题:{title}") # 精准提取页面所有链接元素 link_list = driver.find_elements(By.TAG_NAME, "a") print("\n动态渲染页面链接数据:") for link in link_list: text = link.text.strip() href = link.get_attribute("href") if text and href: print(f"文本:{text} | 链接:{href}") except Exception as e: print(f"爬取异常:{e}") finally: # 关闭浏览器 driver.quit()
关键进阶知识点讲解
-
无头模式:注释开启后,浏览器后台静默运行,不弹窗,适合批量爬取
-
关闭自动化检测:规避网站识别Selenium爬虫的核心配置,90%新手爬虫被识别都是缺少该配置
-
随机延时:摒弃固定1秒延时,采用1-3秒随机等待,更贴合真人操作,大幅降低被封概率
-
元素定位:Selenium支持按标签、class、id、文本精准定位元素,比BeautifulSoup适配性更强
四、核心进阶2:数据结构化存储(保存为Excel表格)
入门教程中我们将数据保存为TXT文本,缺点是数据杂乱、无法筛选统计。进阶场景中,Excel结构化存储是最常用的方式,数据分类清晰、可直接用于数据分析。
下面实现:爬取数据 → 自动整理格式 → 写入Excel → 自动保存
完整实战代码
import requests from bs4 import BeautifulSoup from openpyxl import Workbook import time import random # 伪装请求头 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } # 初始化Excel工作簿 wb = Workbook() # 创建工作表 ws = wb.active ws.title = "网站链接数据" # 写入表头 ws.append(["链接文本", "链接地址"]) # 目标网址 url = "https://www.baidu.com" try: # 随机延时请求 time.sleep(random.uniform(0.5, 2)) response = requests.get(url, headers=headers, timeout=10) response.encoding = "utf-8" soup = BeautifulSoup(response.text, "html.parser") # 解析数据并写入Excel a_list = soup.find_all("a") for a in a_list: text = a.get_text().strip() href = a.get("href") if text and href: ws.append([text, href]) print(f"已写入:{text}") # 保存Excel文件 wb.save("爬虫结构化数据.xlsx") print("\n全部数据爬取完成!已保存为Excel文件") except Exception as e: print(f"爬取失败:{e}")
运行后会自动生成Excel文件,数据分两列整齐排列,后续可直接用于筛选、统计、复盘。
五、核心进阶3:批量分页爬取(多页面自动化采集)
真实爬虫场景中,数据都分布在多页页面,手动改URL爬取效率极低。进阶核心技能:循环遍历分页URL,实现全自动批量爬取。
原理:大部分网站分页URL存在规律(page=1、page=2、page=3...),通过循环批量请求即可。
通用分页爬取模板(万能适配)
import requests from bs4 import BeautifulSoup from openpyxl import Workbook import time import random headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" } # 初始化Excel wb = Workbook() ws = wb.active ws.title = "分页爬取数据" ws.append(["页面数", "链接文本", "链接地址"]) # 批量爬取1-3页(可自行修改页数) for page in range(1, 4): # 分页URL规律,多数网站均可套用此格式 url = f"https://www.baidu.com?page={page}" print(f"\n正在爬取第{page}页数据...") # 随机延时防封 time.sleep(random.uniform(1, 2.5)) response = requests.get(url, headers=headers, timeout=10) response.encoding = "utf-8" soup = BeautifulSoup(response.text, "html.parser") # 解析当前页数据 a_list = soup.find_all("a") for a in a_list: text = a.get_text().strip() href = a.get("href") if text and href: ws.append([f"第{page}页", text, href]) # 保存全部数据 wb.save("分页批量爬取数据.xlsx") print("\n所有分页数据爬取完成!")
该模板为通用进阶模板,只需修改目标URL和数据解析规则,即可适配绝大多数分页网站。
六、进阶反爬绕过技巧(解决90%访问失败问题)
入门只学了UA伪装,进阶场景需要全套基础反爬绕过方案,针对新手高频报错问题做全方位优化:
1. 完整请求头伪装(解决403封禁)
单一UA容易被识别,带上完整浏览器请求参数,伪装度拉满:
headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36", "Referer": "https://www.baidu.com/", "Accept-Language": "zh-CN,zh;q=0.9", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" }
2. 随机延时 + 频率限制
固定延时极易被检测,随机区间延时是基础防封标配,杜绝高频请求:
time.sleep(random.uniform(1, 3))
3. 超时重试机制(解决网络波动报错)
新增请求重试逻辑,避免单次请求失败导致程序终止,提升爬虫稳定性:
for i in range(3): # 最多重试3次 try: response = requests.get(url, headers=headers, timeout=10) break except: time.sleep(2) continue
4. 禁用自动化特征(Selenium专属)
解决Selenium爬虫被精准识别的核心问题,前文代码已集成,是动态爬虫必备配置。
七、新手进阶高频误区避坑
-
误区1:频繁无间隔请求网站 ✅ 正确做法:必须加随机延时,批量爬取切忌极速请求
-
误区2:动态网页强行用静态爬虫解析 ✅ 正确做法:源码无数据时,直接切换Selenium动态爬取
-
误区3:所有数据保存TXT文本 ✅ 正确做法:结构化数据优先Excel,方便后续处理
-
误区4:单次请求失败直接终止程序 ✅ 正确做法:增加重试、异常捕获,提升爬虫稳定性
八、进阶后后续学习路线
掌握本文所有内容,你已经超越80%的爬虫新手,后续可以针对性深耕高阶技能:
-
接口抓包爬虫:F12抓包分析AJAX接口,直接请求JSON数据,速度远超浏览器模拟
-
代理IP池:解决高频爬取IP封禁问题,实现大规模数据采集
-
验证码破解:学习滑块、点选、图文验证码识别,突破登录反爬
-
异步爬虫:aiohttp异步请求,大幅提升爬取效率
-
数据库存储:MySQL、MongoDB存储海量爬虫数据
九、进阶总结
爬虫进阶的核心本质,就是适配更复杂的网页、规避更严格的反爬、实现更高效自动化、存储更规范的数据。
入门爬虫拼基础语法,进阶爬虫拼适配能力和容错思维。本文的动态爬取、Excel存储、批量分页、反爬绕过,是所有爬虫实战项目的通用核心框架,熟练掌握后,可应对绝大多数个人练手、小型项目的数据采集需求。
写在最后:本篇进阶教程承接上篇零基础内容,形成完整的入门+进阶爬虫学习体系。后续会持续更新抓包逆向、异步爬虫、验证码破解等高阶实战案例,喜欢可以收藏关注!
更多推荐
所有评论(0)