mtgtop8_scrapper 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/README.md +95 -0
- data/lib/mtgtop8_scrapper.rb +64 -0
- data/lib/scrapper.rb +43 -0
- metadata +46 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 6747361b0fb4574105a6af90cd26976e25b78724bc69e794501b8557e274c11d
|
4
|
+
data.tar.gz: b535056d9f3e9ecd64ada389abbf46b0511e52deed8980706d22b0202ae57c0a
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b72bd1b861ff38ffda55998565131e47d7b0b2c360b54eba45ade585b54f6542cef441d4a76b37f71c0279650de38bad02ab8cbcbee6d62159b7d8ee54ccd51a
|
7
|
+
data.tar.gz: d119c69d177d367c756527a563c09923021218d44cd864422a0ee4a94159b018aed7659399be4c5867d623f477a0fd14de43584f558a5b0777b40579b925979f
|
data/README.md
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
<h1 align="center">Welcome to MTGTop8 scrapper π</h1>
|
2
|
+
|
3
|
+
|
4
|
+
<div align="center">
|
5
|
+
<img alt="logo" src="assets/logo.png" />
|
6
|
+
</div>
|
7
|
+
|
8
|
+
<p>
|
9
|
+
<img alt="Version" src="https://img.shields.io/badge/version-4-blue.svg?cacheSeconds=2592000" />
|
10
|
+
<a href="https://twitter.com/kammzinho" target="_blank">
|
11
|
+
<img alt="Twitter: kammzinho" src="https://img.shields.io/twitter/follow/kammzinho.svg?style=social" />
|
12
|
+
</a>
|
13
|
+
</p>
|
14
|
+
|
15
|
+
> Scrape data from MTGTop8, Magic the Gathering tournaments, results and decks into simple reports.
|
16
|
+
|
17
|
+
|
18
|
+
## How it looks
|
19
|
+
|
20
|
+
### Convert this:
|
21
|
+
|
22
|
+

