引言
Typhoeus 是一个基于 Hydra 的库,它提供了一个简单而强大的 API 来发送 HTTP 请求。Nokogiri 是一个高效的 HTML、XML 和 SAX 以及 Reader parser 的库。将两者结合起来,我们可以快速地发送网络请求并解析响应内容,从而提取所需的数据。
Typhoeus 简介
Typhoeus 允许我们并行地发送多个 HTTP 请求,这可以显著提高数据抓取的效率。它还提供了一个简洁的 API 来设置请求头部、超时和代理等。
Nokogiri 简介
Nokogiri 以其出色的解析速度和易用性而闻名。它提供了丰富的方法来查询和修改 HTML 或 XML 文档,使得数据提取变得简单直观。
安装和配置
首先,我们需要安装这两个库。如果你使用的是 Ruby,可以通过 Bundler 来管理你的依赖。
在你的 Gemfile 中添加以下内容:
然后运行 bundle install 来安装这些库。
发送 HTTP 请求
使用 Typhoeus 发送 HTTP 请求非常简单。以下是一个基本的 GET 请求示例,包括代理设置:
ruby
require 'typhoeus'
代理设置
proxy_host = "www.16yun.cn"
proxy_port = "5445"
proxy_user = "16QMSOML"
proxy_pass = "280651"
创建一个 Typhoeus 客户端,并设置代理
client = Typhoeus::Client.new(
proxy: {
host: proxy_host,
port: proxy_port,
user: proxy_user,
pass: proxy_pass
}
)
发送 GET 请求
response = client.get('http://example.com')
检查响应状态码
if response.code == 200
puts "请求成功!"
else
puts "请求失败,状态码:#{response.code}"
end
解析 HTML 内容
一旦我们得到了响应内容,就可以使用 Nokogiri 来解析 HTML。以下是一个基本的解析示例:
ruby
require 'nokogiri'
假设 response.body 包含了 HTML 内容
html = Nokogiri::HTML(response.body)
使用 CSS 选择器查找元素
titles = html.css('title').text
puts "页面标题:#{titles}"
组合 Typhoeus 和 Nokogiri
现在,让我们将这两个库结合起来,以实现一个完整的网页内容解析流程,并加入代理信息。
ruby
require 'typhoeus'
require 'nokogiri'
代理设置
proxy_host = "www.16yun.cn"
proxy_port = "5445"
proxy_user = "16QMSOML"
proxy_pass = "280651"
创建 Typhoeus 客户端
client = Typhoeus::Client.new(
proxy: {
host: proxy_host,
port: proxy_port,
user: proxy_user,
pass: proxy_pass
}
)
发送 GET 请求
response = client.get('http://example.com')
检查响应状态码
if response.code == 200
使用 Nokogiri 解析 HTML 内容
html = Nokogiri::HTML(response.body)
提取页面标题
title = html.css('title').text
提取所有链接
links = html.css('a').map { |link| link['href'] }
puts "页面标题:#{title}"
puts "页面链接:#{links}"
else
puts "请求失败,状态码:#{response.code}"
end
处理多个页面
在实际应用中,我们可能需要处理多个页面。Typhoeus 支持并行请求,这可以帮助我们提高效率。
ruby
定义要爬取的页面数组
urls = ['http://example.com', 'http://example.org', 'http://example.net']
创建请求队列
requests = urls.map do |url|
Typhoeus::Request.new(url, method: :get, proxy: {
host: proxy_host,
port: proxy_port,
user: proxy_user,
pass: proxy_pass
})
end
发送请求并获取响应
responses = Typhoeus.hydra.run(requests)
遍历响应并解析内容
responses.each do |response|
if response.code == 200
html = Nokogiri::HTML(response.body)
title = html.css('title').text
puts "页面标题:#{title}"
else
puts "请求失败,状态码:#{response.code}"
end
end
错误处理和调试
在网络请求和解析过程中,错误处理和调试是非常重要的。Typhoeus 提供了一些方法来处理超时、连接错误等问题。
ruby
设置超时
client = Typhoeus::Client.new(timeout: 10)
发送请求
response = client.get('http://example.com')
检查错误
if response.timed_out?
puts "请求超时!"
elsif response.code == 200
解析内容
else
puts "请求失败,状态码:#{response.code}"
end
结论
通过结合使用 Typhoeus 和 Nokogiri,我们可以高效地发送 HTTP 请求并解析网页内容。这种方法不仅可以提高我们的数据抓取效率,还可以帮助我们构建更加健壮和可靠的网络应用。随着技术的不断发展,掌握这些技巧将变得越来越重要。