当前位置: 首页 > news >正文

使用Nokogiri和OpenURI库进行HTTP爬虫

目录

一、Nokogiri库

二、OpenURI库

三、结合Nokogiri和OpenURI进行爬虫编程

四、高级爬虫编程

1、并发爬取

2、错误处理和异常处理

3、深度爬取

总结


在当今的数字化时代,网络爬虫已经成为收集和处理大量信息的重要工具。其中,Nokogiri和OpenURI是两个非常有用的Ruby库,可以帮助我们轻松地实现HTTP爬虫。在这篇文章中,我们将介绍如何使用这两个库进行网络爬虫编程。

一、Nokogiri库

Nokogiri是一个功能强大的HTML和XML解析器,可以方便地解析网页内容。它提供了许多便捷的方法来获取网页中的数据,如获取特定标签、属性等。

下面是一个简单的示例,演示如何使用Nokogiri获取HTML页面中的标题:

require 'nokogiri'  url = 'http://example.com'  
doc = Nokogiri::HTML(open(url))  
title = doc.title.text  
puts title

在这个例子中,我们首先使用require 'nokogiri'导入Nokogiri库。然后,我们定义了一个URL变量,将其设置为需要爬取的网页URL。接下来,我们使用Nokogiri::HTML(open(url))来解析网页内容,并将其存储在变量doc中。最后,我们使用doc.title.text获取网页的标题,并将其存储在变量title中。

二、OpenURI库

OpenURI是一个方便的库,可以让我们轻松地使用Ruby进行HTTP请求。它提供了许多选项来设置HTTP请求的参数,如请求方法、请求头等。

下面是一个示例,演示如何使用OpenURI发送GET请求并获取响应内容:

require 'open-uri'  url = 'http://example.com'  
content = open(url) { |f| f.read }  
puts content

在这个例子中,我们首先使用require 'open-uri'导入OpenURI库。然后,我们定义了一个URL变量,将其设置为需要请求的网页URL。接下来,我们使用open(url) { |f| f.read }发送GET请求并获取响应内容,并将其存储在变量content中。最后,我们使用puts content将响应内容输出到控制台。

三、结合Nokogiri和OpenURI进行爬虫编程

现在我们已经介绍了Nokogiri和OpenURI的基本用法,下面我们将介绍如何将它们结合起来进行爬虫编程。以下是一个示例代码,演示如何使用Nokogiri和OpenURI获取一个网页的标题和链接:

require 'nokogiri'  
require 'open-uri'  url = 'http://example.com'  
doc = Nokogiri::HTML(open(url))  
title = doc.title.text  
puts title  links = doc.css('a').collect { |a| a['href'] }  
puts links.join('\n')

在这个例子中,我们首先使用require 'nokogiri'和require 'open-uri'导入Nokogiri和OpenURI库。然后,我们定义了一个URL变量,将其设置为需要爬取的网页URL。接下来,我们使用OpenURI发送GET请求并获取响应内容,然后使用Nokogiri解析响应内容并获取网页标题。最后,我们使用Nokogiri选择所有链接元素并获取它们的href属性,然后将它们存储在一个数组中。最后,我们将数组中的所有链接打印到控制台。

四、高级爬虫编程

1、并发爬取

在处理大量网页时,可以使用Ruby的并发特性来提高爬取速度。我们可以使用Ruby的Concurrent库来创建多个线程或进程来并发地发送HTTP请求。例如,以下代码演示了如何使用线程池并发地爬取多个网页:

require 'concurrent'  
require 'nokogiri'  
require 'open-uri'  url_pool = [  'http://example.com',  'http://example.com/page2',  'http://example.com/page3',  # ...  
]  pool = Concurrent::ThreadPool.new(max_size: 10) # 创建大小为10的线程池  
results = []  url_pool.each do |url|  pool.post {  doc = Nokogiri::HTML(open(url))  title = doc.title.text  links = doc.css('a').collect { |a| a['href'] }  results << [url, title, links]  }  
end  pool.shutdown # 关闭线程池,等待所有任务完成

在这个例子中,我们首先定义了一个URL池,其中包含了需要爬取的多个网页URL。然后,我们创建了一个大小为10的线程池,并使用pool.post方法将每个URL分配给一个线程并发地处理。每个线程会发送HTTP请求并解析响应内容,提取标题和链接,并将它们存储在一个数组中。最后,我们使用pool.shutdown方法关闭线程池,并等待所有任务完成。

2、错误处理和异常处理

在爬虫编程中,错误处理和异常处理非常重要。例如,如果目标网站做出了防爬虫措施,可能会导致爬虫失败。因此,我们需要添加错误处理和异常处理的代码来确保爬虫的稳健性。以下是一个示例代码,演示了如何处理异常:

require 'nokogiri'  
require 'open-uri'  begin  url = 'http://example.com'  doc = Nokogiri::HTML(open(url))  title = doc.title.text  puts title  
rescue OpenURI::HTTPError => e  puts "HTTP Error occurred: #{e.message}"  
rescue Nokogiri::XML::SyntaxError => e  puts "XML Syntax Error occurred: #{e.message}"  
rescue => e  puts "Unknown error occurred: #{e.message}"  
end

