Wgit 是一个 HTML 网络爬虫,用 Ruby 编写,允许您以编程方式从网络中提取所需的数据。
Wgit 主要设计用于抓取静态 HTML 网站以索引和搜索其内容 - 提供任何搜索引擎的基础;但 Wgit 适用于许多应用领域,包括:
Wgit 提供了高级、易于使用的 API 和 DSL,您可以在自己的应用程序和脚本中使用它们。
查看这个演示搜索引擎 - 使用 Wgit、Sinatra 和 MongoDB 构建 - 部署到 Fly.io。尝试搜索与 Ruby 相关的内容,例如“Matz”或“Rails”。
让我们抓取一个引用网站,使用 Wgit DSL 提取其引用和作者:
require 'wgit'
require 'json'
include Wgit :: DSL
start 'http://quotes.toscrape.com/tag/humor/'
follow "//li[@class='next']/a/@href"
extract :quotes , "//div[@class='quote']/span[@class='text']" , singleton : false
extract :authors , "//div[@class='quote']/span/small" , singleton : false
quotes = [ ]
crawl_site do | doc |
doc . quotes . zip ( doc . authors ) . each do | arr |
quotes << {
quote : arr . first ,
author : arr . last
}
end
end
puts JSON . generate ( quotes )
哪个输出:
[
{
"quote": "“The person, be it gentleman or lady, who has not pleasure in a good novel, must be intolerably stupid.”",
"author": "Jane Austen"
},
{
"quote": "“A day without sunshine is like, you know, night.”",
"author": "Steve Martin"
},
...
]
伟大的!但是,如果我们想要抓取内容并将其存储在数据库中以便可以搜索,该怎么办? Wgit 可以轻松使用 MongoDB 索引和搜索 HTML(默认情况下):
require 'wgit'
include Wgit :: DSL
Wgit . logger . level = Logger :: WARN
ENV [ 'WGIT_CONNECTION_STRING' ] = 'mongodb://user:password@localhost/crawler'
start 'http://quotes.toscrape.com/tag/humor/'
follow "//li[@class='next']/a/@href"
extract :quotes , "//div[@class='quote']/span[@class='text']" , singleton : false
extract :authors , "//div[@class='quote']/span/small" , singleton : false
index_site
search 'prejudice'
search
调用(在最后一行)将返回并输出结果:
Quotes to Scrape
“I am free of all prejudice. I hate everyone equally. ”
http://quotes.toscrape.com/tag/humor/page/2/
...
使用数据库客户端,我们可以看到这两个网页已被索引,以及它们提取的引用和作者:
DSL 可以轻松编写用于实验的脚本。 Wgit 的 DSL 只是底层类的包装器。为了进行比较,下面是使用 Wgit API而不是DSL 重写的引用示例:
require 'wgit'
require 'json'
crawler = Wgit :: Crawler . new
url = Wgit :: Url . new ( 'http://quotes.toscrape.com/tag/humor/' )
quotes = [ ]
Wgit :: Document . define_extractor ( :quotes , "//div[@class='quote']/span[@class='text']" , singleton : false )
Wgit :: Document . define_extractor ( :authors , "//div[@class='quote']/span/small" , singleton : false )
crawler . crawl_site ( url , follow : "//li[@class='next']/a/@href" ) do | doc |
doc . quotes . zip ( doc . authors ) . each do | arr |
quotes << {
quote : arr . first ,
author : arr . last
}
end
end
puts JSON . generate ( quotes )
还有许多其他 HTML 爬虫,那么为什么要使用 Wgit呢?
xpath
。默认情况下,Wgit 通过提取指向同一主机的内部链接来爬网整个站点 - 不需要xpath
。 require 'wgit'
ENV [ 'WGIT_CONNECTION_STRING' ] = 'mongodb://user:password@localhost/crawler'
wiki = Wgit :: Url . new ( 'https://github.com/michaeltelford/wgit/wiki' )
# Only index the most recent of each wiki article, ignoring the rest of Github.
opts = {
allow_paths : 'michaeltelford/wgit/wiki/*' ,
disallow_paths : 'michaeltelford/wgit/wiki/*/_history'
}
indexer = Wgit :: Indexer . new
indexer . index_site ( wiki , ** opts )
robots.txt
规则。还有一个方便的robots.txt
解析器,您可以在自己的代码中使用它。 那么我听到你问为什么你不使用 Wgit 呢?
libcurl
进行 HTTP 等),但不是多线程的;所以每个 URL 都会被顺序抓取。您可以将每个已爬网的文档交给工作线程进行处理 - 但如果您需要并发爬网,那么您应该考虑其他方法。 仅 MRI Ruby 经过测试和支持,但 Wgit 可以与其他 Ruby 实现一起使用。
目前,支持的 MRI Ruby 版本范围是:
ruby '~> 3.0'
又名 Ruby 3.0 和最高版本(但不包括 Ruby 4.0)。 Wgit 可能会在旧版本上正常工作,但如果可能的话最好升级。
$ bundle add wgit
$ gem install wgit
$ wgit
调用已安装的可执行文件将启动 REPL 会话。
安装 Wgit gem 会将wgit
可执行文件添加到您的$PATH
中。可执行文件启动一个交互式 REPL 会话,并且已经加载了 Wgit gem;使得从命令行进行索引和搜索变得非常容易,无需脚本。
wgit
可执行文件执行以下操作(按顺序):
require wgit
.env
文件(如果本地目录或主目录中存在该文件,以先找到者为准)eval
'sa .wgit.rb
文件(如果本地目录或主目录中存在该文件,以先找到者为准)pry
,如果未安装则使用irb
) .wgit.rb
文件可用于播种夹具数据或定义会话的辅助函数。例如,您可以定义一个函数来索引您的网站,以便每次启动wgit
时快速轻松地进行搜索。
该 gem 根据 MIT 许可证条款作为开源提供。有关详细信息,请参阅 LICENSE.txt。
GitHub 欢迎提交错误报告和功能请求。只需提出一个问题,检查它是否已经存在。
当前的路线图基本列在路线图 wiki 页面中。也许您的功能请求已经存在?
在考虑做出贡献之前,请查看 CONTRIBUTING.md。
检查存储库后,运行以下命令:
gem install bundler toys
bundle install --jobs=3
toys setup
你就可以出发了!
Wgit 使用toys gem(而不是Rake)进行任务调用。始终将toys
作为bundle exec toys
运行。有关可用任务(又名工具)的完整列表,请运行bundle exec toys --tools
。您可以使用bundle exec toys -s tool_name
搜索工具。下面列出了最常用的工具...
运行bundle exec toys db
以查看数据库相关工具的列表,使您能够使用 Docker 在本地运行 Mongo DB 实例。运行bundle exec toys test
来执行测试。
要在本地生成代码文档,请运行bundle exec toys yardoc
。要在浏览器中浏览文档,请运行bundle exec toys yardoc --serve
。您还可以使用yri
命令行工具,例如yri Wgit::Crawler#crawl_site
等。
要将此 gem 安装到本地计算机上,请运行bundle exec toys install
并按照提示进行操作。
您可以使用./bin/wgit
可执行文件为交互式 shell 运行bundle exec toys console
。 bundle exec toys setup
任务将创建一个由可执行文件加载的.env
和.wgit.rb
文件。您可以使用此要点的内容将可执行文件转换为开发控制台。它定义了一些有用的函数、装置并连接到数据库等。不要忘记在.env
文件中设置WGIT_CONNECTION_STRING
。