使用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爬虫编程。通过结合这两个库,我们可以快速、高效地爬取网页内容,提取所需信息。在进行爬虫编程时,我们需要注意错误处理和异常处理,以确保爬虫的稳健性。同时,还可以使用并发编程来提高爬取速度。最后,通过深度爬取方法来获取网页的子页面或特定链接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/179559.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web3 React dapp中编写balance组件从redux取出并展示用户资产

好啊 上文WEB3 在 React搭建的Dapp中通过redux全局获取并存储用户ETH与自定义token与交易所存储数量中 我们拿到了用户的一个本身 和 交易所token数量 并放进了redux中做了一个全局管理 然后 我们继续 先 起来ganache的一个模拟环境 ganache -d然后 我们启动自己的项目 顺手发…

Go语言集成开发环境(IDE):GoLand 2023中文

GoLand 2023是一款由JetBrains开发的现代化、功能丰富的Go语言集成开发环境&#xff08;IDE&#xff09;。它提供了智能代码提示和自动完成、强大的内置调试器以及代码重构工具&#xff0c;帮助开发者提高编码效率并确保代码质量。GoLand 2023还支持多种版本控制系统&#xff0…

python3 阿里云api进行巡检发送邮件

python3 脚本爬取阿里云进行巡检 不确定pip能不能安装上&#xff0c;使用时候可以百度一下&#xff0c;脚本是可以使用的&#xff0c;没有问题的 太长时间了&#xff0c;pip安装依赖忘记那些了&#xff0c;使用科大星火询问了下&#xff0c;给了下面的&#xff0c;看看能不能使…

【MATLAB源码-第67期】基于麻雀搜索算法(SSA)的无人机三维地图路径规划,输出最短路径和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 ​麻雀搜索算法&#xff08;Sparrow Search Algorithm, SSA&#xff09;是一种新颖的元启发式优化算法&#xff0c;它受到麻雀社会行为的启发。这种算法通过模拟麻雀的食物搜索行为和逃避天敌的策略来解决优化问题。SSA通过模…

世微 DC-DC平均电流双路降压恒流驱动器 LED车灯AP2813

产品描述 AP2813 是一款双路降压恒流驱动器,高效率、外 围简单、内置功率管&#xff0c;适用于 5-80V 输入的高精度降 压 LED 恒流驱动芯片。内置功率管输出最大功率可达 12W&#xff0c;最大电流 1.2A。 AP2813 一路直亮&#xff0c;另外一路通过 MODE1 切换 全亮&#xff0c…

Qt 使用QtXlsx操作Excel表

1.环境搭建 QtXlsx是一个用于读写Microsoft Excel文件&#xff08;.xlsx&#xff09;的Qt库。它提供了一组简单易用的API&#xff0c;可以方便地处理电子表格数据。 Github下载&#xff1a;GitHub - dbzhang800/QtXlsxWriter: .xlsx file reader and writer for Qt5 官方文档…

前端react入门day02-React中的事件绑定与组件

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 React中的事件绑定 React 基础事件绑定 使用事件对象参数 传递自定义参数 同时传递事件对象和自定义参…

致远OA wpsAssistServlet任意文件读取漏洞复现 [附POC]

文章目录 致远OA wpsAssistServlet任意文件读取漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 致远OA wpsAssistServlet任意文件读取漏洞复现 [附POC] 0x01 前言 免责声明&#xff1a;请勿利用…

基于单片机的无线报警系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 技术交流认准下方 CSDN 官方提供的联系方式 文章目录 概要 一、整体设计方案二、 系统的总体方案论证与设计2.1系统的功能要求2.2 系统的技术要求2.3 系统的方案论证及设计2.3.…

K-edge 和逃逸问题

一 k-eage基本概念 1 k-edge概念 K-edge称为K边, 其物理意义是高原子序数物质原子内部K层自由电子, 易与特定能量下X射线光子发生光电吸收作用, 导致对该能量的X射线光子吸收特别大。 而K-edge特性表现为X射线与物质发生相互作用时, 其衰减系数随着能量的增加而逐渐减小, 但在…