3、深度爬取

在处理大型网站时,我们可能需要爬取网页的子页面或特定链接。Nokogiri和OpenURI提供了方便的方法来进行深度爬取。

以下是一个示例代码,演示了如何使用Nokogiri和OpenURI进行深度爬取:

require 'nokogiri'  
require 'open-uri'  url = 'http://example.com'  
doc = Nokogiri::HTML(open(url))  # 爬取特定链接  
特定链接 = doc.css('#特定链接').first.attribute('href').value  
content = open(特定链接) { |f| f.read }  
puts content  # 爬取子页面  
子页面链接 = doc.css('.子页面链接').first.attribute('href').value  
content = open(子页面链接) { |f| f.read }  
puts content

在这个例子中,我们首先解析了目标网页,并获取了特定链接和子页面链接的URL。然后,我们使用OpenURI发送HTTP请求并获取响应内容。请注意,在获取特定链接和子页面链接时,我们使用了CSS选择器和属性方法来定位和提取链接URL。

总结

Nokogiri和OpenURI是两个非常有用的Ruby库,可以帮助我们轻松地进行HTTP爬虫编程。通过结合这两个库,我们可以快速、高效地爬取网页内容,提取所需信息。在进行爬虫编程时,我们需要注意错误处理和异常处理,以确保爬虫的稳健性。同时,还可以使用并发编程来提高爬取速度。最后,通过深度爬取方法来获取网页的子页面或特定链接。

相关文章:

使用Nokogiri和OpenURI库进行HTTP爬虫

目录 一、Nokogiri库 二、OpenURI库 三、结合Nokogiri和OpenURI进行爬虫编程 四、高级爬虫编程 1、并发爬取 2、错误处理和异常处理 3、深度爬取 总结 在当今的数字化时代&#xff0c;网络爬虫已经成为收集和处理大量信息的重要工具。其中&#xff0c;Nokogiri和OpenUR…...

arcpy.message实现探索

arcpy 位置D:\Program Files\GeoScene\Pro\Resources\ArcPy\arcpy\__init__.py ”““AddMessage(消息) 创建可以使用任何GetMessages函数访问的地理处理信息消息(Severity0)。 message(字符串):要添加的消息。”“ arcpy.geoprocessing D:\Program Files\GeoScene\Pro\Re…...

centos卸载自带的Python3.6.8 安装指定的版本号

#卸载python3 rpm -qa|grep python3|xargs rpm -ev --allmatches --nodeps #删除所有残余文件 whereis python3 |xargs rm -frv#查看现有安装的python&#xff0c;验证是否删除干净 whereis python # 安装依赖 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-de…...

《TCP/IP详解 卷一:协议》第5章的IPv4数据报的IHL字段解释

首先说明一下&#xff0c;这里并不解释整个IPv4数据报各个字段的含义&#xff0c;仅仅针对IHL字段作解释。 我们先看下IPv4数据报格式 对于IHL字段&#xff0c; 《TCP/IP详解 卷一&#xff1a;协议》这么解释&#xff1a; IPv4数据报。头部大小可变&#xff0c;4位的IHL字段…...

想去银行的背完这些软件测试面试题,你就稳了...

前言 最近呢有很多的小伙伴问我有没有什么软件测试的面试题&#xff0c;由于我之前一直在忙工作上的事情&#xff0c;没有时间整理面试题&#xff0c;刚好最近休息了一下&#xff0c;顺便整理了一些面试题&#xff0c;现在就把整理的面试题分享给大家&#xff0c;废话就不多说…...

目标检测(Object Detection): 你需要知道的一些概念

文章目录 NMS 非极大值抑制目的步骤 mAP&#xff08;Mean Average Precision&#xff09;步骤 Feature Pyramid Network 特征金字塔结构一阶段检测器Single-Stage Detectors"Anchor-based"的代表RetinaNetAnchor-free 的代表FCOS NMS 非极大值抑制 目的 去除网络输…...

〔001〕虚幻 UE5 发送 get、post 请求、读取 json 文件

✨ 目录 🎈 安装 varest 扩展🎈 开启 varest 扩展🎈 发送 get 请求🎈 发送 post 请求🎈 读取 json 文件🎈 安装 varest 扩展 打开 虚幻商城,搜索 varest 关键字进行检索, varest 是一个 api 调用插件,支持 http/https 请求,也支持 json 文件的读取,最关键是该…...

一条 SQL 是如何在 MyBatis 中执行的

前言 MyBatis 执行 SQL 的核心接口为 SqlSession 接口&#xff0c;该接口提供了一些 CURD 及控制事务的方法&#xff0c;另外还可以通过 SqlSession 先获取 Mapper 接口的实例&#xff0c;然后通过 Mapper 接口执行 SQL&#xff0c;Mapper 接口方法的执行最终还是委托到 SqlSe…...

