提高爬虫性能的 5 个关键技巧:从并发到异步执行

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 本文介绍了提高网络爬虫性能的五个关键技巧:并发请求、异步执行、使用代理IP、限制请求频率与休眠时间、优化数据提取与存储。结合拼多多的实际案例,展示了如何通过这些技术优化爬虫效率,确保数据采集的高效性和稳定性。

爬虫代理.png

引言

随着互联网数据的爆炸式增长,网络爬虫技术在数据采集和信息整合中扮演着重要角色。然而,随着网页复杂性的增加和反爬虫机制的逐步完善,如何提高爬虫性能成为开发者面临的一大挑战。本文将探讨提高爬虫性能的五个关键技巧,并结合对拼多多的实际采集案例,展示如何通过并发、异步执行以及代理IP等技术来优化爬虫效率。

正文

1. 并发请求

并发请求是提高爬虫速度的核心策略之一。通过同时发起多个请求,爬虫可以极大减少等待时间,从而在单位时间内抓取更多数据。Python 的 threadingmultiprocessing 库可以实现简单的并发爬取。

示例

import threading
import requests

def fetch(url):
    response = requests.get(url)
    if response.status_code == 200:
        print(f"成功获取: {url}")
    else:
        print(f"获取失败: {url}")

urls = ["https://example.com/page1", "https://example.com/page2"]
threads = [threading.Thread(target=fetch, args=(url,)) for url in urls]

for thread in threads:
    thread.start()
for thread in threads:
    thread.join()

2. 异步执行

相较于并发,异步执行通过事件循环进一步提升爬虫性能。异步请求无需等待响应完成,而是立刻可以处理其他任务,极大地提高了网络 IO 密集型任务的效率。Python 的 asyncioaiohttp 是常用的异步库。

示例

import aiohttp
import asyncio

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

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

urls = ["https://example.com/page1", "https://example.com/page2"]
asyncio.run(main(urls))

3. 使用代理IP

由于许多网站对同一IP地址的访问频率有限制,使用代理IP可以绕过这些限制,提高爬虫的可持续性和稳定性。代理IP还可以帮助避开反爬虫机制。本文以爬虫代理为例,通过用户名和密码认证实现代理。

示例代码

import requests

# 代理配置 亿牛云爬虫代理加强版 www.16yun.cn
proxy_host = "proxy.16yun.cn"
proxy_port = "8100"
proxy_username = "用户名"
proxy_password = "密码"

proxies = {
   
    "http": f"http://{proxy_username}:{proxy_password}@{proxy_host}:{proxy_port}",
    "https": f"https://{proxy_username}:{proxy_password}@{proxy_host}:{proxy_port}"
}

# 设置 User-Agent 和 Cookie
headers = {
   
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3",
    "Cookie": "your_cookie_value"
}

url = "https://www.pinduoduo.com/some_page"

response = requests.get(url, proxies=proxies, headers=headers)

if response.status_code == 200:
    print(response.text)
else:
    print("请求失败")

4. 限制请求频率与休眠时间

为了避免过多的请求触发网站的反爬虫机制,合理的请求频率控制至关重要。通过引入 time.sleep() 等方式设定间隔,可以模拟人工浏览的行为,避免过快的请求频率被识别为异常流量。

示例

import time

def fetch_with_delay(url):
    response = requests.get(url)
    if response.status_code == 200:
        print(f"成功获取: {url}")
    else:
        print(f"获取失败: {url}")
    time.sleep(2)  # 每次请求之间休眠2秒

5. 优化数据提取与存储

在爬取数据时,数据提取和存储的效率同样影响整体性能。通过选择适合的解析器(如 lxmlBeautifulSoup),以及使用高效的数据库或缓存系统(如 Redis、MongoDB),可以确保数据处理的效率不会成为瓶颈。

示例

from bs4 import BeautifulSoup

def parse_html(html):
    soup = BeautifulSoup(html, "lxml")
    data = soup.find_all("div", class_="product-title")
    return data

实例

假设我们需要从拼多多抓取商品列表并进行分析,结合以上五个技巧,以下是实现该爬虫的完整代码。

import aiohttp
import asyncio
from bs4 import BeautifulSoup
import requests

# 代理配置 亿牛云爬虫代理加强版 www.16yun.cn
proxy_host = "proxy.16yun.cn"
proxy_port = "8100"
proxy_username = "用户名"
proxy_password = "密码"

proxies = {
   
    "http": f"http://{proxy_username}:{proxy_password}@{proxy_host}:{proxy_port}",
    "https": f"https://{proxy_username}:{proxy_password}@{proxy_host}:{proxy_port}"
}

