Ruby爬虫如何控制并发数量:爬取京东电子产品

embedded/2025/3/6 23:07:50/

1. 引言

京东作为中国最大的电商平台之一,拥有海量的商品信息,其中电子产品是其热门品类之一。对于市场研究人员、数据分析师和开发者来说,能够高效地爬取和分析这些数据具有重要的价值。然而,京东网站的复杂性和反爬措施使得爬取任务更具挑战性。合理控制并发数量不仅能提高爬取效率,还能避免触发网站的反爬机制,确保爬虫的稳定运行。

Ruby语言以其简洁的语法和强大的并发处理能力,结合Nokogiri等库,成为开发高效爬虫的理想选择。本文将通过一个实战案例,展示如何在Ruby爬虫中控制并发数量,同时解析京东电子产品页面并提取标题。

2. 爬虫设计与实现

在本节中,我们将详细介绍如何设计和实现一个Ruby爬虫,用于爬取京东电子产品页面并提取标题。我们将从简单的单线程爬虫开始,逐步扩展到并发爬虫,并最终实现动态并发控制。

2.1 单线程爬虫

单线程爬虫是最基本的爬虫形式,适用于小规模数据爬取。以下是单线程爬虫的实现代码:

ruby">require 'nokogiri'
require 'open-uri'proxy_host = "www.16yun.cn"
proxy_port = 5445
proxy_user = "16QMSOML"
proxy_pass = "280651"def fetch_title(url, proxy_host, proxy_port, proxy_user, proxy_pass)begin# 使用代理服务器打开网页doc = Nokogiri::HTML(URI.open(url, proxy_addr: proxy_host, proxy_port: proxy_port,proxy_user: proxy_user, proxy_pass: proxy_pass))doc.at('title').textrescue StandardError => eputs "Error fetching #{url}: #{e.message}"nilend
end# 示例:爬取京东电子产品首页
url = 'https://www.jd.com/category/1320-13753-13883.html'
title = fetch_title(url, proxy_host, proxy_port, proxy_user, proxy_pass)
puts "Title: #{title}"

2.2 并发爬虫

单线程爬虫效率较低,尤其是在爬取大量页面时。通过并发处理,可以显著提高爬取效率。以下是使用concurrent-ruby库实现的并发爬虫代码:

ruby">require 'nokogiri'
require 'open-uri'
require 'concurrent'proxy_host = "www.16yun.cn"
proxy_port = 5445
proxy_user = "16QMSOML"
proxy_pass = "280651"def fetch_title(url, proxy_host, proxy_port, proxy_user, proxy_pass)begindoc = Nokogiri::HTML(URI.open(url, proxy_addr: proxy_host, proxy_port: proxy_port,proxy_user: proxy_user, proxy_pass: proxy_pass))doc.at('title').textrescue StandardError => eputs "Error fetching #{url}: #{e.message}"nilend
end# 创建线程池,最大并发数为5
pool = Concurrent::ThreadPoolExecutor.new(max_threads: 5)urls = ['https://www.jd.com/category/1320-13753-13883.html', # 电子产品'https://www.jd.com/category/1320-13754-13884.html', # 手机'https://www.jd.com/category/1320-13755-13885.html'  # 笔记本电脑
]# 使用线程池并发爬取
results = urls.map do |url|pool.post(url, proxy_host, proxy_port, proxy_user, proxy_pass) do |u, host, port, user, pass|fetch_title(u, host, port, user, pass)end
endtitles = results.map(&:value).compact
titles.each { |title| puts "Title: #{title}" }pool.shutdown

2.3 动态并发调整

在实际应用中,目标网站的响应时间可能因网络状况和服务器负载而波动。通过动态调整并发数量,可以优化爬取效率,同时避免对目标网站造成过大压力。以下是动态并发调整的实现代码:

ruby">require 'nokogiri'
require 'open-uri'
require 'concurrent'def fetch_title(url, pool)start_time = Time.nowbegindoc = Nokogiri::HTML(URI.open(url))title = doc.at('title').textputs "Fetched #{url}: #{title}"titlerescue StandardError => eputs "Error fetching #{url}: #{e.message}"nilensureelapsed_time = Time.now - start_timeadjust_concurrency(pool, elapsed_time)end
enddef adjust_concurrency(pool, elapsed_time)if elapsed_time < 0.5pool.resize([pool.max_threads + 1, 10].min) # 最大并发数不超过10elsif elapsed_time > 2.0pool.resize([pool.max_threads - 1, 1].max) # 最小并发数为1end
endpool = Concurrent::ThreadPoolExecutor.new(max_threads: 5)
urls = ['https://www.jd.com/category/1320-13753-13883.html','https://www.jd.com/category/1320-13754-13884.html','https://www.jd.com/category/1320-13755-13885.html'
]results = urls.map { |url| pool.post(url, pool, &method(:fetch_title)) }
titles = results.map(&:value).compacttitles.each { |title| puts "Title: #{title}" }pool.shutdown

