From 043ceb9521412942b2278fef038d8949e8f29052 Mon Sep 17 00:00:00 2001 From: "Alex.Liu" Date: Thu, 28 Sep 2023 12:11:43 +0800 Subject: [PATCH 1/8] feat: add lineups info --- tfmkt/spiders/games.py | 128 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 127 insertions(+), 1 deletion(-) diff --git a/tfmkt/spiders/games.py b/tfmkt/spiders/games.py index d86165f..aa5e2f4 100644 --- a/tfmkt/spiders/games.py +++ b/tfmkt/spiders/games.py @@ -119,6 +119,100 @@ def extract_game_events(self, response, event_type): return events + def parse_lineups(self, response, base): + """Parse lineups. + + @url https://www.transfermarkt.co.uk/spielbericht/aufstellung/spielbericht/3098550 + @returns items 1 1 + @cb_kwargs {"base": {"item": "game info"}} + @scrapes starting lineup substitutes + """ + + item = base['item'] + lineups = item['lineups'] + + starting_elements = response.xpath( + f"//div[./h2[contains(@class, 'content-box-headline')] and normalize-space(./h2/text()) = 'Starting Line-up']//div[@class='responsive-table']" + ) + substitutes_elements = response.xpath( + f"//div[./h2[contains(@class, 'content-box-headline')] and normalize-space(./h2/text()) = 'Substitutes']//div[@class='responsive-table']" + ) + + for i in range(len(starting_elements)): + tr_elements = starting_elements[i].xpath("./table[@class = 'items']//tr") + defenders_count = 0 + midfielders_count = 0 + forwards_count = 0 + for j in range(len(tr_elements)): + e = tr_elements[j] + idx = j % 3 + number_idx = idx == 0 + player_idx = idx == 1 + position_idx = idx == 2 + if number_idx: + player = {} + player['number'] = e.xpath("./td/div[@class = 'rn_nummer']/text()").get() + elif player_idx: + player['href'] = e.xpath("./td/a/@href").get() + player['name'] = e.xpath("./td/a/@title").get() + player['team_captain'] = 1 if e.xpath("./td/span/@title").get() else 0 + elif position_idx: + position = self.safe_strip(e.xpath("./td/text()").get().split(',')[0]) + player['position'] = position + if "Back" in position: + defenders_count = defenders_count + 1 + elif "Midfield" in position: + midfielders_count = midfielders_count + 1 + elif "Winger" in position or "Forward" in position or "Striker" in position: + forwards_count = forwards_count + 1 + + if position_idx: + if i == 0: + lineups['home_club']['starting_lineup'].append(player) + else: + lineups['away_club']['starting_lineup'].append(player) + + formation = f"{defenders_count}-{midfielders_count}-{forwards_count}" if (defenders_count + midfielders_count + forwards_count) == 10 else None + if i == 0: + if lineups['home_club']['formation'] is None: + lineups['home_club']['formation'] = formation + else: + lineups['home_club']['formation'] = lineups['home_club']['formation'].split(':')[1].strip() + else: + if lineups['away_club']['formation'] is None: + lineups['away_club']['formation'] = formation + else: + lineups['away_club']['formation'] = lineups['away_club']['formation'].split(':')[1].strip() + + + for i in range(len(substitutes_elements)): + tr_elements = substitutes_elements[i].xpath("./table[@class = 'items']//tr") + for j in range(len(tr_elements)): + e = tr_elements[j] + idx = j % 3 + number_idx = idx == 0 + player_idx = idx == 1 + position_idx = idx == 2 + if number_idx: + player = {} + player['number'] = e.xpath("./td/div[@class = 'rn_nummer']/text()").get() + elif player_idx: + player['href'] = e.xpath("./td/a/@href").get() + player['name'] = e.xpath("./td/a/@title").get() + player['team_captain'] = 1 if e.xpath("./td/span/@title").get() else 0 + elif position_idx: + player['position'] = self.safe_strip(e.xpath("./td/text()").get().split(',')[0]) + + if position_idx: + if i == 0: + lineups['home_club']['substitutes'].append(player) + else: + lineups['away_club']['substitutes'].append(player) + + item['lineups'] = lineups + + yield item + def parse_game(self, response, base): """Parse games and fixutres page. From this page follow to each game page. @@ -210,6 +304,38 @@ def parse_game(self, response, base): item["away_manager"] = { 'name': away_manager_name } + + lineups_url = base['href'].replace('index', 'aufstellung') + lineups_elements = response.xpath( + f".//div[./h2/@class = 'content-box-headline' and normalize-space(./h2/text()) = 'Line-Ups']/div[contains(@class, 'columns')]" + ) + home_linup = lineups_elements[0] + away_linup = lineups_elements[1] + + home_formation = self.safe_strip(home_linup.xpath("./div[@class = 'row']/div/text()").get()) + away_formation = self.safe_strip(away_linup.xpath("./div[@class = 'row']/div/text()").get()) + + lineups = { + 'href': lineups_url, + 'home_club': { + 'formation': home_formation, + 'starting_lineup': [], + 'substitutes': [] + }, + 'away_club': { + 'formation': away_formation, + 'starting_lineup': [], + 'substitutes': [] + } + } + + item['lineups'] = lineups - yield item + cb_kwargs = { + 'base': { + 'item': item + } + } + + yield response.follow(lineups_url, self.parse_lineups, cb_kwargs=cb_kwargs) \ No newline at end of file From ada93fb8de8e557e48e8ca8299344496f8e71cda Mon Sep 17 00:00:00 2001 From: "Alex.Liu" Date: Thu, 28 Sep 2023 18:41:16 +0800 Subject: [PATCH 2/8] feat: game_lineups crawler --- tfmkt/spiders/game_lineups.py | 161 ++++++++++++++++++++++++++++++++++ tfmkt/spiders/games.py | 128 +-------------------------- 2 files changed, 162 insertions(+), 127 deletions(-) create mode 100644 tfmkt/spiders/game_lineups.py diff --git a/tfmkt/spiders/game_lineups.py b/tfmkt/spiders/game_lineups.py new file mode 100644 index 0000000..62c2939 --- /dev/null +++ b/tfmkt/spiders/game_lineups.py @@ -0,0 +1,161 @@ +from tfmkt.spiders.common import BaseSpider +from scrapy.shell import inspect_response # required for debugging +import re +from tfmkt.utils import background_position_in_px_to_minute + +class GamesSpider(BaseSpider): + name = 'game_lineups' + + def parse(self, response, parent): + """Parse game page. + + @url https://www.transfermarkt.co.uk/spielbericht/index/spielbericht/3098550 + @returns requests 1 1 + @cb_kwargs {"parent": "dummy"} + @scrapes type href parent + """ + + # uncommenting the two lines below will open a scrapy shell with the context of this request + # when you run the crawler. this is useful for developing new extractors + + # inspect_response(response, self) + # exit(1) + + lineups_url = parent['href'].replace('index', 'aufstellung') + lineups_elements = response.xpath( + f".//div[./h2/@class = 'content-box-headline' and normalize-space(./h2/text()) = 'Line-Ups']/div[contains(@class, 'columns')]" + ) + home_linup = lineups_elements[0] + away_linup = lineups_elements[1] + + home_formation = self.safe_strip(home_linup.xpath("./div[@class = 'row']/div/text()").get()) + away_formation = self.safe_strip(away_linup.xpath("./div[@class = 'row']/div/text()").get()) + + lineups = { + 'home_club': { + 'href': parent['home_club']['href'], + 'formation': home_formation, + 'starting_lineup': [], + 'substitutes': [] + }, + 'away_club': { + 'href': parent['away_club']['href'], + 'formation': away_formation, + 'starting_lineup': [], + 'substitutes': [] + } + } + + cb_kwargs = { + 'base': { + 'parent': parent, + 'lineups': lineups, + 'href': lineups_url + } + } + + return response.follow(lineups_url, self.parse_lineups, cb_kwargs=cb_kwargs) + + def parse_lineups(self, response, base): + """Parse lineups. + + @url https://www.transfermarkt.co.uk/spielbericht/aufstellung/spielbericht/3098550 + @returns items 1 1 + @cb_kwargs {"base": {"item": "game info"}} + @scrapes type parent game_id href home_club away_club + """ + + parent = base['parent'] + lineups = base['lineups'] + + starting_elements = response.xpath( + f"//div[./h2[contains(@class, 'content-box-headline')] and normalize-space(./h2/text()) = 'Starting Line-up']//div[@class='responsive-table']" + ) + substitutes_elements = response.xpath( + f"//div[./h2[contains(@class, 'content-box-headline')] and normalize-space(./h2/text()) = 'Substitutes']//div[@class='responsive-table']" + ) + + for i in range(len(starting_elements)): + tr_elements = starting_elements[i].xpath("./table[@class = 'items']//tr") + defenders_count = 0 + midfielders_count = 0 + forwards_count = 0 + for j in range(len(tr_elements)): + e = tr_elements[j] + idx = j % 3 + number_idx = idx == 0 + player_idx = idx == 1 + position_idx = idx == 2 + if number_idx: + player = {} + player['number'] = e.xpath("./td/div[@class = 'rn_nummer']/text()").get() + elif player_idx: + player['href'] = e.xpath("./td/a/@href").get() + player['name'] = e.xpath("./td/a/@title").get() + player['team_captain'] = 1 if e.xpath("./td/span/@title").get() else 0 + elif position_idx: + position = self.safe_strip(e.xpath("./td/text()").get().split(',')[0]) + player['position'] = position + if "Back" in position: + defenders_count = defenders_count + 1 + elif "Midfield" in position: + midfielders_count = midfielders_count + 1 + elif "Winger" in position or "Forward" in position or "Striker" in position: + forwards_count = forwards_count + 1 + + if position_idx: + if i == 0: + lineups['home_club']['starting_lineup'].append(player) + else: + lineups['away_club']['starting_lineup'].append(player) + + formation = f"{defenders_count}-{midfielders_count}-{forwards_count}" if (defenders_count + midfielders_count + forwards_count) == 10 else None + if i == 0: + if lineups['home_club']['formation'] is None: + lineups['home_club']['formation'] = formation + else: + lineups['home_club']['formation'] = lineups['home_club']['formation'].split(':')[1].strip() + else: + if lineups['away_club']['formation'] is None: + lineups['away_club']['formation'] = formation + else: + lineups['away_club']['formation'] = lineups['away_club']['formation'].split(':')[1].strip() + + + for i in range(len(substitutes_elements)): + tr_elements = substitutes_elements[i].xpath("./table[@class = 'items']//tr") + for j in range(len(tr_elements)): + e = tr_elements[j] + idx = j % 3 + number_idx = idx == 0 + player_idx = idx == 1 + position_idx = idx == 2 + if number_idx: + player = {} + player['number'] = e.xpath("./td/div[@class = 'rn_nummer']/text()").get() + elif player_idx: + player['href'] = e.xpath("./td/a/@href").get() + player['name'] = e.xpath("./td/a/@title").get() + player['team_captain'] = 1 if e.xpath("./td/span/@title").get() else 0 + elif position_idx: + player['position'] = self.safe_strip(e.xpath("./td/text()").get().split(',')[0]) + + if position_idx: + if i == 0: + lineups['home_club']['substitutes'].append(player) + else: + lineups['away_club']['substitutes'].append(player) + + item = { + 'type': 'game_lineups', + 'parent': { + 'href': parent['href'], + 'type': parent['type'], + }, + 'href': base['href'], + 'game_id': parent['game_id'], + 'home_club': lineups['home_club'], + 'away_club': lineups['away_club'] + } + + yield item diff --git a/tfmkt/spiders/games.py b/tfmkt/spiders/games.py index aa5e2f4..d86165f 100644 --- a/tfmkt/spiders/games.py +++ b/tfmkt/spiders/games.py @@ -119,100 +119,6 @@ def extract_game_events(self, response, event_type): return events - def parse_lineups(self, response, base): - """Parse lineups. - - @url https://www.transfermarkt.co.uk/spielbericht/aufstellung/spielbericht/3098550 - @returns items 1 1 - @cb_kwargs {"base": {"item": "game info"}} - @scrapes starting lineup substitutes - """ - - item = base['item'] - lineups = item['lineups'] - - starting_elements = response.xpath( - f"//div[./h2[contains(@class, 'content-box-headline')] and normalize-space(./h2/text()) = 'Starting Line-up']//div[@class='responsive-table']" - ) - substitutes_elements = response.xpath( - f"//div[./h2[contains(@class, 'content-box-headline')] and normalize-space(./h2/text()) = 'Substitutes']//div[@class='responsive-table']" - ) - - for i in range(len(starting_elements)): - tr_elements = starting_elements[i].xpath("./table[@class = 'items']//tr") - defenders_count = 0 - midfielders_count = 0 - forwards_count = 0 - for j in range(len(tr_elements)): - e = tr_elements[j] - idx = j % 3 - number_idx = idx == 0 - player_idx = idx == 1 - position_idx = idx == 2 - if number_idx: - player = {} - player['number'] = e.xpath("./td/div[@class = 'rn_nummer']/text()").get() - elif player_idx: - player['href'] = e.xpath("./td/a/@href").get() - player['name'] = e.xpath("./td/a/@title").get() - player['team_captain'] = 1 if e.xpath("./td/span/@title").get() else 0 - elif position_idx: - position = self.safe_strip(e.xpath("./td/text()").get().split(',')[0]) - player['position'] = position - if "Back" in position: - defenders_count = defenders_count + 1 - elif "Midfield" in position: - midfielders_count = midfielders_count + 1 - elif "Winger" in position or "Forward" in position or "Striker" in position: - forwards_count = forwards_count + 1 - - if position_idx: - if i == 0: - lineups['home_club']['starting_lineup'].append(player) - else: - lineups['away_club']['starting_lineup'].append(player) - - formation = f"{defenders_count}-{midfielders_count}-{forwards_count}" if (defenders_count + midfielders_count + forwards_count) == 10 else None - if i == 0: - if lineups['home_club']['formation'] is None: - lineups['home_club']['formation'] = formation - else: - lineups['home_club']['formation'] = lineups['home_club']['formation'].split(':')[1].strip() - else: - if lineups['away_club']['formation'] is None: - lineups['away_club']['formation'] = formation - else: - lineups['away_club']['formation'] = lineups['away_club']['formation'].split(':')[1].strip() - - - for i in range(len(substitutes_elements)): - tr_elements = substitutes_elements[i].xpath("./table[@class = 'items']//tr") - for j in range(len(tr_elements)): - e = tr_elements[j] - idx = j % 3 - number_idx = idx == 0 - player_idx = idx == 1 - position_idx = idx == 2 - if number_idx: - player = {} - player['number'] = e.xpath("./td/div[@class = 'rn_nummer']/text()").get() - elif player_idx: - player['href'] = e.xpath("./td/a/@href").get() - player['name'] = e.xpath("./td/a/@title").get() - player['team_captain'] = 1 if e.xpath("./td/span/@title").get() else 0 - elif position_idx: - player['position'] = self.safe_strip(e.xpath("./td/text()").get().split(',')[0]) - - if position_idx: - if i == 0: - lineups['home_club']['substitutes'].append(player) - else: - lineups['away_club']['substitutes'].append(player) - - item['lineups'] = lineups - - yield item - def parse_game(self, response, base): """Parse games and fixutres page. From this page follow to each game page. @@ -304,38 +210,6 @@ def parse_game(self, response, base): item["away_manager"] = { 'name': away_manager_name } - - lineups_url = base['href'].replace('index', 'aufstellung') - lineups_elements = response.xpath( - f".//div[./h2/@class = 'content-box-headline' and normalize-space(./h2/text()) = 'Line-Ups']/div[contains(@class, 'columns')]" - ) - home_linup = lineups_elements[0] - away_linup = lineups_elements[1] - - home_formation = self.safe_strip(home_linup.xpath("./div[@class = 'row']/div/text()").get()) - away_formation = self.safe_strip(away_linup.xpath("./div[@class = 'row']/div/text()").get()) - - lineups = { - 'href': lineups_url, - 'home_club': { - 'formation': home_formation, - 'starting_lineup': [], - 'substitutes': [] - }, - 'away_club': { - 'formation': away_formation, - 'starting_lineup': [], - 'substitutes': [] - } - } - - item['lineups'] = lineups - cb_kwargs = { - 'base': { - 'item': item - } - } - - yield response.follow(lineups_url, self.parse_lineups, cb_kwargs=cb_kwargs) + yield item \ No newline at end of file From 479e44025f5f55437a1951923667d1e8289a0fe1 Mon Sep 17 00:00:00 2001 From: "Alex.Liu" Date: Thu, 28 Sep 2023 19:04:11 +0800 Subject: [PATCH 3/8] chore: docstring --- tfmkt/spiders/game_lineups.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tfmkt/spiders/game_lineups.py b/tfmkt/spiders/game_lineups.py index 62c2939..6eb72c5 100644 --- a/tfmkt/spiders/game_lineups.py +++ b/tfmkt/spiders/game_lineups.py @@ -61,7 +61,7 @@ def parse_lineups(self, response, base): @url https://www.transfermarkt.co.uk/spielbericht/aufstellung/spielbericht/3098550 @returns items 1 1 - @cb_kwargs {"base": {"item": "game info"}} + @cb_kwargs {"base": {"href": "some_href", "lineups": {}, "parent": {}}} @scrapes type parent game_id href home_club away_club """ From 706def4f150b7292a0150c927eb70618ea5fd06b Mon Sep 17 00:00:00 2001 From: "Alex.Liu" Date: Thu, 28 Sep 2023 19:30:32 +0800 Subject: [PATCH 4/8] chore: docstrings --- tfmkt/spiders/game_lineups.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tfmkt/spiders/game_lineups.py b/tfmkt/spiders/game_lineups.py index 6eb72c5..9fbc3d3 100644 --- a/tfmkt/spiders/game_lineups.py +++ b/tfmkt/spiders/game_lineups.py @@ -11,7 +11,7 @@ def parse(self, response, parent): @url https://www.transfermarkt.co.uk/spielbericht/index/spielbericht/3098550 @returns requests 1 1 - @cb_kwargs {"parent": "dummy"} + @cb_kwargs {"parent": {"href": "some_href"}} @scrapes type href parent """ @@ -61,7 +61,7 @@ def parse_lineups(self, response, base): @url https://www.transfermarkt.co.uk/spielbericht/aufstellung/spielbericht/3098550 @returns items 1 1 - @cb_kwargs {"base": {"href": "some_href", "lineups": {}, "parent": {}}} + @cb_kwargs {"base": {"href": "some_href", "lineups": {"home_club": {"formation": "formation", "starting_lineup": [], "substitutes": []}, "away_club": {"formation": "formation", "starting_lineup": [], "substitutes": []}}, "parent": {}}} @scrapes type parent game_id href home_club away_club """ From e097783ee4943f449a9af20360fa3e9300447736 Mon Sep 17 00:00:00 2001 From: "Alex.Liu" Date: Thu, 28 Sep 2023 19:35:44 +0800 Subject: [PATCH 5/8] chore: docstrings --- tfmkt/spiders/game_lineups.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tfmkt/spiders/game_lineups.py b/tfmkt/spiders/game_lineups.py index 9fbc3d3..3ca7fbe 100644 --- a/tfmkt/spiders/game_lineups.py +++ b/tfmkt/spiders/game_lineups.py @@ -11,7 +11,7 @@ def parse(self, response, parent): @url https://www.transfermarkt.co.uk/spielbericht/index/spielbericht/3098550 @returns requests 1 1 - @cb_kwargs {"parent": {"href": "some_href"}} + @cb_kwargs {"parent": {"href": "some_href", "home_club": {}, "away_club": {}}} @scrapes type href parent """ @@ -61,7 +61,7 @@ def parse_lineups(self, response, base): @url https://www.transfermarkt.co.uk/spielbericht/aufstellung/spielbericht/3098550 @returns items 1 1 - @cb_kwargs {"base": {"href": "some_href", "lineups": {"home_club": {"formation": "formation", "starting_lineup": [], "substitutes": []}, "away_club": {"formation": "formation", "starting_lineup": [], "substitutes": []}}, "parent": {}}} + @cb_kwargs {"base": {"href": "some_href", "lineups": {"home_club": {"formation": "Starting Line-up: 4-3-3", "starting_lineup": [], "substitutes": []}, "away_club": {"formation": "Starting Line-up: 4-3-3", "starting_lineup": [], "substitutes": []}}, "parent": {}}} @scrapes type parent game_id href home_club away_club """ From feb06128a65b274721515586ae93aa0fb4294614 Mon Sep 17 00:00:00 2001 From: "Alex.Liu" Date: Thu, 28 Sep 2023 19:45:16 +0800 Subject: [PATCH 6/8] chore: docstrings --- tfmkt/spiders/game_lineups.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/tfmkt/spiders/game_lineups.py b/tfmkt/spiders/game_lineups.py index 3ca7fbe..fffc9e3 100644 --- a/tfmkt/spiders/game_lineups.py +++ b/tfmkt/spiders/game_lineups.py @@ -11,7 +11,7 @@ def parse(self, response, parent): @url https://www.transfermarkt.co.uk/spielbericht/index/spielbericht/3098550 @returns requests 1 1 - @cb_kwargs {"parent": {"href": "some_href", "home_club": {}, "away_club": {}}} + @cb_kwargs {"parent": {"href": "some_href", "home_club": {"href": "some_href"}, "away_club": {"href": "some_href"}}} @scrapes type href parent """ @@ -61,7 +61,20 @@ def parse_lineups(self, response, base): @url https://www.transfermarkt.co.uk/spielbericht/aufstellung/spielbericht/3098550 @returns items 1 1 - @cb_kwargs {"base": {"href": "some_href", "lineups": {"home_club": {"formation": "Starting Line-up: 4-3-3", "starting_lineup": [], "substitutes": []}, "away_club": {"formation": "Starting Line-up: 4-3-3", "starting_lineup": [], "substitutes": []}}, "parent": {}}} + @cb_kwargs { + "base": { + "href": "some_href", + "lineups": { + "home_club": { + "formation": "Starting Line-up: 4-3-3", "starting_lineup": [], "substitutes": [] + }, + "away_club": { + "formation": "Starting Line-up: 4-3-3", "starting_lineup": [], "substitutes": [] + } + }, + "parent": {"href": "some_href", "type": "game", "game_id": 123} + } + } @scrapes type parent game_id href home_club away_club """ From 56163e94a64049fd7121b52d4254d77c4a0d562d Mon Sep 17 00:00:00 2001 From: "Alex.Liu" Date: Thu, 28 Sep 2023 19:53:35 +0800 Subject: [PATCH 7/8] chore: docstring --- tfmkt/spiders/game_lineups.py | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/tfmkt/spiders/game_lineups.py b/tfmkt/spiders/game_lineups.py index fffc9e3..0d135bd 100644 --- a/tfmkt/spiders/game_lineups.py +++ b/tfmkt/spiders/game_lineups.py @@ -61,20 +61,7 @@ def parse_lineups(self, response, base): @url https://www.transfermarkt.co.uk/spielbericht/aufstellung/spielbericht/3098550 @returns items 1 1 - @cb_kwargs { - "base": { - "href": "some_href", - "lineups": { - "home_club": { - "formation": "Starting Line-up: 4-3-3", "starting_lineup": [], "substitutes": [] - }, - "away_club": { - "formation": "Starting Line-up: 4-3-3", "starting_lineup": [], "substitutes": [] - } - }, - "parent": {"href": "some_href", "type": "game", "game_id": 123} - } - } + @cb_kwargs {"base": {"href": "some_href", "lineups": {"home_club": {"formation": "Starting Line-up: 4-3-3", "starting_lineup": [], "substitutes": []}, "away_club": {"formation": "Starting Line-up: 4-3-3", "starting_lineup": [], "substitutes": []}}, "parent": {"href": "some_href", "type": "game", "game_id": 123}}} @scrapes type parent game_id href home_club away_club """ From 2d1cf9f455dc863958dbc7cca619ab9a8eb3f84a Mon Sep 17 00:00:00 2001 From: "Alex.Liu" Date: Thu, 28 Sep 2023 20:38:21 +0800 Subject: [PATCH 8/8] fix: class name --- tfmkt/spiders/game_lineups.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tfmkt/spiders/game_lineups.py b/tfmkt/spiders/game_lineups.py index 0d135bd..58587f7 100644 --- a/tfmkt/spiders/game_lineups.py +++ b/tfmkt/spiders/game_lineups.py @@ -3,7 +3,7 @@ import re from tfmkt.utils import background_position_in_px_to_minute -class GamesSpider(BaseSpider): +class GameLineupsSpider(BaseSpider): name = 'game_lineups' def parse(self, response, parent):