一、同步爬虫的瓶颈

传统的同步爬虫(如requests+BeautifulSoup)在请求网页时,必须等待服务器返回响应后才能继续下一个请求。这种阻塞式I/O操作在面对大量数据时存在以下问题:

  1. 速度慢:每个请求必须串行执行,无法充分利用网络带宽。
  2. 易被封禁:高频请求可能触发IP限制或验证码。
  3. 资源浪费:CPU在等待I/O时处于空闲状态。

解决方案:异步爬虫(Asynchronous Crawling)
Python的asyncio+aiohttp库可以实现非阻塞I/O,允许同时发起多个请求,大幅提升爬取效率。

二、异步爬虫技术选型

技术方案适用场景优势
aiohttpHTTP请求异步HTTP客户端,支持高并发
asyncio事件循环Python原生异步I/O框架
aiofiles异步文件存储避免文件写入阻塞主线程
uvloop加速事件循环替换asyncio
默认循环,性能提升2-4倍

三、实战:异步爬取新浪财经股票数据

目标

  • 爬取新浪财经A股股票实时行情(代码、名称、价格、涨跌幅等)。
  • 使用aiohttp实现高并发请求。
  • 存储至CSV文件,避免数据丢失。

步骤1:分析数据接口

新浪财经的股票数据通常通过API返回,我们可以通过浏览器开发者工具(F12)抓包分析:

  • 示例接口:https://finance.sina.com.cn/realstock/company/sh600000/nc.shtml
  • 数据格式:部分数据直接渲染在HTML中,部分通过Ajax加载(如分时数据)。

步骤2:安装依赖库

步骤3:编写异步爬虫代码

import asyncio
import aiohttp
import aiofiles
from bs4 import BeautifulSoup
import csv
import time# 替换为新浪财经股票列表API(示例)
STOCK_LIST_API = "https://finance.sina.com.cn/stock/sl/stock_list.html"
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"
}async def fetch(session, url):"""异步获取网页内容"""async with session.get(url, headers=HEADERS) as response:return await response.text()async def parse_stock_data(html):"""解析股票数据(示例:仅提取名称和价格)"""soup = BeautifulSoup(html, "html.parser")stock_name = soup.select_one(".stock-name").text.strip() if soup.select_one(".stock-name") else "N/A"stock_price = soup.select_one(".price").text.strip() if soup.select_one(".price") else "N/A"return {"name": stock_name, "price": stock_price}async def save_to_csv(data, filename="stocks.csv"):"""异步写入CSV"""async with aiofiles.open(filename, mode="a", encoding="utf-8", newline="") as f:writer = csv.writer(f)await writer.writerow([data["name"], data["price"]])async def crawl_stock(stock_code, session):"""爬取单只股票数据"""url = f"https://finance.sina.com.cn/realstock/company/{stock_code}/nc.shtml"try:html = await fetch(session, url)data = await parse_stock_data(html)await save_to_csv(data)print(f"爬取成功:{stock_code} - {data['name']}")except Exception as e:print(f"爬取失败:{stock_code} - {str(e)}")async def main():"""主协程:并发爬取多个股票"""stock_codes = ["sh600000", "sh601318", "sz000001"]  # 示例股票代码(可扩展)# 使用uvloop加速(仅限Unix系统)try:import uvloopasyncio.set_event_loop_policy(uvloop.EventLoopPolicy())except ImportError:pass# 创建aiohttp会话async with aiohttp.ClientSession() as session:tasks = [crawl_stock(code, session) for code in stock_codes]await asyncio.gather(*tasks)if __name__ == "__main__":start_time = time.time()asyncio.run(main())print(f"爬取完成,耗时:{time.time() - start_time:.2f}秒")

四、性能优化策略

1. 控制并发量

新浪财经可能限制高频请求

2. 使用代理IP

避免IP被封:

3. 随机User-Agent

减少被识别为爬虫的概率:

4. 数据存储优化

  • 异步数据库写入:如aiomysqlasyncpg
  • 批量写入:减少I/O次数。
