Python 网络爬虫进阶:动态网页爬取与反爬机制应对

在上一篇文章中,我们学习了如何使用 Python 构建一个基本的网络爬虫。然而,在实际应用中,许多网站使用动态内容加载或实现反爬机制来阻止未经授权的抓取。因此,本篇文章将深入探讨以下进阶主题:

  • 如何处理动态加载的网页内容
  • 应对常见的反爬机制
  • 爬虫性能优化

通过具体实例,我们将探讨更复杂的网络爬虫开发技巧。


一、动态网页爬取

现代网页通常通过 JavaScript 加载动态内容。直接使用 requests 获取的 HTML 可能不包含目标数据。这时,我们可以使用 selenium 模拟浏览器行为来抓取动态内容。


1. 安装与配置 Selenium

安装 Selenium 和浏览器驱动
pip install selenium

下载对应浏览器的驱动程序(如 ChromeDriver),并将其路径添加到系统变量中。

初始化 WebDriver

以下是一个基本的 Selenium 配置:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.keys import Keys
import time# 设置浏览器驱动路径
driver_path = "path/to/chromedriver"
service = Service(driver_path)# 初始化 WebDriver
driver = webdriver.Chrome(service=service)# 打开网页
driver.get("http://quotes.toscrape.com/js/")
time.sleep(2)  # 等待动态内容加载# 获取网页内容
print(driver.page_source)# 关闭浏览器
driver.quit()

2. 爬取动态加载的名言

通过 Selenium 提取动态内容:

# 初始化 WebDriver
driver = webdriver.Chrome(service=Service("path/to/chromedriver"))
driver.get("http://quotes.toscrape.com/js/")# 等待内容加载
time.sleep(2)# 提取名言和作者
quotes = driver.find_elements(By.CLASS_NAME, "quote")
for quote in quotes:text = quote.find_element(By.CLASS_NAME, "text").textauthor = quote.find_element(By.CLASS_NAME, "author").textprint(f"名言: {text}\n作者: {author}\n")driver.quit()

3. 处理翻页

动态页面通常通过点击“下一页”按钮加载更多内容。我们可以模拟用户操作实现翻页爬取。

# 自动翻页爬取
while True:quotes = driver.find_elements(By.CLASS_NAME, "quote")for quote in quotes:text = quote.find_element(By.CLASS_NAME, "text").textauthor = quote.find_element(By.CLASS_NAME, "author").textprint(f"名言: {text}\n作者: {author}\n")# 点击下一页按钮try:next_button = driver.find_element(By.CLASS_NAME, "next")next_button.click()time.sleep(2)  # 等待页面加载except:print("已到最后一页")breakdriver.quit()

二、应对反爬机制

很多网站会通过检测 IP、User-Agent 或频繁访问行为来阻止爬虫。以下是一些常见反爬机制和应对策略:


1. 模拟真实用户行为

设置请求头

在 HTTP 请求中,添加 User-Agent 模拟浏览器。

headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.199 Safari/537.36"
}response = requests.get("http://example.com", headers=headers)
随机延迟

为避免触发频率限制,爬取时可以随机添加延迟。

import time
import randomtime.sleep(random.uniform(1, 3))  # 随机延迟 1 到 3 秒

2. 使用代理 IP

通过代理 IP 隐藏爬虫的真实 IP,防止被封禁。

proxies = {"http": "http://your_proxy:port","https": "http://your_proxy:port"
}response = requests.get("http://example.com", proxies=proxies)
自动获取免费代理

可以使用爬虫定期抓取免费代理(如西刺代理),并动态切换 IP。


3. 验证码处理

部分网站使用验证码拦截爬虫。应对策略包括:

  • 手动输入:提示用户输入验证码。
  • 验证码识别服务:如 平台 提供的 API。
  • 避开验证码:尝试通过 API 或其他无需验证码的接口获取数据。

三、性能优化

当需要爬取大量数据时,爬虫的性能优化尤为重要。


1. 多线程或多进程

使用多线程或多进程提高爬取效率:

多线程示例
import threadingdef fetch_data(url):response = requests.get(url)print(f"{url} 完成")urls = ["http://example.com/page1", "http://example.com/page2"]threads = []
for url in urls:thread = threading.Thread(target=fetch_data, args=(url,))threads.append(thread)thread.start()for thread in threads:thread.join()

2. 异步爬取

使用 aiohttpasyncio 实现异步爬取。

