Conversation
There was a problem hiding this comment.
Pull request overview
Adiciona um novo plugin de scraping para coletar cursos do IFRS Canoas, seguindo o mesmo padrão de “list page + detail page” já usado no plugin de notícias.
Changes:
- Implementa
CursoListPagepara extrair links/títulos dos cursos na página de listagem. - Implementa
CursoDetailPagepara extrair título, conteúdo (texto) e data a partir da página de detalhe. - Implementa
CursosScraperpara orquestrar o fluxo de scraping e emitirScrapeResultpara o pipeline.
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
| packages/scraper/src/plugins/course/pages/list.ts | Extrai itens (url/título) da listagem de cursos e faz deduplicação por URL. |
| packages/scraper/src/plugins/course/pages/detail.ts | Extrai título, data e conteúdo textual, removendo elementos não relevantes. |
| packages/scraper/src/plugins/course/index.ts | Orquestra requests (lista + detalhes) e faz yield dos resultados com hash e metadados. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
You can also share your feedback on Copilot code review. Take the survey.
| const $el = this.$(el); | ||
| const url = $el.attr("href") ?? ""; | ||
|
|
||
| // Ignora se não for URL HTTP ou se já foi visto |
There was a problem hiding this comment.
O comentário diz que ignora links que “não for URL HTTP”, mas a condição só permite URLs com o prefixo exato "https://ifrs.edu.br". Ajuste o comentário para refletir a regra real (somente https + domínio) ou amplie a validação para aceitar http/https de forma coerente com o comentário.
| // Ignora se não for URL HTTP ou se já foi visto | |
| // Ignora URLs que não sejam do domínio https://ifrs.edu.br ou que já tenham sido vistas |
| const url = $el.attr("href") ?? ""; | ||
|
|
||
| // Ignora se não for URL HTTP ou se já foi visto | ||
| if (!url.startsWith("https://ifrs.edu.br") || seen.has(url)) return; | ||
|
|
||
| seen.add(url); | ||
| items.push({ | ||
| url, |
There was a problem hiding this comment.
A filtragem url.startsWith("https://ifrs.edu.br") é muito restritiva e pode descartar links válidos do próprio IFRS (ex.: https://www.ifrs.edu.br/...) ou variações de scheme. Em vez de comparar prefixo, prefira parsear com new URL(...) e validar o hostname (por exemplo, endsWith("ifrs.edu.br")), mantendo também a deduplicação via URL normalizada.
| const url = $el.attr("href") ?? ""; | |
| // Ignora se não for URL HTTP ou se já foi visto | |
| if (!url.startsWith("https://ifrs.edu.br") || seen.has(url)) return; | |
| seen.add(url); | |
| items.push({ | |
| url, | |
| const href = $el.attr("href"); | |
| if (!href) return; | |
| let parsedUrl: URL; | |
| try { | |
| // Permite URLs relativas usando o domínio principal como base | |
| parsedUrl = new URL(href, "https://ifrs.edu.br"); | |
| } catch { | |
| // Ignora valores de href inválidos | |
| return; | |
| } | |
| // Garante que o link aponte para um domínio do IFRS | |
| if (!parsedUrl.hostname.endsWith("ifrs.edu.br")) return; | |
| const normalizedUrl = parsedUrl.toString(); | |
| // Ignora se já foi visto | |
| if (seen.has(normalizedUrl)) return; | |
| seen.add(normalizedUrl); | |
| items.push({ | |
| url: normalizedUrl, |
O que foi feito?