import asyncio
import aiohttp
from bs4 import BeautifulSoup
import pandas as pd
from fake_useragent import UserAgent
import aiomysql# 使用 Semaphore 限制并发数
semaphore = asyncio.Semaphore(10)  # 最大并发 10# 代理信息
proxyHost = "www.16yun.cn"
proxyPort = "5445"
proxyUser = "16QMSOML"
proxyPass = "280651"# 构造代理 URL
PROXY = f"http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}"# 随机 User-Agent
ua = UserAgent()# 数据库配置
DB_CONFIG = {'host': 'localhost','port': 3306,'   user': 'your_username','password': 'your_password','db': 'your_database','charset': 'utf8mb4'
}# 数据存储优化:异步数据库写入
async def save_to_db(data):conn = await aiomysql.connect(**DB_CONFIG)async with conn.cursor() as cur:await cur.executemany("INSERT INTO finance_data (column1, column2, column3) VALUES (%s, %s, %s)", data)await conn.commit()conn.close()# 爬取单个股票数据
async def crawl_stock(stock_code, session):async with semaphore:url = f"https://finance.sina.com.cn/stock/{stock_code}.html"HEADERS = {"User-Agent": ua.random}async with session.get(url, headers=HEADERS, proxy=PROXY) as response:html = await response.text()data = parse(html)return data# 解析网页内容
def parse(html):soup = BeautifulSoup(html, 'html.parser')# 假设数据在特定的表格中table = soup.find('table', {'class': 'example'})data = []for row in table.find_all('tr'):cols = row.find_all('td')cols = [ele.text.strip() for ele in cols]data.append([ele for ele in cols if ele])return data# 主函数
async def main(stock_codes):async with aiohttp.ClientSession() as session:tasks = [crawl_stock(stock_code, session) for stock_code in stock_codes]all_data = await asyncio.gather(*tasks)# 扁平化数据flat_data = [item for sublist in all_data for item in sublist]# 异步批量写入数据库await save_to_db(flat_data)# 示例股票代码列表
stock_codes = ['000001','000002',# 更多股票代码
]# 运行爬虫
asyncio.run(main(stock_codes))

五、对比同步与异步爬虫性能

指标同步爬虫(requests)异步爬虫(aiohttp)
100次请求耗时~20秒~3秒
CPU占用低(大量时间在等待)高(并发处理)
反爬风险高(易触发封禁)较低(可控并发)

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

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

相关文章

Visual Studio Code (VSCode) Python 开发环境配置完整指南

一、安装准备 1. 安装 VSCode 官网下载: Visual Studio Code - Code Editing. Redefined安装时建议勾选: "添加到PATH" (方便终端调用)"注册为受支持的文件类型编辑器"2. 安装 Python 官网下载: Download Python | Python.org安装时勾选: "Add Pytho…

智能数据标签引擎:企业级分类分级与动态管控实践

在数字化转型浪潮中,企业数据量呈爆发式增长,数据的多样性和复杂性也不断提升。如何对海量数据进行高效分类分级,并实施动态管控,成为企业释放数据价值、保障数据安全的关键挑战。智能数据标签引擎应运而生,它通过引入…

Redis(1)——RDB持久化

在追求极致性能的 Redis 世界里,数据安全是永恒的主题。作为内存数据库,Redis 重启或宕机意味着数据丢失的风险。RDB (Redis Database) 持久化,又称快照持久化,是 Redis 提供的最经典、最高效的数据落地方案之一。它通过生成某个时…

深度剖析无感刷新Token:领码SPARK平台赋能微服务认证的智能实践

摘要 在现代微服务架构与数字化转型大潮中,用户身份认证的连续性与安全性尤为关键。无感刷新Token技术通过智能的双Token机制,确保用户访问凭证在不打扰用户的前提下自动续期,避免因Token过期导致的频繁登录中断。本文结合领码SPARK融合平台的…

声网对话式 AI:开启我的编程进阶之旅

转行学习编程时,复杂的代码逻辑常让我无从下手,直到遇见声网对话式AI。它像一位耐心的导师,不仅用通俗易懂的语言帮我理解Python循环嵌套等难点,还提供实际代码示例。当我开发学生成绩管理系统时,它甚至直接生成框架代…

精准护理,点亮进行性核上性麻痹患者生活希望

进行性核上性麻痹(PSP)是一种罕见的神经系统变性疾病,主要表现为姿势平衡障碍、眼球运动障碍、吞咽困难等症状。科学的健康护理能有效延缓病情进展,提升患者生活质量,可从以下方面着手。 ​在饮食护理上,因…

记录一次 Oracle 表空间不足问题的解决过程

记录一次 Oracle 表空间不足问题的解决过程 6月14日,某医院信息科用户反映无法提交门诊病例,门诊处方也无法开立。其他功能是正常的。考虑可能是与门诊病例有关的表空间用完了。 Oracle表空间的数据文件默认是可以自动增长的,但是单个文件的…

2024 年 11 月公链行业研报:比特币创历史新高引领市场全面上涨