import aiohttp
import asyncioasync def fetch(session, url):async with session.get(url) as response:return await response.text()async def main():urls = ["http://example.com/page1", "http://example.com/page2"]async with aiohttp.ClientSession() as session:tasks = [fetch(session, url) for url in urls]results = await asyncio.gather(*tasks)for content in results:print(content)asyncio.run(main())

3. 数据去重

避免重复爬取相同数据,可以使用哈希或数据库记录已访问 URL。

visited = set()if url not in visited:visited.add(url)# 执行爬取

四、实战案例:动态商品价格爬取

以下示例演示如何抓取电商网站动态加载的商品价格,并应对翻页和反爬机制。

from selenium import webdriver
from selenium.webdriver.common.by import By
import timedriver = webdriver.Chrome(service=Service("path/to/chromedriver"))
driver.get("https://example-ecommerce.com")# 等待加载
time.sleep(3)# 爬取商品信息
while True:items = driver.find_elements(By.CLASS_NAME, "product-item")for item in items:name = item.find_element(By.CLASS_NAME, "product-title").textprice = item.find_element(By.CLASS_NAME, "product-price").textprint(f"商品: {name}, 价格: {price}")# 尝试翻页try:next_button = driver.find_element(By.CLASS_NAME, "next-page")next_button.click()time.sleep(2)  # 等待页面加载except:print("已到最后一页")breakdriver.quit()

五、总结

通过本篇文章,你学习了以下进阶爬虫技巧:

  1. 使用 Selenium 处理动态网页。
  2. 应对常见反爬机制,如设置代理、随机延迟等。
  3. 提升爬取性能的方法,包括多线程和异步爬取。

下一步,建议尝试构建一个完整的爬虫项目,如爬取新闻网站、商品价格监控等,并学习如何处理复杂的反爬场景。祝你爬虫之路越走越远!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flink高可用配置(HA)

从Flink架构中我们可以看到,JobManager这个组件非常重要,是中心协调器,负责任务调度和资源管理。默认情况下,每个Flink集群只有一个JobManager实例。这会产生单点故障(SPOF):如果JobManager崩溃,则无法提交新程序,正在运行的程序也会失败。通过JobManager的高可用性,…

基于Springboot的流浪宠物管理系统

基于javaweb的流浪宠物管理系统 介绍 基于javaweb的流浪宠物管理系统的设计与实现,后端框架使用Springbootmybatis,前端框架使用Vuehrml,数据库使用mysql,使用B/S架构实现前台用户系统和后台管理员系统,和不同权限级别…

unity 绿幕抠图