《低代码指南》——维格云机器人常见报错怎么解决?

在使用维格机器人调用维格表的API过程中,可能会出现机器人执行结果未达到预期的情况,此时可能是机器人运行出现了问题;通过点击这个机器人右上角的“运行历史”可以查看运行记录,通过对运行记录的分析,可以推断出问题所在,然后进行修改。 而对于运行历史的分析,主要是针…...

哈夫曼树c语言版

一、哈夫曼树概念 哈夫曼树又称最优树给定N个权值作为N个叶子结点&#xff0c;构造一棵二叉树&#xff0c;若该树的带权路径长度达到最小&#xff0c;称这样的二叉树为最优二叉树&#xff0c;也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树&#xff0c;权值较大…...

食堂系统登录报错

因为数据库没有任何用户数据&#xff0c;所以会报错&#xff0c;需要添加admin用户 D:\env\jdk1.8.0_341\bin\java.exe -XX:TieredStopAtLevel1 -noverify -Dspring.output.ansi.enabledalways -Dcom.sun.management.jmxremote -Dspring.jmx.enabledtrue -Dspring.liveBeansVie…...

uniapp原生插件之乐橙摄像机播放插件(子账号云台对讲版)

插件介绍 乐橙摄像机播放插件(云台对讲版)&#xff0c;集成视频播放&#xff0c;对讲模式、云台控制 插件地址 乐橙摄像机播放插件(子账号云台对讲版) - DCloud 插件市场 超级福利 uniapp 插件购买超级福利 插件申请权限 麦克风权限&#xff08;可参考示例项目&#xff…...

Http代理与socks5代理有何区别?如何选择?(一)

了解SOCKS和HTTP代理之间的区别对于优化您的在线活动至关重要&#xff0c;无论您是技术娴熟的个人、现代互联网用户还是企业所有者。在使用代理IP时&#xff0c;您需要先了解这两种协议之间的不同。 一、了解HTTP代理 HTTP&#xff08;超文本传输协议&#xff09;代理专门设计…...

system verilog VSCode Windows 配置简述

system verilog VSCode Windows 配置简述 本文章的目的并非完全在 VSCode 中进行 system verilog 编程&#xff0c;而是以 vivado 为核心&#xff0c;将 VSCode 作为编译器。 配置步骤 安装 ctags choco install universal-ctags如果你没有安装 chocolatey&#xff0c;见 i…...

Linux中的Shell编程

Linux中的Shell编程 shell编程快速入门 为什么要学习Shell编程&#xff1f; 1.Linux运维工程师在进行服务器集群管理时&#xff0c;需要编写Shell程序来进行服务器管理。 2.对于JavaEE和Python程序员来说&#xff0c;工作的需要&#xff0c;你的老大会要求你编写一些Shell脚本…...

图像特征Vol.1:计算机视觉特征度量|第二弹:【统计区域度量】

目录 一、前言二、统计区域度量2.1&#xff1a;图像矩特征2.1.1&#xff1a;原始矩/几何矩2.1.2&#xff1a;中心距2.1.3&#xff1a;归一化的中心矩2.1.4&#xff1a;不变矩——Hu矩2.1.5&#xff1a;OpenCv实现矩特征及其应用 2.2&#xff1a;点度量特征2.3&#xff1a;全局直…...

将图像的锯齿状边缘变得平滑的方法

项目背景 使用PaddleSeg 192x192 模型分割出来的目标有锯齿状边缘&#xff0c;想通过传统算法将这种锯齿状边缘的变得平滑&#xff0c;虽然试了很过方法&#xff0c;但是效果还是不太理想 常用的集中方法 当使用分割算法&#xff08;如分水岭分割、阈值分割等&#xff09;分…...

【MySQL索引与优化篇】数据库设计实操(含ER模型)

数据库设计实操&#xff08;含ER模型&#xff09; 文章目录 数据库设计实操&#xff08;含ER模型&#xff09;1. ER模型1.1 概述1.2 建模分析1.3 ER 模型的细化1.4 ER 模型图转换成数据表1. 一个实体转换成一个数据库表2. 一个多对多的关系转换成一个数据表3. 通过外键来表达1对…...

OpenCV—自动驾驶实时道路车道检测(完整代码)

自动驾驶汽车是人工智能领域最具颠覆性的创新之一。在深度学习算法的推动下,它们不断推动我们的社会向前发展,并在移动领域创造新的机遇。自动驾驶汽车可以去传统汽车可以去的任何地方,并且可以完成经验丰富的人类驾驶员所做的一切。但正确地训练它是非常重要的。自动驾驶汽…...

PostGIS轨迹分析——简化轨迹

需求 对轨迹线进行简化,并将原始轨迹上的两个特征点拉取到简化后的轨迹上 简化线 红色线是简化后的轨迹线,蓝色线是原始轨迹,有两个特征点 知识点: st_makeline函数将点连成线st_simplify简化线函数,其中第二个参数为坐标系的单位,0.002度大概代表0.002x1.11x10^5≈22…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...