总结

本文通过一个具体的实战案例——爬取京东电子产品页面并提取标题,详细介绍了如何在Ruby爬虫中控制并发数量。从基础的单线程爬虫到并发爬虫,再到动态并发调整和分布式爬虫,本文为读者提供了一个全面的指南。通过合理控制并发数量,不仅可以提高爬取效率,还可以避免触发目标网站的反爬机制,确保爬虫的稳定运行。


http://www.ppmy.cn/embedded/170580.html

相关文章

【前端】【vue辅助】【vue-tsc】用于 Vue 项目的 TypeScript 检查工具

vue-tsc 是一个用于 Vue 项目的 TypeScript 检查工具&#xff0c;下面介绍它的作用和使用场景&#xff1a; 主要作用 1. 类型检查 vue-tsc 的核心功能是对 Vue 项目中的 TypeScript 代码进行类型检查。在 Vue 项目里&#xff0c;尤其是使用 Vue 3 并结合 TypeScript 开发时&…

ESLint 深度解析:原理、规则与插件开发实践

在前端开发的复杂生态中&#xff0c;保障代码质量与规范性是构建稳健、可维护项目的基石。ESLint 作为一款强大的代码检查工具&#xff0c;其默认规则与插件能满足多数常见需求&#xff0c;但面对特定团队规范或项目独特要求&#xff0c;自定义 ESLint 插件便成为有力的扩展手段…

Zookeeper 的 Node(Znode) 是什么?Zookeeper 监听机制的特点是什么?

Zookeeper 提供了一种 发布-订阅&#xff08;Pub-Sub&#xff09;机制&#xff0c;不过它更常被称为 Watch 机制。核心思想是&#xff1a;客户端可以对某个 Zookeeper 节点&#xff08;Node&#xff09;设置 Watch&#xff0c;当这个节点发生变化时&#xff0c;Zookeeper 会主动…

Python核心技术,Django学习基础入门教程(附环境安装包)

文章目录 前言1. 环境准备1.1Python安装1.2选择Python开发环境1.3 创建虚拟环境1.4 安装 Django 2. 创建 Django 项目3. Django项目结构介绍4. 启动开发服务器5. 创建 Django 应用6. 应用结构介绍7. 编写视图函数8. 配置 URL 映射9. 运行项目并访问视图10. 数据库配置与模型创建…

网络安全系统分为几级_网络安全系统的分级与软考要点解析

在信息技术迅猛发展的今天&#xff0c;网络安全系统的重要性日益凸显。对于参加软考的考生而言&#xff0c;掌握网络安全系统的基本知识和分级标准&#xff0c;是备考过程中不可或缺的一部分。本文将深入探讨网络安全系统的分级&#xff0c;并帮助考生理解与之相关的软考要点。…

Linux网络相关内容与端口

网络相关命令 ping命令测试连接状态 wget命令&#xff1a;非交互式文件下载器&#xff0c;可以在命令行内下载网络文件 使用ctrlc可以中止下载 curl命令&#xff1a;可以发送http网络请求&#xff0c;用于文件下载、获取信息等 其实和浏览器打开网站一样&#xff0c;cu…

计算机网络:Socket网络编程 Udp与Tcp协议 第一弹

目录 1.IP地址和端口号 1.1 如何通信 1.2 端口号详解 1.3 理解套接字socket 2. 网络字节序 3. socket接口 3.1 socket类型设计 3.2 socket函数 3.3 bind函数 4. UDP通信协议 4.1 UDP服务端类 4.2 Udp服务类InitServer函数 4.3 Udp服务类Start函数 4.4 Udp服务主函…

带你从入门到精通——自然语言处理(五. 自注意力机制和transformer的输入部分)

建议先阅读我之前的博客&#xff0c;掌握一定的自然语言处理前置知识后再阅读本文&#xff0c;链接如下&#xff1a; 带你从入门到精通——自然语言处理&#xff08;一. 文本的基本预处理方法和张量表示&#xff09;-CSDN博客 带你从入门到精通——自然语言处理&#xff08;二…