1.硬件:Insta360 Link 2C摄像机 2.引用shader Shader "Demo/ChromaKey" { Properties { _MainTex("Texture", 2D) "white" {} _KeyColor("KeyColor", Color) (0,1,0,0) _TintColor(&q…

Linux中离线安装gcc

gcc在安装一些其他工具的经常用到,在此记录下如何安装gcc。 1.在线安装 yum -y install gcc 2.离线安装 2.1 获取安装包链接: https://pan.baidu.com/s/1oDvt64ByWs1w-evz5TXU7w?pwd9cfo mpfr-3.1.1-4.el7.x86_64.rpmlibmpc-1.0.1-3.el7.x86_64.rp…

继续完善wsl相关内容:基础指令

文章目录 前言一、我们需要安装wsl,这也是安装docker desktop的前提,因此我们在这篇文章里做了介绍:二、虽然我们在以安装docker desktop为目的时,不需要安装wsl的分发(distribution),但是装一个分发也是有诸多好处的:三、在使用wsl时,不建议把东西直接放到系统里,因…

GITEX GLOBAL聚焦AI创新,Soul App创始人张璐团队带来多模态社交新体验

2024年10月,全球瞩目的科技盛会GITEX GLOBAL在迪拜举行。作为全球三大IT展之一,GITEX GLOBAL一直是展示全球尖端科技的重要平台,今年吸引了全球超6700家科技企业及创新公司参展。 在此次展会中,Soul App创始人张璐团队携自主研发的多模态大模型首次在国际大型展会亮相,展示了其…

C++——map相关的oj题

前言:菜鸟写博客给自己看,我是菜鸟。 1:随机链表的复制 1.1题目要求: 1.2解题思路: 可以分两步来实现代码: ①先将示例1链表中的val值以及next的指向关系深拷贝到另一个新的链表当中 ②再处理新链表中&am…

go web单体项目 学习总结

为什么学习go 博主的主语言是Java,目前的工作也是做Java web开发,有了Java的经验后就想着再学一门语言,其实有两个原因,第一是基于兴趣,也想和Java对比下到底有什么不同,在学习go的时候让我更加了解了Java…

paimon的四种changelog模式(2)-none模式

# 请先了解input模式 环境创建 CREATE CATALOG fs_catalog WITH (typepaimon,warehousefile:/data/soft/paimon/catalog );USE CATALOG fs_catalog;drop table if exists t_changelog_none ;CREATE TABLE t_changelog_none (age BIGINT,money BIGINT,hh STRING,PRIMARY KEY (h…

新型大语言模型的预训练与后训练范式,阿里Qwen

前言:大型语言模型(LLMs)的发展历程可以说是非常长,从早期的GPT模型一路走到了今天这些复杂的、公开权重的大型语言模型。最初,LLM的训练过程只关注预训练,但后来逐步扩展到了包括预训练和后训练在内的完整…

NAT:连接私有与公共网络的关键技术(4/10)

一、NAT 的工作原理 NAT 技术的核心功能是将私有 IP 地址转换为公有 IP 地址,使得内部网络中的设备能够与外部互联网通信。其工作原理主要包括私有 IP 地址到公有 IP 地址的转换、端口号映射以及会话表维护这几个步骤。 私有 IP 地址到公有 IP 地址的转换&#xff1…

notepad++文件github下载

1、github下载网址:Releases notepad-plus-plus/notepad-plus-plus GitHub 2、找到操作系统支持的软件: 3、CSDN下载链接:https://download.csdn.net/download/u013083576/90046203

【AI绘画】Midjourney进阶:色调详解(下)

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AI绘画 | Midjourney 文章目录 💯前言💯Midjourney中的色彩控制为什么要控制色彩?为什么要在Midjourney中控制色彩? 💯色调纯色调灰色调暗色调 &#x1f4af…

【MySQL篇】持久化和非持久化统计信息的深度剖析(第一篇,总共六篇)

💫《博主介绍》:✨又是一天没白过,我是奈斯,DBA一名✨ 💫《擅长领域》:✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux,也在扩展大数据方向的知识面✌️…

PH热榜 | 2024-11-27

DevNow 是一个精简的开源技术博客项目模版,支持 Vercel 一键部署,支持评论、搜索等功能,欢迎大家体验。 在线预览 1. Agentplace 标语:这是一个能创建互动式AI网站和应用的平台。 介绍:Agentplace是一个平台&#xf…

ffmpeg 增亮 docker 使用

使用最新的 docker pull jrottenberg/ffmpeg docker run -it --rm -v /path/to/input:/input -v /path/to/output:/output jrottenberg/ffmpeg <ffmpeg command>比如我想增亮 在 /home 目录下 有一个 video.mp4 docker run --rm -v /home:/home jrottenberg/ffmpeg:7…

单片机学习笔记 11. 外部中断

更多单片机学习笔记&#xff1a;单片机学习笔记 1. 点亮一个LED灯单片机学习笔记 2. LED灯闪烁单片机学习笔记 3. LED灯流水灯单片机学习笔记 4. 蜂鸣器滴~滴~滴~单片机学习笔记 5. 数码管静态显示单片机学习笔记 6. 数码管动态显示单片机学习笔记 7. 独立键盘单片机学习笔记 8…

【PyTorch】(基础一)----pytorch环境搭建

PyTorch环境搭建 该系列笔记主要参考了小土堆的视频教程&#xff0c;传送门&#xff1a;P1. PyTorch环境的配置及安装&#xff08;Configuration and Installation of PyTorch)【PyTorch教程】_哔哩哔哩_bilibili PyTorch 是一个开源的机器学习库&#xff0c;主要用 Python 编…

uniapp开发支付宝小程序自定义tabbar样式异常

解决方案&#xff1a; 这个问题应该是支付宝基础库的问题&#xff0c;除了依赖于官方更新之外&#xff0c;开发者可以利用《自定义 tabBar》曲线救国 也就是创建一个空内容的自定义tabBar&#xff0c;这样即使 tabBar 被渲染出来&#xff0c;但从视觉上也不会有问题 1.官方文…

YOLOv11融合PIDNet中的PagFM模块及相关改进思路

YOLOv11v10v8使用教程&#xff1a; YOLOv11入门到入土使用教程 YOLOv11改进汇总贴&#xff1a;YOLOv11及自研模型更新汇总 《PIDNet: A Real-time Semantic Segmentation Network Inspired by PID Controllers》 一、 模块介绍 论文链接&#xff1a;https://arxiv.org/pdf/2…