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

server/2025/3/6 1:53:19/

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/server/172748.html

相关文章

记录一次使用 Goland 连接 Docker 当中 MySQL 踩过的坑

问题描述 最近在做一个 Golang 的 Web 应用&#xff0c;在最后阶段需要使用 Docker 将整个应用打包&#xff0c;由于我在上一个阶段是在 Windows 环境中安装了本地的 MySQL 来进行开发的&#xff0c;在打包 Docker 的过程中出现了一些问题&#xff0c;遂想到在 Docker 中安装一…

什么是SElinux?

SELinux&#xff08;Security-Enhanced Linux&#xff09;是 Linux 内核中强制实施的强制访问控制&#xff08;MAC&#xff09;安全机制&#xff0c;旨在通过细粒度的权限管理增强系统安全性。它与传统的基于用户/组的权限&#xff08;自主访问控制&#xff0c;DAC&#xff09;…

QT控 件 :

&#xff1a;滚动条 &#xff1a;类似qq里的分组 添加页&#xff1a; &#xff1a;网页 &#xff1a;栈容器 把控件放入容器中&#xff0c;可点击切换不同的页面&#xff0c;但运行后没有该按钮 手动实现该功能点击按钮切换页面 //实现点击按钮跳转到第一页connect(ui->…

智慧园区大数据云平台建设总体方案,平台方案架构-智慧园区大数据平台(320页原件Word)

第一章 项目建设背景及现状 1.1. 项目建设背景 1.2. 项目建设必要性 1.3. 项目建设目标 1.4. 建设原则 第二章 园区创新发展趋势 2.1园区经济向生态型转变 2.2 园区企业向高新型转变 2.3园区管理向城市化转变 第三章 工业园区大数据存在的问题 3.1信息化配套设施及服…

爬虫与翻译API接口的完美结合:开启跨语言数据处理新纪元

在全球化的今天&#xff0c;跨语言数据处理已成为技术领域的重要需求。无论是跨境电商、学术研究&#xff0c;还是内容创作&#xff0c;都需要高效、准确的翻译工具来打破语言障碍。今天&#xff0c;我们将深入探讨如何通过爬虫技术结合强大的 t_text 翻译文本API接口&#xff…

宝塔找不到php扩展swoole,服务器编译安装

1. 在php7.4中安装swoole&#xff0c;但找不到这个扩展安装 2. 服务器下载源码解压安装 http://pecl.php.net/package/swoole 下载4.8.0版本 解压到/www/server/php/74/下 3. 发现报错问题&#xff1b; 更新一下依赖 yum update yum -y install gcc gcc-c autoconf libjpe…

微信小程序地图map全方位解析

微信小程序地图map全方位解析 微信小程序的 <map> 组件是一个功能强大的工具&#xff0c;可以实现地图展示、定位、标注、路径规划等多种功能。以下是全方位解析微信小程序地图组件的知识点&#xff1a; 一、地图组件基础 1. 引入 <map> 组件 在页面的 .wxml 文…

基于 HTML、CSS 与 JavaScript 的计时器

目录 1 前言 2 代码解析 2.1 HTML 结构分析 2.2 CSS 样式分析 2.3 JavaScript 功能分析 3 完整代码 4 运行结果 5 总结 5.1 界面设计 5.1.1 整体布局 5.1.2 样式美化 5.2 功能实现 5.2.1 时间格式化 5.2.2 计时逻辑 5.3 优势与应用场景 5.3.1 优势 5.3.2 应用…