Wgit은 Ruby로 작성된 HTML 웹 크롤러로, 웹에서 원하는 데이터를 프로그래밍 방식으로 추출할 수 있습니다.
Wgit은 주로 정적 HTML 웹사이트를 크롤링하여 콘텐츠를 색인화하고 검색하도록 설계되었으며 모든 검색 엔진의 기반을 제공합니다. 그러나 Wgit은 다음을 포함한 많은 애플리케이션 도메인에 적합합니다.
Wgit은 자체 애플리케이션과 스크립트에서 사용할 수 있는 높은 수준의 사용하기 쉬운 API와 DSL을 제공합니다.
fly.io에 배포된 Wgit, Sinatra 및 MongoDB를 사용하여 구축된 이 데모 검색 엔진을 확인하세요. "Matz" 또는 "Rails"와 같이 Ruby와 관련된 항목을 검색해 보세요.
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은 단순히 기본 클래스를 둘러싼 래퍼입니다. 비교를 위해 다음은 DSL 대신 Wgit API를 사용하여 다시 작성된 인용문 예입니다.
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
사용) 다중 스레드가 아닙니다. 따라서 각 URL은 순차적으로 크롤링됩니다. 처리를 위해 크롤링된 각 문서를 작업자 스레드에 전달할 수 있지만 동시 크롤링이 필요한 경우에는 다른 것을 고려해야 합니다. MRI Ruby만 테스트되고 지원되지만 Wgit은 다른 Ruby 구현과도 작동할 수 있습니다.
현재 지원되는 MRI Ruby 버전 범위는 다음과 같습니다.
ruby '~> 3.0'
은 Ruby 3.0과 Ruby 4.0 사이이지만 Ruby 4.0은 포함하지 않습니다. Wgit은 이전 버전에서도 잘 작동할 수 있지만 가능하면 업그레이드하는 것이 가장 좋습니다.
$ bundle add wgit
$ gem install wgit
$ wgit
설치된 실행 파일을 호출하면 REPL 세션이 시작됩니다.
Wgit gem을 설치하면 $PATH
에 wgit
실행 파일이 추가됩니다. 실행 파일은 이미 로드된 Wgit gem을 사용하여 대화형 REPL 세션을 시작합니다. 스크립트 없이도 명령줄에서 매우 쉽게 색인화하고 검색할 수 있습니다.
wgit
실행 파일은 다음 작업을 순서대로 수행합니다.
require wgit
.env
파일을 로드합니다(로컬 또는 홈 디렉터리 중 먼저 발견된 파일이 있는 경우).eval
'sa .wgit.rb
파일(로컬 또는 홈 디렉터리 중 먼저 발견된 파일이 있는 경우)pry
사용하고 그렇지 않은 경우 irb
사용). .wgit.rb
파일은 고정 장치 데이터를 시드하거나 세션에 대한 도우미 기능을 정의하는 데 사용할 수 있습니다. 예를 들어, wgit
시작할 때마다 빠르고 쉽게 검색할 수 있도록 웹사이트를 색인화하는 기능을 정의할 수 있습니다.
이 gem은 MIT 라이선스 조건에 따라 오픈 소스로 제공됩니다. 자세한 내용은 LICENSE.txt를 참조하세요.
버그 보고서 및 기능 요청은 GitHub에서 환영합니다. 문제를 제기하고 이미 존재하지 않는지 확인하세요.
현재 로드맵은 로드맵 위키 페이지에 기본적으로 나열되어 있습니다. 기능 요청이 이미 있을 수도 있습니다.
기여를 고려하기 전에 CONTRIBUTING.md를 확인하세요.
저장소를 확인한 후 다음 명령을 실행하십시오.
gem install bundler toys
bundle install --jobs=3
toys setup
이제 가셔도 됩니다!
Wgit은 작업 호출을 위해 Rake 대신 Toys Gem을 사용합니다. 항상 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
실행 파일을 사용하여 대화형 셸에 대한 bundle exec toys console
실행할 수 있습니다. bundle exec toys setup
작업은 실행 파일에 의해 로드되는 .env
및 .wgit.rb
파일을 생성합니다. 이 요지의 내용을 사용하여 실행 파일을 개발 콘솔로 전환할 수 있습니다. 이는 몇 가지 유용한 기능, 고정 장치를 정의하고 데이터베이스 등에 연결합니다. .env
파일에서 WGIT_CONNECTION_STRING
을 설정하는 것을 잊지 마십시오.