最新ChatGPT商业运营系统源码+支持GPT4/支持ai绘画+支持Midjourney绘画

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

【3D图像分割】基于Pytorch的VNet 3D图像分割5(改写数据流篇)

在这篇文章&#xff1a;【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割2&#xff08;基础数据流篇&#xff09; 的最后&#xff0c;我们提到了&#xff1a; 在采用vent模型进行3d数据的分割训练任务中&#xff0c;输入大小是16*96*96&#xff0c;这个的裁剪是放到Dataset类…

科技驱动教育!将名师智慧资产固定在系统中

文章目录 每日一句正能量前言未来教育教育趋势一、在线教育&#xff1a;打破时间和空间的限制二、混合式学习&#xff1a;结合线上和线下的优势三、项目式学习&#xff1a;以问题为导向&#xff0c;以项目为载体 科技驱动教育模式在线教育人工智能教育虚拟现实/增强现实教育游戏…

【DriveGPT学习笔记】自动驾驶汽车Autonomous Vehicle Planning

原文地址&#xff1a;DriveGPT - Lei Maos Log Book 自动驾驶汽车的核心软件组件是感知、规划和控制。规划是指在给定场景或一系列场景的情况下为自动驾驶汽车制定行动计划的过程&#xff0c;以实现安全和理想的自动驾驶。 用于规划的场景是从感知软件组件获得的。计划的行动将…

品牌加盟商做信息展示预约小程序的效果如何

很多行业都有中部或头部品牌&#xff0c;对实体品牌企业来说想要快速高效发展&#xff0c;除了多地直营店外还需要招募加盟商进而提升生意营收。 因此线上渠道变得尤为重要&#xff0c;除了网站外&#xff0c;小程序是连接多平台生态很好的工具&#xff0c;随时打开、直接触达…

回归预测 | Matlab实现WOA-CNN-SVM鲸鱼算法优化卷积神经网络-支持向量机的多输入单输出回归预测

回归预测 | Matlab实现WOA-CNN-SVM鲸鱼算法优化卷积神经网络-支持向量机的多输入单输出回归预测 目录 回归预测 | Matlab实现WOA-CNN-SVM鲸鱼算法优化卷积神经网络-支持向量机的多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.WOA-CNN-SVM鲸鱼算法…

谈一谈SQLite、MySQL、PostgreSQL三大数据库

每一份付出&#xff0c;必将有一份收货&#xff0c;就像这个小小的果实&#xff0c;时间到了&#xff0c;也就会开花结果… 三大数据库概述 SQLite、MySQL 和 PostgreSQL 都是流行的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;但它们在功能、适用场景和性…

甲方自建ERP这事靠不靠谱?来听听读过中欧商学院的老板怎么说

李总自建ERP开发团队的失败案例&#xff0c;投入三年&#xff0c;花了五六百万&#xff0c;做出来的东西&#xff0c;远不如免费开源的Odoo软件。Odoo有强大的技术平台&#xff0c;有无穷的功能插件。李总现身说法&#xff1a;“早知道有Odoo&#xff0c;何必瞎折腾&#xff0c…

hadoop mapreduce的api调用WordCount本机和集群代码

本机运行代码 package com.example.hadoop.api.mr;import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.LongWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache…

使用 Docker 搭建一个“一主一从”的 MySQL 读写分离集群(超详细步骤)

目录 一、前提二、MySQL 生产安装1&#xff0c;拉取mysql2&#xff0c;查看mysql镜像3&#xff0c; 启动 mysql 容器4&#xff0c;修改mysql的中文编码5&#xff0c;查看验证mysql的中文编码 三、Mysql主机 mysql_master 的安装与配置1&#xff0c; 拷贝master容器2&#xff0c…