比特币屡创历史新高,主导市场全面上涨,同时 Layer 1 表现强劲,而 Layer 2 格局持续演变。 2024 年 11 月公链研报 作者:Stella L (stellafootprint.network) 数据来源:Footprint Analytics 公链研究页面 2024 年 11…

MAX4622ESE+T双5Ω模拟开关在低失真音频路由中的实测:0.5Ω匹配度如何改善THD性能

一、产品概述:精密信号切换的硬件基石 MAX4622ESET是一款双通道SPDT(单刀双掷)模拟开关,采用5Ω超低导通电阻设计(典型值3Ω),专为高精度信号路由场景优化。其核心价值在于通过单片CMOS架构实现…

高并发秒杀系统(Redis分布式锁优化与库存防超卖实战)

本文通过日活百万级的电商秒杀案例,深度剖析分库分表路由算法在高并发场景下的落地实践。结合Redis分布式锁的优化方案解决库存超卖问题,包含完整架构设计、代码实现及压测数据对比。全文包含12个核心代码片段和8类技术图表,来自线上生产环境…

从loader和plugin开始了解webpack

目录 一、webpack中loader和plugin的区别1. Loader(每个 Loader 是一个函数或对象)2.plugin(每个 Plugin 是一个实例)3.自定义loader和plugin 二、Babel的功能三、Plugin中的compiler和compilation对象1. compiler对象2. compilat…

36-Oracle Statistics Gathering(统计信息收集)

小伙伴们,有没有因为统计信息不准,导致了业务卡顿,各种状况频出,这几天在实践和实操的过程中,时不时就需要进行统计信息的收集。同时统计信息收集的动作也是OCM必考内容。 数据库中的数据是地图,统计信息是…

Linux驱动程序(PWM接口)与超声波测距

一、利用阿里云服务器实现树莓派外网访问(SSH 反向代理) 1. 树莓派端配置 步骤 1:安装 SSH 服务(若未安装) sudo apt-get install openssh-server 步骤 2:创建反向代理连接 -p 22:指定阿里…

Web攻防-XSS跨站文件类型功能逻辑SVGPDFSWFHTMLXMLPMessageLocalStorage

知识点: 1、Web攻防-XSS跨站-文件类型-html&pdf&swf&svg&xml 2、Web攻防-XSS跨站-功能逻辑-postMessage&localStorage 一、演示案例-WEB攻防-XSS跨站-文件类型触发XSS-SVG&PDF&SWF&HTML&XML等 1、SVG-XSS SVG(Scalable Vect…

强大模型通过自我和解进步——Unsupervised Elicitation of Language Models——论文阅读笔记

本周关注的工作是:Unsupervised Elicitation of Language Models 这篇文章通篇体现了这样一件事——香蕉皮大需要香蕉大! 一句话总结 首先注意:这个工作不是面向对齐的,而是写【如何准备】对齐任务的Reward Model需要的数据集的…

Qt—(Qt初识,槽,信号,事件)

一 Qt初识 暂时不写了 我的理解是类似于c#,是一个组件库,不局限是一个组件框架。 二 Qt Core Qt Core 是 Qt 框架的基础模块,提供非 GUI 的核心功能: 核心类:QObject(信号槽机制)、QEvent&…

深度学习——基于卷积神经网络实现食物图像分类【2】(数据增强)

文章目录 引言一、项目概述二、环境准备三、数据预处理3.1 数据增强与标准化3.2 数据集准备 四、自定义数据集类五、构建CNN模型六、训练与评估6.1 训练函数6.2 评估函数6.3 训练流程 七、关键技术与优化八、常见问题与解决九、完整代码十、总结 引言 本文将详细介绍如何使用P…

详细说说分布式Session的几种实现方式

1. 基于客户端存储(Cookie-Based) 原理:将会话数据直接存储在客户端 Cookie 中 实现: // Spring Boot 示例 Bean public CookieSerializer cookieSerializer() {DefaultCookieSerializer serializer new DefaultCookieSerializ…

用mac的ollama访问模型,为什么会出现模型胡乱输出,然后过一会儿再访问,就又变成正常的

例子:大模型推理遇到内存不足 1. 场景还原 你在Mac上用Ollama运行如下代码(以Python为例,假设Ollama有API接口): import requestsprompt "请写一首关于夏天的诗。" response requests.post("http:…

简说 Linux 用户组

Linux 用户组 的核心概念、用途和管理方法,尽量简明易懂。 🌟 什么是 Linux 用户组? 在 Linux 系统中: 👉 用户组(group) 是一组用户的集合,用来方便地管理权限。 👉 用…