Você está na página 1de 42

Python Avançado

Chico Camargo
Raspagem de dados
● Ética e legalidade
● Exemplo 1: Reddit
● Exemplo 2: Wikipedia
● Exemplo 3: Twitter
Ética e Legalidade
● Do lado do servidor
○ Número de acessos e limites da API
○ Compartilhamento de dados
● Do lado do indivíduo/usuário
○ Qual a expectativa de privacidade?
○ Como o usuário será afetado?
Ética e Legalidade
Perguntas boas pra se considerar:
○ Já existe algum estudo parecido publicado?
○ Será possível identificar indivíduos a partir dos meus dados?
○ O funcionamento ou modelo de negócio do site será afetado
pelos meus resultados?
○ Eu estou seguindo os termos e condições de uso?
APIs
● Significa Application Programming Interface
● É, como o nome sugere, uma interface com o conteúdo
● A API controla quem tem acesso a quais dados, e como
APIs: exemplo
● https://www.reddit.com/r/The_Donald/search.json?q=brick
APIs: exemplo
Indica o começo de uma query (busca)

https://www.reddit.com/r/The_Donald/search.json?q=brick

O endereço da API Uma busca, definida como


“chave=resposta”
APIs: exemplo
https://en.wikipedia.org/w/api.php

Pares de chave e resposta podem ser


concatenados usando um &
APIs: exemplo
https://en.wikipedia.org/w/api.php?

Pares de chave e resposta podem ser


concatenados usando um &
APIs: exemplo
https://en.wikipedia.org/w/api.php?action=query

Pares de chave e resposta podem ser


concatenados usando um &
APIs: exemplo
https://en.wikipedia.org/w/api.php?action=query&list=search

Pares de chave e resposta podem ser


concatenados usando um &
APIs: exemplo
https://en.wikipedia.org/w/api.php?action=query&list=search&
format=json

Pares de chave e resposta podem ser


concatenados usando um &
APIs: exemplo
https://en.wikipedia.org/w/api.php?action=query&list=search&
format=json&srsearch=trump

Pares de chave e resposta podem ser


concatenados usando um &
APIs: exemplo
● Como saber como cada API funciona?

○ Documentação! A maioria das APIs por aí têm algum


tipo de documentação online
● Exemplos:
○ https://www.reddit.com/dev/api/#GET_search
○ https://www.mediawiki.org/wiki/API:Search
Usando APIs com Python
● APIs e buscas podem ser feitas direto no navegador

● Mas elas se tornam algo muito mais poderoso


quando automatizadas

● Ou seja: o python precisa atuar como um navegador


Acessando a internet pelo python
JSON
● O resultado de uma busca costuma
vir no formato de um dicionário
com listas e outros dicionários
● Esse formato se chama JSON:
JavaScript Object Notation
● Para todos os efeitos de python,
são dicionários e listas. Só isso.
Usando APIs com Python
● Existem muitas APIs por aí, e muitas bibliotecas
que automatizam buscas com cada API

● Porém, software criado por terceiros


frequentemente fica desatualizado

● Por isso é útil saber criar as suas próprias buscas


Parte 2: autenticação
● Algumas APIs não precisam de login, senha, nem
nenhum tipo de autenticação. Exemplo: Wikipedia

● A maioria requer que você se registre, peça acesso,


crie login e senha (ex: Twitter, Reddit)

● Dito isso, APIs estão cada vez mais fechadas


Criando a sua conta na API do Reddit
https://www.reddit.com/prefs/apps/
Próximos passos:
● Acessando a API de visualizações da Wikipedia:
https://colab.research.google.com/drive/1bIOVx
hQ2F2UcnULGDjZgkeRJfSiPJQ6m?usp=sharing

● Acessando a API do Reddit:


https://colab.research.google.com/drive/1k85vr
Wniz0hhaF_MCt4prQnGz4C7rdS5?usp=sharing
Parte 3: Twitter APIs
1. REST API
Funciona como Reddit ou Wikipedia:
você faz a busca, ela retorna a informação.
É o equivalente a ir na ferramenta de busca.
Ela também pode retornar seguidores, bio, etc.

https://developer.twitter.com/en/docs/api-reference-index
Parte 3: Twitter APIs
2. Streaming API
Você abre uma conexão com uma busca específica,
e o Twitter te manda tweets até a conexão se fechar
(ou um erro ocorrer).
● Ótima para acompanhar uma conversa evoluindo
ao longo do tempo

https://developer.twitter.com/en/docs/api-reference-index
Parte 3: Twitter APIs
Todas as APIs do Twitter requerem autenticação OAuth:

1. Você cria uma conta de Desenvolvedor no Twitter

2. Isso te dá uma API key, que serve como nome de usuário

3. Também um Consumer Secret / API Secret, ou seja, a senha

4. Access Token e Access Token Secret: identificam e autentificam


o usuário fazendo a raspagem de dados