headers = {
   
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3",
    "Cookie": "your_cookie_value"
}

async def fetch(url, session):
    async with session.get(url, proxy=f"http://{proxy_username}:{proxy_password}@{proxy_host}:{proxy_port}") as response:
        return await response.text()

async def main(urls):
    async with aiohttp.ClientSession(headers=headers) as session:
        tasks = [fetch(url, session) for url in urls]
        html_pages = await asyncio.gather(*tasks)
        for html in html_pages:
            parse_html(html)

def parse_html(html):
    soup = BeautifulSoup(html, "lxml")
    products = soup.find_all("div", class_="product-title")
    for product in products:
        print(product.text)

urls = ["https://www.pinduoduo.com/some_page1", "https://www.pinduoduo.com/some_page2"]
asyncio.run(main(urls))

结论

提高爬虫性能不仅需要熟练使用并发和异步技术,还要结合代理IP等工具来应对反爬虫机制。在实际项目中,开发者还需根据目标网站的具体情况灵活调整技术方案。通过合理地优化爬虫性能,不仅能提高数据采集的效率,还能有效规避反爬虫机制带来的障碍。

相关文章
|
7天前
|
编解码 Java 程序员
写代码还有专业的编程显示器?
写代码已经十个年头了, 一直都是习惯直接用一台Mac电脑写代码 偶尔接一个显示器, 但是可能因为公司配的显示器不怎么样, 还要接转接头 搞得桌面杂乱无章,分辨率也低,感觉屏幕还是Mac自带的看着舒服
|
9天前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1568 10
|
1月前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
12天前
|
人工智能 Rust Java
10月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区10月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
784 27
|
2天前
|
移动开发 JavaScript 前端开发
💻揭秘!如何用 Vue 3 实现酷炫的色彩魔方游戏✨
本文分享了开发基于Canvas技术的小游戏"色彩魔方挑战"的完整过程。游戏旨在考验玩家的观察力和耐心,通过随机生成的颜色矩阵和一个变化点,玩家需在两幅画布中找出不同的颜色点。文章详细讲解了游戏的核心功能,包括随机颜色矩阵生成、点的闪烁提示、自定义配色方案等。此外,作者展示了使用Vue 3和TypeScript开发的代码实现,带领读者一步步深入了解游戏的逻辑与细节。
103 68
|
2天前
|
存储 前端开发 JavaScript
🚀前端轻松实现网页内容转换:一键复制、保存图片及生成 Markdown
在现代前端开发中,提升用户的交互体验至关重要。本文将详细介绍如何使用 HTML2Canvas 和 Turndown 两个强大的 JavaScript 库,实现将网页选中文本转化为图片并保存或复制到剪贴板,或将内容转换为 Markdown 格式。文章包含核心代码实现、技术细节和功能拓展方向,为开发者提供了一个轻量级的解决方案,提升用户体验。
100 68
|
16天前
|
Linux 虚拟化 开发者
一键将CentOs的yum源更换为国内阿里yum源
一键将CentOs的yum源更换为国内阿里yum源
849 5
|
9天前
|
存储 SQL 关系型数据库
彻底搞懂InnoDB的MVCC多版本并发控制
本文详细介绍了InnoDB存储引擎中的两种并发控制方法:MVCC(多版本并发控制)和LBCC(基于锁的并发控制)。MVCC通过记录版本信息和使用快照读取机制,实现了高并发下的读写操作,而LBCC则通过加锁机制控制并发访问。文章深入探讨了MVCC的工作原理,包括插入、删除、修改流程及查询过程中的快照读取机制。通过多个案例演示了不同隔离级别下MVCC的具体表现,并解释了事务ID的分配和管理方式。最后,对比了四种隔离级别的性能特点,帮助读者理解如何根据具体需求选择合适的隔离级别以优化数据库性能。
232 4
|
2天前
|
人工智能
云端问道12期-构建基于Elasticsearch的企业级AI搜索应用陪跑班获奖名单公布啦!
云端问道12期-构建基于Elasticsearch的企业级AI搜索应用陪跑班获奖名单公布啦!
121 1
|
6天前
|
并行计算 PyTorch TensorFlow
Ubuntu安装笔记(一):安装显卡驱动、cuda/cudnn、Anaconda、Pytorch、Tensorflow、Opencv、Visdom、FFMPEG、卸载一些不必要的预装软件
这篇文章是关于如何在Ubuntu操作系统上安装显卡驱动、CUDA、CUDNN、Anaconda、PyTorch、TensorFlow、OpenCV、FFMPEG以及卸载不必要的预装软件的详细指南。
475 2