csv-openalex
Science Score: 44.0%
This score indicates how likely this project is to be science-related based on various indicators:
-
✓CITATION.cff file
Found CITATION.cff file -
✓codemeta.json file
Found codemeta.json file -
✓.zenodo.json file
Found .zenodo.json file -
○DOI references
-
○Academic publication links
-
○Academic email domains
-
○Institutional organization owner
-
○JOSS paper metadata
-
○Scientific vocabulary similarity
Low similarity (3.6%) to scientific vocabulary
Repository
Basic Info
- Host: GitHub
- Owner: BSBContreras
- Language: Python
- Default Branch: master
- Size: 32.2 KB
Statistics
- Stars: 0
- Watchers: 1
- Forks: 1
- Open Issues: 0
- Releases: 0
Metadata Files
README.md
OpenAlex CSV Data Collector - Author & Citation Based
Este projeto contém dois métodos de coleta de dados: um baseado em autores e outro baseado em citações. Ele permite coletar registros de dados da api do openalex (https://api.openalex.org), salvando os resultados em checkpoints para facilitar a retomada da coleta em caso de interrupções.
Como funciona
O projeto possui dois scripts principais:
- AuthorBasedCollector.py: Coleta de dados baseada em autores.
- CitationBasedCollector.py: Coleta de dados baseada em citações.
Durante a execução, o sistema coleta e armazena sete principais tipos de informações, que são salvas em arquivos CSV dentro de uma pasta especificada (citations_based_database ou author_based_database):
- Trabalhos: Salvos no arquivo
openalex_works.csv. - Autores: Salvos no arquivo
openalex_authors.csv. - Citações: Salvas no arquivo
openalex_citations.csv. - Trabalhos relacionados: Salvos no arquivo
openalex_related_works.csv. - Conceitos: Salvos no arquivo
openalex_concepts.csv. - Tópicos: Salvos no arquivo
openalex_topics.csv. - Palavras-chave: Salvas no arquivo
openalex_keywords.csv.
Você pode escolher qual script executar passando o método desejado pela linha de comando, juntamente com os parâmetros de configuração, como limite de registros, tamanho de checkpoint e um ID OpenAlex de trabalho inicial.
Parâmetros
Os seguintes parâmetros podem ser passados para ajustar a coleta:
method: Escolhe o método de coleta (authorpara coleta baseada em autor,citationpara coleta baseada em citação).--record_limit: Limite de registros a serem coletados (padrão: 100000).--checkpoint_size: Tamanho do checkpoint para salvar progresso (padrão: 500).--initial_work_id: ID do trabalho inicial para começar a coleta (padrão:W4398186459).
Instalação
- Certifique-se de ter o Python 3.8 ou superior instalado em sua máquina.
- Clone este repositório ou baixe os arquivos.
(Opcional) Crie um ambiente virtual para isolar as dependências:
bash python -m venv venv source venv/bin/activate # Linux/Mac venv\Scripts\activate # WindowsInstale as dependências listadas no arquivo
requirements.txt:bash pip install -r requirements.txt
Executando o código
Você pode executar o código a partir da linha de comando, especificando o método de coleta e os parâmetros desejados.
Exemplo de uso - Coleta baseada em autores:
bash
python main.py author --record_limit 50000 --checkpoint_size 1000 --initial_work_id "W4398186459"
Exemplo de uso - Coleta baseada em citações:
bash
python main.py citation --record_limit 75000 --checkpoint_size 250 nitial_work_id "W4398186459"
Parâmetros opcionais:
record_limit: Define o limite de registros a serem coletados. Se omitido, o padrão é 100000.checkpoint_size: Define o tamanho do checkpoint, que determina quantos registros são processados antes de salvar o progresso. Se omitido, o padrão é 500.initial_work_id: Define o ID do trabalho inicial para iniciar a coleta. Se omitido, o padrão é "W4398186459".
Contribuindo
Se você encontrar problemas ou tiver sugestões de melhorias, sinta-se à vontade para abrir uma issue ou enviar um pull request.
Owner
- Name: Bruno Contreras
- Login: BSBContreras
- Kind: user
- Repositories: 4
- Profile: https://github.com/BSBContreras
Citation (CitationBasedCollector.py)
import os
import requests
import time
from collections import deque
from tqdm import tqdm
import datetime
from OpenalexCheckpoints import load_checkpoint, save_checkpoint_citations_based
from OpenalexUtils import get_data_from_openalex, batch_size, sleep_time
from OpenalexWriter import write_works_to_csv, write_citations_to_csv, \
write_related_works_to_csv, write_authors_to_csv, write_concepts_to_csv, \
write_topics_to_csv, write_keywords_to_csv, generate_progress_report
def main(record_limit, checkpoint_size, initial_work_id):
print(f"Record limit: {record_limit}")
print(f"Checkpoint size: {checkpoint_size}")
print(f"Initial work ID: {initial_work_id}")
csv_base_folder = f'{initial_work_id}_citations_based_database'
if not os.path.exists(csv_base_folder):
os.makedirs(csv_base_folder)
csv_works_filename = f'{csv_base_folder}/openalex_works.csv'
csv_authors_filename = f'{csv_base_folder}/openalex_authors.csv'
csv_citations_filename = f'{csv_base_folder}/openalex_citations.csv'
csv_related_works_filename = f'{csv_base_folder}/openalex_related_works.csv'
csv_concepts_filename = f'{csv_base_folder}/openalex_concepts.csv'
csv_topics_filename = f'{csv_base_folder}/openalex_topics.csv'
csv_keywords_filename = f'{csv_base_folder}/openalex_keywords.csv'
progress_report_file = f'{csv_base_folder}/openalex_progress_report.csv'
checkpoint_file = f'{csv_base_folder}/openalex_checkpoint.pkl'
# Carrega o estado salvo, se existir
checkpoint = load_checkpoint(checkpoint_file)
if checkpoint:
queue = deque(checkpoint['queue'])
work_visited = set(checkpoint['visited'])
works_count = checkpoint['count']
authors_count = checkpoint['authors_count']
citations_count = checkpoint['citations_count']
related_works_count = checkpoint['related_works_count']
concepts_count = checkpoint['concepts_count']
topics_count = checkpoint['topics_count']
keywords_count = checkpoint['keywords_count']
else:
queue = deque([initial_work_id])
work_visited = set()
works_count = 0
authors_count = 0
citations_count = 0
related_works_count = 0
concepts_count = 0
topics_count = 0
keywords_count = 0
# Início da coleta
start_time = datetime.datetime.now()
# Coleta os dados
with tqdm(total=record_limit, desc="Collecting data") as pbar:
pbar.update(works_count)
while queue and works_count < record_limit:
batch_ids = []
while queue and len(batch_ids) < batch_size:
current_work_id = queue.popleft()
if current_work_id not in work_visited:
batch_ids.append(current_work_id)
if not batch_ids:
continue
try:
data = get_data_from_openalex(batch_ids)
except requests.exceptions.RequestException as e:
print(f"Failed to retrieve data for batch {batch_ids}: {e}")
continue
works = data['results']
write_works_to_csv(csv_works_filename, works, mode='a')
write_authors_to_csv(csv_authors_filename, works, mode='a')
write_citations_to_csv(csv_citations_filename, works, mode='a')
write_related_works_to_csv(csv_related_works_filename, works, mode='a')
write_concepts_to_csv(csv_concepts_filename, works, mode='a')
write_topics_to_csv(csv_topics_filename, works, mode='a')
write_keywords_to_csv(csv_keywords_filename, works, mode='a')
for work in works:
work_visited.add(work['id'])
works_count += 1
authors_count += len(work.get('authorships', []))
citations_count += len(work.get('referenced_works', []))
related_works_count += len(work.get('related_works', []))
concepts_count += len(work.get('concepts', []))
topics_count += len(work.get('topics', []))
keywords_count += len(work.get('keywords', []))
for cited_work_id in work.get('referenced_works', []):
if cited_work_id not in work_visited:
queue.append(cited_work_id)
# Atualiza o progresso
pbar.update(len(works))
# Salva o checkpoint
if works_count // checkpoint_size > (works_count - len(works)) // checkpoint_size:
save_checkpoint_citations_based(
list(queue),
list(work_visited),
works_count,
authors_count,
citations_count,
related_works_count,
concepts_count,
topics_count,
keywords_count,
checkpoint_file
)
generate_progress_report(
start_time,
works_count,
authors_count,
citations_count,
related_works_count,
concepts_count,
topics_count,
keywords_count,
progress_report_file
)
# Espera entre as requisições para não sobrecarregar a API
time.sleep(sleep_time)
# Salva o checkpoint final
save_checkpoint_citations_based(
list(queue),
list(work_visited),
works_count,
authors_count,
citations_count,
related_works_count,
concepts_count,
topics_count,
keywords_count,
checkpoint_file
)
print(f"Data collection complete: {works_count} records collected.")
generate_progress_report(
start_time,
works_count,
authors_count,
citations_count,
related_works_count,
concepts_count,
topics_count,
keywords_count,
progress_report_file
)
print("Progress report generated.")
GitHub Events
Total
- Push event: 3
- Fork event: 1
Last Year
- Push event: 3
- Fork event: 1