https://developer.twitter.com/en/docs/api-reference-index
Ética e termos de uso
● Essencialmente, para usar o Twitter, você promete não
republicar o dataset original

● Pesquisadores frequentemente publicam os tweet_ids,


em vez dos tweets propriamente ditos

● Isso deixa o controle nas mãos do usuário: a pessoa pode


apagar o tweet dela quando quiser

● Note: tweets são públicos, mas ainda são informação pessoa

https://developer.twitter.com/en/docs/api-reference-index
REST API
● Máximo de X buscas a cada Y minutos

● Gratuito, ou pacote pago, ou pacote acadêmico

● https://developer.twitter.com/en/pricing/search-30day

● GET search/tweets
parecido com a busca avançada: https://twitter.com/search-advanced

● GET statuses/user_timeline
tweets recentes de um usuário
REST API
● Máximo de X buscas a cada Y minutos

● Gratuito, ou pacote pago, ou pacote acadêmico

● https://developer.twitter.com/en/pricing/search-30day

● GET search/tweets
parecido com a busca avançada: https://twitter.com/search-advanced

● GET statuses/user_timeline
https://developer.twitter.com/en/docs/api-reference-index
https://developer.twitter.com/en/docs/tweets/search/api-reference/get-search-tweets
tweets recentes de um usuário
https://developer.twitter.com/en/docs/tweets/timelines/api-reference/get-statuses-user_timeline
Streaming API
● GET statuses/filter
○ Até 400 palavras-chave, 5,000 usuários, ou 25 lugares
○ ~1% do volume total de tweets
○ É uma boa amostra, mas não é uma amostra aleatória [1]

● GET statuses/sample
○ “Uma amostra aleatória de todos os status públicos”
○ Também em torno de 1%

[1] Morstatter, F. (2013). Is the Sample Good Enough? Comparing Data from Twitter's Streaming API
with Twitter's Firehose. ICWSM 2013.
Argumentos da busca: status/filter

follow (users):
−Tweets criados pelo usuário
−Tweets em que o usuário deu retweet
−Respostas e retweets de tweets do usuário

−NÃO: menções do usuário (@fulano)


Argumentos da busca: status/filter
track (keyword)
− Para acompanhar palavras-chave
− É um grande “OU” com todas as palavras-chave

● Exemplos:
− track=orange,apple,blackberry
se traduz para: orange OR apple OR blackberry
− track=orange apple, blackberry
Se traduz para: (orange AND apple) OR blackberry
Argumentos da busca: status/filter

locations
− Apenas para tweets geolocalizados
− Até 25 retângulos, nesta ordem:
longitude1,latitude1,longitude2,latitude2

longitude2,latitude2

longitude1,latitude1
O que vem em um tweet?
● Documentação:
−https://dev.twitter.com/overview/api/tweets

● Convém salvar o arquivo json em um formato mais legível:


import json
resultado = ... # Some json object
arquivo = open("output_legivel.json","w")
json.dump(result, fh, indent=4)
# O indent=4 torna o output mais fácil de ler
fh.close()
https://developer.twitter.com/en/docs/tweets/data-dictionary/overview/tweet-object
Output da Search API: sem indent=4
Output da Search API: com indent=4
Dica: programe de forma “defensiva”
tweet = json.loads(line)
print(tweet["place"]["country"])

O que acontece não tiver tweet ali?


Dica: programe de forma “defensiva”
tweet = json.loads(line)
print(tweet["place"]["country"])

O que acontece não tiver tweet ali?

tweet = json.loads(line)
if (tweet != None) and ("place" in tweet) and
("country" in tweet["place"]):
print(tweet["place"]["country"])

Resolvido.
Data e hora (datetime) de um tweet
Python tem uma biblioteca exatamente pra isso

- Tweets vêm com data e hora neste formato:


"created_at":"Tue Feb 03 10:13:55 +0000 2015"

- Com a biblioteca datetime você pode extrair essa informação


from datetime import datetime

if "created_at" in tweet:
created_at = tweet["created_at"].replace(" +0000 "," ")
created_at = datetime.strptime(created_at,"%a %b %d %H:%M:%S
%Y")

https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior
Próximo passo:
● Twitter
https://colab.research.google.com/drive/1sNOP4
BDKyh23erxnIoazs-SKBqC7xCUc?usp=sharing
E se não tiver API?
● Às vezes o jeito é ir logo no código fonte e pegar
os dados “na marra”, sem ser de mão beijada pela API

● Isso se chama raspagem de dados (data scraping)

● Em python:
○ A biblioteca requests faz a coleta dos dados
○ A biblioteca BeautifulSoup processa o HTML
E se não tiver API?

O que te interessa
pode estar por aqui
E se não tiver API?
● Em última instância, às vezes o jeito é fazer o
python controlar o seu navegador (ex: Firefox)

● Em python:
○ A biblioteca selenium faz exatamente isso
○ https://selenium-python.readthedocs.io/
○ https://pypi.org/project/selenium/

Você também pode gostar