https://github.com/lorhansohaky/pooa
https://github.com/lorhansohaky/pooa
Last synced: 3 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/lorhansohaky/pooa
- Owner: LorhanSohaky
- License: mit
- Created: 2020-12-05T19:32:24.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2020-12-06T16:34:22.000Z (over 4 years ago)
- Last Synced: 2024-12-05T01:13:00.406Z (6 months ago)
- Language: Python
- Size: 2.04 MB
- Stars: 1
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: news.py
- License: LICENSE
Awesome Lists containing this project
README
# WEB SCRAPPER
Ferramenta para extrair links de notícias
## Autores
- Lorhan Sohaky
- Lucas Martins## Como instalar?
Para executar o projeto é necessário ter o [Python 3.8](https://www.python.org/downloads/), o [pipenv](https://pypi.org/project/pipenv/) para gerenciar as dependências do projeto e o [geckodriver (driver do Firefox)](https://www.selenium.dev/selenium/docs/api/py/index.html#drivers).Após ter tudo instalado, será preciso adicionar o local de instalação do geckodriver no PATH do sistema. Em seguida basta executar
```sh
pipenv install
```### Como executar o projeto?
Para entrar no ambiente virtual criado durante a instalação, basta executar:
```sh
pipenv shell
```Caso queira ver como executar o programa, basta executar:
```sh
python main.py --help
```
Agora para extrair as notícias de um site basta escolher de qual site deseja pegar as notícias e qual o formato da saída que deseja. No exemplo abaixo são extraídas as notícias do site do DC e do G1; e o tipo de saída é o CSV.
```sh
python main.py --sites g1 site-dc --output-type csv
```## Como extrair notícias de outros sites?
Para isso é necessário criar um novo arquivo pasta `extractors`. Por exemplo `site_que_quero_extrair.py`. Com a seguinte estrutura:```python
from news import News
from .abstract_news_extractor import AbstractNewsExtractorclass SiteQueQueroExtrairExtractor(AbstractNewsExtractor):
def __init__(self):
super().__init__('https://site_que_quero_extrair.com')def extract_news(self):
# Implementação da extração
```Em seguida adicionar este novo extrator a lista de extratores disponíveis lá no arquivo `main.py`
```python
from extractors.site_que_quero_extrair import SiteQueQueroExtrairExtractorsite_options = {
'g1': G1NewsExtractor,
'site-dc': SiteDCNewsExtractor,
'site-que-quero-extrair': SiteQueQueroExtrairExtractor
}
```## Como incluir um novo writer?
Para isso é necessário criar um novo arquivo pasta `writers`. Por exemplo `txt_writer.py`. Com a seguinte estrutura:
```python
from .abstract_writer import AbstractWriterclass TxtWriter(AbstractWriter):
def __init__(self):
pass
def write_file(self,output_filename, list_news):
# Implementação da escrita```
Em seguida adicionar este novo escritor a lista de escritores disponíveis lá no arquivo `main.py`
```python
from writers.txt_writer import TxtWriteroutput_options = {
'csv': CSVWriter,
'json': JSONWriter,
'xml': XMLWriter,
'txt': TxtWriter
}
```## Notas
Durante o processo de criação das interfaces dos extratores pensamos em passar para o método de extração qual tag ou classe que deveria ser buscada, mas vimos que isso tornaria todo o processo muito engessado e que não pudesse atender a todos os tipos de sites e notícias, tendo em vista que alguns site geram o html a partir de código javascript e outros possuem notícias com destaques diferentes e consequentemente estruturas diferentes. Então achamos mais vantajoso cada extrator implementar como irá pegar as notícias. E a partir dessa decisão, é possível extrair notícias de mais de uma página de um mesmo site (por exemplo sites que têm meusite.com/?page=2) e de sites que fazem a renderização no cliente (por exemplo o site do DC).