|
23
|
+
|
24
|
+
### Into this:
|
25
|
+
|
26
|
+
|
27
|
+
https://user-images.githubusercontent.com/34798570/220813931-7d3d73db-6b1e-4564-86ea-8583ba12509a.mov
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
|
32
|
+
## Why?
|
33
|
+
- π₯Ή Mixing coding and Magic π
|
34
|
+
- π² Being able to extract & format in a fast/easy way is really helpful, so it's possible to play with it around later.
|
35
|
+
- π Reports are being used to generate Monthly Retrospectives related to the weekly tournaments around the city.
|
36
|
+
- π§βπ» All of them are available [here, in mtgjoinville.super.site](https://mtgjoinville.super.site/)
|
37
|
+
|
38
|
+
### The current ecosystem
|
39
|
+
|
40
|
+
- [MTG Joinville Website](https://mtgjoinville.super.site/)
|
41
|
+
- π Entrypoint for a bunch of information related to Magic in our city
|
42
|
+
- [MTGTop8 Scrapper](https://github.com/kammradt/mtgtop8-scrapper)
|
43
|
+
- πͺ Will gather data from the main website that holds results from many tournaments
|
44
|
+
- [MTG Top/Ranking generator?]
|
45
|
+
- Use reports from [MTGTop8 Scrapper](https://github.com/kammradt/mtgtop8-scrapper) to build social media ready images showing top 8 players and their decks.
|
46
|
+
- This is being currently build and there are some [examples/prototypes here](https://mtgjoinville.super.site/noticias/janeiro2023-piooner-retrospectiva).
|
47
|
+
- <details>
|
48
|
+
|
49
|
+
<summary>Some image examples</summary>
|
50
|
+
|
51
|
+
<img alt="retro" src="assets/retro.png" />
|
52
|
+
<img alt="retro1" src="assets/retro1.png" />
|
53
|
+
</details>
|
54
|
+
|
55
|
+
## Install
|
56
|
+
> None of the builds/versions will probably be stable. This is a kind of pet project, so use at your own risk.
|
57
|
+
|
58
|
+
```sh
|
59
|
+
gem install mtgtop8_scrapper
|
60
|
+
```
|
61
|
+
|
62
|
+
## Usage
|
63
|
+
|
64
|
+
> Feel free to copy it from examples.rb file
|
65
|
+
|
66
|
+
```sh
|
67
|
+
require 'mtgtop8_scrapper'
|
68
|
+
|
69
|
+
link = 'https://www.mtgtop8.com/event?e=41158&d=505864&f=PAU'
|
70
|
+
|
71
|
+
# Just create an instance passing a link as argument
|
72
|
+
scrapper = MTGTop8Scrapper.new(link)
|
73
|
+
|
74
|
+
# This generates and returns a report
|
75
|
+
scrapper.generate_report
|
76
|
+
# That you can also access later
|
77
|
+
puts scrapper.report
|
78
|
+
|
79
|
+
# You can also save the report locally as json
|
80
|
+
scrapper.save_report_locally_as_json
|
81
|
+
```
|
82
|
+
|
83
|
+
|
84
|
+
## Author
|
85
|
+
|
86
|
+
π€ **VinΓcius Kammradt**
|
87
|
+
|
88
|
+
* Website: https://kammradt.super.site
|
89
|
+
* Twitter: [@kammzinho](https://twitter.com/kammzinho)
|
90
|
+
* Github: [@kammradt](https://github.com/kammradt)
|
91
|
+
* LinkedIn: [@vinicius-kammradt](https://linkedin.com/in/vinicius-kammradt)
|
92
|
+
|
93
|
+
## Show your support
|
94
|
+
|
95
|
+
Give a βοΈ if this project helped you!
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'nokogiri'
|
4
|
+
require_relative 'scrapper'
|
5
|
+
|
6
|
+
class MTGTop8Scrapper < Scrapper
|
7
|
+
def generate_report
|
8
|
+
@doc = doc_or_cache
|
9
|
+
|
10
|
+
players = top_8_players
|
11
|
+
format = event_format
|
12
|
+
date = event_date
|
13
|
+
event_link = event_link_without_prefix
|
14
|
+
|
15
|
+
@report = { players:, date:, format:, event_link: }
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def top_8_players
|
21
|
+
# TODO: Handle events with less than/more than 8
|
22
|
+
indexes_for_top_8_player_table = (2..9).to_a
|
23
|
+
|
24
|
+
indexes_for_top_8_player_table.map { |i| map_doc_to_report(i) }.sort_by { |player| player[:rank] }
|
25
|
+
end
|
26
|
+
|
27
|
+
def map_doc_to_report(index)
|
28
|
+
rank = rank_value(index)
|
29
|
+
player = player_value(index)
|
30
|
+
deck = deck_value(index)
|
31
|
+
|
32
|
+
{ rank:, player:, deck: }
|
33
|
+
end
|
34
|
+
|
35
|
+
def event_format
|
36
|
+
path = '/html/body/div/div/div[7]/div[1]/div/div[1]/div[1]/div[1]'
|
37
|
+
|
38
|
+
@doc.at(path).text.strip
|
39
|
+
end
|
40
|
+
|
41
|
+
def event_date
|
42
|
+
path = '/html/body/div/div/div[7]/div[1]/div/div[1]/div[1]/div[2]'
|
43
|
+
|
44
|
+
@doc.at(path).text.partition('-').last.strip
|
45
|
+
end
|
46
|
+
|
47
|
+
def rank_value(index)
|
48
|
+
path = "/html/body/div/div/div[7]/div[1]/div/div[1]/div[#{index}]/div/div[1]"
|
49
|
+
|
50
|
+
@doc.at(path).text.strip.to_i
|
51
|
+
end
|
52
|
+
|
53
|
+
def player_value(index)
|
54
|
+
path = "/html/body/div/div/div[7]/div[1]/div/div[1]/div[#{index}]/div/div[3]/div[2]/a"
|
55
|
+
|
56
|
+
@doc.at(path).text.strip
|
57
|
+
end
|
58
|
+
|
59
|
+
def deck_value(index)
|
60
|
+
path = "/html/body/div/div/div[7]/div[1]/div/div[1]/div[#{index}]/div/div[3]/div[1]"
|
61
|
+
|
62
|
+
@doc.at(path).text.strip
|
63
|
+
end
|
64
|
+
end
|
data/lib/scrapper.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'open-uri'
|
4
|
+
require 'json'
|
5
|
+
|
6
|
+
class Scrapper
|
7
|
+
attr_reader :report
|
8
|
+
|
9
|
+
def initialize(link)
|
10
|
+
@link = link
|
11
|
+
end
|
12
|
+
|
13
|
+
def generate_report
|
14
|
+
raise NotImplementedError
|
15
|
+
end
|
16
|
+
|
17
|
+
def save_report_locally_as_json
|
18
|
+
File.write(filename_for_json, @report.to_json)
|
19
|
+
|
20
|
+
filename_for_json
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def doc_or_cache
|
26
|
+
return File.open('offline/doc.html') { |f| Nokogiri::HTML(f) } if ENV['TESTING']
|
27
|
+
|
28
|
+
Nokogiri::HTML(URI.parse(@link).open)
|
29
|
+
end
|
30
|
+
|
31
|
+
def event_link_without_prefix
|
32
|
+
@link
|
33
|
+
.delete_prefix('https')
|
34
|
+
.delete_prefix('://')
|
35
|
+
.delete_prefix('www.')
|
36
|
+
end
|
37
|
+
|
38
|
+
def filename_for_json
|
39
|
+
event_link = @link.delete_prefix('https://www.mtgtop8.com/')
|
40
|
+
|
41
|
+
"#{event_link}.json"
|
42
|
+
end
|
43
|
+
end
|
metadata
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mtgtop8_scrapper
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.4
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Vinicius Kammradt
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-02-26 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Scrape data from MTGTop8 into simple reports
|
14
|
+
email: vinicius.kammradt1@gmail.com
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- README.md
|
20
|
+
- lib/mtgtop8_scrapper.rb
|
21
|
+
- lib/scrapper.rb
|
22
|
+
homepage: https://rubygems.org/gems/mtgtop8_scrapper
|
23
|
+
licenses:
|
24
|
+
- MIT
|
25
|
+
metadata:
|
26
|
+
rubygems_mfa_required: 'true'
|
27
|
+
post_install_message:
|
28
|
+
rdoc_options: []
|
29
|
+
require_paths:
|
30
|
+
- lib
|
31
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
32
|
+
requirements:
|
33
|
+
- - ">="
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: 3.1.2
|
36
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
requirements: []
|
42
|
+
rubygems_version: 3.3.7
|
43
|
+
signing_key:
|
44
|
+
specification_version: 4
|
45
|
+
summary: Scrape data from MTGTop8 into simple reports
|
46
|
+
test_files: []
|