高效Python爬虫:多进程与异步抓取思路

目录

  1. 🔹 多进程
    • 使用场景
    • 进程池应用
    • 多进程有序抓取
    • 多进程无序抓取
    • 多进程爬虫操作实践
  2. 🔹 异步抓取
    • 异步阻塞和非阻塞
    • 异步抓取应用场景
    • 异步关键字和aiohttp
    • 异步抓取百万数据思路

多进程

🔹 多进程使用场景

多进程适用于CPU密集型任务,例如数据处理、复杂计算等。对于爬虫来说,当网络I/O操作较多时,多进程可以有效提高抓取速度。


🔹 进程池应用

使用multiprocessing库的Pool类来管理进程池,提高资源利用率。

python 复制代码
from multiprocessing import Pool
import os

def worker(num):
    print(f"Worker {num} in process {os.getpid()}")

if __name__ == "__main__":
    with Pool(4) as pool:
        pool.map(worker, range(10))

🔹 在这个示例中,我们创建了一个包含4个进程的进程池,并使用map方法将任务分配给进程池中的进程。


🔹 多进程有序抓取

有序抓取确保抓取结果按照任务分配顺序返回。

python 复制代码
from multiprocessing import Pool
import requests

def fetch(url):
    response = requests.get(url)
    return response.text

if __name__ == "__main__":
    urls = ['http://example.com/page1', 'http://example.com/page2', 'http://example.com/page3']
    with Pool(4) as pool:
        results = pool.map(fetch, urls)
    for content in results:
        print(content[:100])

🔹 使用map方法保证结果按顺序返回。


🔹 多进程无序抓取

无序抓取不保证任务结果的返回顺序。

python 复制代码
from multiprocessing import Pool
import requests

def fetch(url):
    response = requests.get(url)
    return response.text

if __name__ == "__main__":
    urls = ['http://example.com/page1', 'http://example.com/page2', 'http://example.com/page3']
    with Pool(4) as pool:
        results = pool.imap_unordered(fetch, urls)
    for content in results:
        print(content[:100])

🔹 使用imap_unordered方法不保证返回顺序。


🔹 多进程爬虫操作实践

综合应用多进程技术进行爬虫操作。

python 复制代码
from multiprocessing import Pool
import requests
from bs4 import BeautifulSoup

def fetch(url):
    response = requests.get(url)
    soup = BeautifulSoup(response.text, 'html.parser')
    return soup.title.string

if __name__ == "__main__":
    urls = ['http://example.com/page1', 'http://example.com/page2', 'http://example.com/page3']
    with Pool(4) as pool:
        titles = pool.map(fetch, urls)
    for title in titles:
        print(title)

🔹 在这个示例中,我们使用多进程并行抓取网页数据,并提取每个网页的标题。


异步抓取

🔹 异步阻塞和非阻塞

异步编程可以显著提高I/O密集型任务的性能。阻塞意味着等待操作完成,非阻塞则立即返回继续执行。

python 复制代码
import asyncio

async def main():
    print('Hello ...')
    await asyncio.sleep(1)
    print('... World!')

asyncio.run(main())

🔹 这个简单示例展示了如何使用异步编程等待1秒钟。


🔹 异步抓取应用场景

异步适用于大量网络I/O操作,例如大规模网页抓取。


🔹 异步关键字和aiohttp

使用async和await关键字与aiohttp库进行异步抓取。

python 复制代码
import aiohttp
import asyncio

async 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', 'http://example.com/page3']
    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[:100])

asyncio.run(main())

🔹 使用aiohttp进行异步HTTP请求,可以显著提高抓取速度。


🔹 异步抓取百万数据思路

抓取大量数据时,可以分批次进行,提高稳定性。

python 复制代码
import aiohttp
import asyncio

async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()

async def batch_fetch(urls):
    async with aiohttp.ClientSession() as session:
        tasks = [fetch(session, url) for url in urls]
        return await asyncio.gather(*tasks)

async def main():
    base_url = 'http://example.com/page'
    all_urls = [f"{base_url}{i}" for i in range(1, 1000001)]
    batch_size = 1000
    for i in range(0, len(all_urls), batch_size):
        batch_urls = all_urls[i:i + batch_size]
        results = await batch_fetch(batch_urls)
        for content in results:
            print(content[:100])

asyncio.run(main())

🔹 通过分批次抓取,我们可以更高效、更稳定地处理大量数据抓取任务。


总结

🔹 通过本次学习,我们深入了解了多进程和异步编程在Python爬虫中的应用,包括多进程的使用场景、进程池应用、有序与无序抓取、多进程爬虫操作实践,以及异步编程的阻塞与非阻塞、异步抓取应用场景、关键字和aiohttp库的使用,以及异步抓取百万数据的思路。

🔹 掌握这些技术后,我们可以更高效地进行大规模网页数据抓取,为数据分析和处理提供坚实的基础。希望这些内容能够帮助大家更好地理解和应用多进程与异步编程,提高爬虫抓取效率!🚀

相关推荐
第九序言T18 小时前
Python 数据处理进阶(十八)批量处理同结构文件:一个文件夹一次跑完
开发语言·python·自动化·pandas·数据处理
Java后端的Ai之路18 小时前
CAS并发控制-从CPU指令到企业级乐观锁
vue.js·人工智能·python·cas·乐观锁
qq_4260039618 小时前
UI自动化高频次登录login限流解决方案
python·ui·自动化
Sakura_j_h_18 小时前
EasyEDA PCB 快速设计Skills
c++·python·github
龙亘川19 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
程序喵大人19 小时前
【C++入门】内存模型与资源管理 - 09 shared_ptr 和 weak_ptr 解决共享,也带来代价
开发语言·c++·资源管理·智能指针·内存模型
quantdash_cc19 小时前
如何验证历史行情的交易日期是否完整覆盖研究区间?
python·数据分析·pandas·量化交易·股票数据·quantdash
I Am a robert girl20 小时前
当智能体学会“串通”:从长程交互中读懂涌现式合谋
python·多智能体系统·多智能体协作·llm agent·涌现式合谋·对齐问题·激励机制设计
Raas10020 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
云和数据.ChenGuang20 小时前
光哥说Python RAG 系统需要哪些评估指标:从检索到生成的全链路评测指南
网络·人工智能·python·算法·langchain