ICE-B
9 - Internet
Ludwig Krippahl
1
Internet
Resumo■ Introdução às redes de computadores e à Internet■ Obtenção de dados da Internet usando Python■ Exemplo: contar prémios Nobel por país
2
Internet
Redes de computadores
3
Redes
Uma rede permite partilhar recuros e informação■ Infraestrutura de troca de
mensagens■ Liga computadores para
trocar informação epartilhar recursos
■ E.g. Pesquisa no Google:• Enviamos a pergunta• Usamos os servidores• Obtemos o resultado
Image: Mauro Bieg, public domain
4
Redes
Transferência entre dois computadores■ Emissor: produz e envia uma mensagem (sequência de bytes)■ Receptor: recebe a sequência de bytes■ Rede: infraestrutura que inclui:• Meios de ligação (cabos, fibra óptica, radio, satélite)• Computadores dedicados a encaminhar a mensagem
Rede de computadores ⇐ ⇒
5
Redes
Rede local (LAN, Local Area Network)■ Os computadores estão ligados directamente• cada um pode enviar bytes directamente a qualquer outro.
■ Distância entre computadores tipicamente menor que 1km.Rede de larga escala (WAN, Wide Area Network)■ Emissor e o destinatário estão em redes locais distintas■ É preciso encaminhar os bytes por equipamento especializado
(routers e gateways) que escolhem o caminho até ao destino final• Router gere ligação entre computadores numa rede ou redes do mesmo tipo
• Gateway é um router que interliga redes diferentes (converte protocolos)
6
Redes
Mensagens em pacotes■ Para chegar ao destinatário, a mensagem é enviada em pacotes
endereçados• Cada computador tem o seu endereço, normalmente da rede local
■ Os pacotes são encaminhados individualmente pela rede da origematé ao destino
• Pela rede de larga escala são reencaminhados entre routers e gateways
• O router final encaminha os pacotes para o computador destinatário
■ O destinatário depois reconstroi a mensagem a partir dos pacotes
7
Redes
Interligação de redes■ 2 LAN ligadas por 3 routers
8
Internet
Rede de redes locais com protocolos próprios■ Todos os computadores têm um endereço IP (Internet Protocol)■ Se dentro da LAN o router envia o pacote directamente■ Se estiver noutra LAN, terá de passar por vários routers• Tipicamente, a LAN tem apenas um endereço para o exterior
• O router tem de traduzir os endereços (NAT, Network Address Translation)
■ Os routers propagam o pacote até ao router da LAN do destinatário
9
Internet
Protocolos da Internet■ Nível físico• Sinais entre os nós da rede• Modulação e conversão: fibra óptica, telefone, cabo• Transmissão ao nível do bit (0 ou 1)• Exemplo: Wi-Fi, 2.4 GHz e 5.8 GHz
10
Internet
Protocolos da Internet■ Nível físico■ Nível de ligação• Transmissão de conjuntos de bits entre nós da rede• Correcção de erros, gestão de filas de espera, ...• Exemplo: IEEE 802.11, para wireless LAN
11
Internet
Protocolos da Internet■ Nível físico■ Nível de ligação■ Nível IP (Internet Protocol)• Gere os pacotes de bytes, endereçamento e reencaminhamento
• A informação é dividida em pacotes (sequências de bytes), encaminhadosindividualmente ao destino.
• Cada máquina tem um endereço e cada pacote tem o endereço do destinatário
• IPv4 (1983): 4 bytes (32 bits), normalmente repetido em redes locais porque sópermite 400 milhões de endereços únicos
• e.g. 127.0.0.1 é o próprio computador, 192.168.1.1 costuma ser o router
• IPv6: 16 bytes (128 bits), suficiente para atribuir endereços únicos3 × 1038
12
Internet
Protocolos da Internet■ Nível físico■ Nível de ligação■ Nível IP (Internet Protocol)■ Nível de transporte (TCP).• Transmission Control Protocol
• Gere o transporte de dados, encarregando-se da gestão de pacotes e detecção erecuperação de erros.
13
Internet
Protocolos da Internet■ Nível físico■ Nível de ligação■ Nível IP (Internet Protocol)■ Nível de transporte (TCP).■ Nível da aplicação• Protocolos destinados a gerir a comunicação entre aplicações ou com o utilizador.
• E.g HTTP, DNS, ...
14
Internet
Protocolos da Internet
15
Internet
Protocolos da Internet■ Normalmente não usamos os endereços IP■ Em vez disso, usamos endereços simbólicos associados:• e.g. www.google.com
■ O DNS (Domain Name System) é um sistema hierárquico deservidores que mapeia os endereços simbólicos em endereços IP
• Nomes genéricos de domínio: com biz edu info gov mil• Nomes de domínio de países: pt au us de fr• ...
16
Internet
Protocolos da Internet: DNS
Wikimedia, Public Domain
17
Internet
Protocolos da Internet: DNS■ Sistema hierárquico de servidores que mapeia os endereços
simbólicos em endereços IP
Wikimedia, Public Domain
18
Internet
Protocolos da Internet: DNS■ Em Março 2015 um memorando de entendimento entre ISP, IGAC
e SGC passou a permitir "bloquear" sites que os envolvidosconsiderem piratas.
■ Mas apenas configuram os servidores DNS para não resolver osnomes desses sites
■ Assim, o “bloqueio” pode ser facilmente contornado usando outroservidor DNS
• E.g. Google: 8.8.8.8, Open DNS: 208.67.222.222
■ A natureza distribuida da Internet e o uso de multiplos níveis deprotocolos torna-a muito robusta e versátil
• E.g. Por VPN podemos criar uma rede privada sobre a rede pública
19
Internet
Isto permitiu o enorme crescimento da Internet
■ Cerca de 50% das pessoas no mundo têm ligação à Internet(Internet World Stats)
20
Internet
CodyHofstetter CC-SA
21
Internet
World Wide Web
22
WWW
A WWW é uma rede montada sobre a Internet■ 1989: Tim Berners-Lee (CERN) escreve proposta para sistema
distribuído de hiper-texto• Ligar uma “web of notes with links” para ajudar os físicos do CERN a partilhar
informação em grandes projectos.
■ 1990: Cria um browser com interface gráfica.Componentes da World Wide Web:■ Web, "teia" de documentos interligados e sofware para os gerir.■ Potocolos de aplicação que gerem a partilha da informação.■ Página Web: documento, normalmente ligado a outros
documentos.■ Link: Ligação entre duas páginas Web.
23
WWW
A WWW é uma rede montada sobre a Internet■ Site web: Conjunto de páginas Web relacionadas.• Normalmente guardadas na mesma máquina, mas também podem estar
distribuídas na "cloud"
■ Servidor Web - servidor• Programa que responde a
pedidos de acesso às páginasWeb.
■ Browser Web - cliente• Ferramenta que pede páginas
Web e as mostra. David Vignoni, LGPL
24
WWW
A WWW é uma rede montada sobre a Internet■ Três elementos centrais da World Wide Web:• Uniform Resource Locator (URL)• HTML: linguagem das páginas Web• HTTP / HTTPS: Hypertext Transfer Protocol (Secure), sobre TCP/IP
■ URL: especifica a localização de um recurso.• Protocolo (pode ser omitido), nome da máquina, recurso (e.g. ficheiro)
25
WWW
Hypertext Markup Language (HTML)■ Linguagem usada para criar páginas Web.■ Tags: Especificam como o browser deve representar a página.
26
WWW
Hypertext Markup Language (HTML)■ Tags (marcas): Colocadas entre os símbolos < e >■ A marca final distingue-se da inicial pela </..>■ Elementos são definidos por uma marca inicial e final• e.g. <TITLE>Título</TITLE>
<h3> Hypertext Markup Language (HTML)</h3>
<ul><li>Tags (marcas): Colocadas entre os símbolos < e ></li>
<li>A marca final distingue-se da inicial pela </..></li>
<li>Elementos são definidos por uma marca inicial e final</li>
<ul><li>e.g. <code><TITLE>Título</TITLE></code></li>
</ul></ul>
27
WWW
Hypertext Transfer Protocol (HTTP)
28
WWW
Hypertext Transfer Protocol, status codes■ 200 OK■ 403 Forbidden■ 404 Not Found■ 451 Unavailable For Legal Reasons• Referência a Fahrenheit 451, Ray Bradbury
■ 500 Internal Server Error■ 503 Service Unavailable■ Ver mais em:
https://en.wikipedia.org/wiki/List_of_HTTP_status_codes
29
Internet
Para que serve isto?
30
Dados remotos
■ Exemplo: Quantos prémios Nobel da Química por país?
https://en.wikipedia.org/wiki/List_of_Nobel_laureates_in_Chemistry
31
Dados remotos
■ Exemplo: Quantos prémios Nobel da Química por país?
... <table class="wikitable sortable"> <tr> <th>Year</th> <th colspan="2">Laureate</th> <th>Country</th> <th>Rationale</th> </tr> <tr> <td>1901</td> <td><a href="/wiki/File:Vant_Hoff.jpg" class="image">... <td><a href="/wiki/Jacobus_Henricus_van_%27t_Hoff" ... <td><span class="flagicon"><img alt="" src="...""> </span> <a href="/wiki/Netherlands" title="Netherlands">Netherlands</a></td> <td>[for his] discovery of the laws of <a href="/wiki/Chemical_dynamics"... </tr> <tr> <td>1902</td> ... </table>
32
Dados remotos
■ Exemplo: Quantos prémios Nobel da Química por país?■ Células entre <td> e </td>■ A que começa por <span class="flagicon" é a do país■ O país está a seguir ao quarto > dentro da célula
... <table class="wikitable sortable"> ... <td>1901</td> <td><a href="/wiki/File:Vant_Hoff.jpg" class="image">... <td><a href="/wiki/Jacobus_Henricus_van_%27t_Hoff" ... <td><span class="flagicon"><img alt="" src="...""> </span> <a href="/wiki/Netherlands" title="Netherlands">Netherlands</a></td> <td>[for his] discovery of the laws of <a href="/wiki/Chemical_dynamics"... ... </table>
33
Dados remotos
Plano do programa:■ Obter o código fonte da página HTML da Wikipedia■ Extraír todos os países de todos os laureados■ Obter daí lista, alfabética, dos países com premiados■ Contar para cada país quantos laureados teve■ Imprimir tudo
34
Dados remotos
Em Python é fácil usar HTTP■ O módulo requests tem uma interface HTTP/HTTPS■ Podemos obter facilmente o código fonte da página:
In : import requests In : r = requests.get('https://...Nobel_laureates_in_Chemistry') In : r.text Out: '<!DOCTYPE html>\n<html class="client-nojs" lang="en" dir="ltr">\n<head>\n<meta charset="UTF-8"/>\n<title> List of Nobel laureates in Chemistry - Wikipedia</title>\n <script>document.documentElement.className = ...''
■ Este objecto do tipo Response tem outros atributos úteis:
In : r.ok Out: True In : r.status_code Out: 200
35
Dados remotos
■ Extraír países da tabela• Células entre <td> e </td>• A que começa por <span class="flagicon" é a do país• O país está a seguir ao quarto > dentro da célula
def all_countries(html): """Return list of all countries in Wikipedia Nobel html table""" cells = html.split('<td>') countries = [] for cell in cells: if cell.startswith('<span class="flagicon"'): countries.append(cell.split('>')[4].split('<')[0]) return countries
<td><a href="/wiki/File:Vant_Hoff.jpg" class="image">... <td><a href="/wiki/Jacobus_Henricus_van_%27t_Hoff" ... <td><span class="flagicon"><img alt="" src="...""> </span> <a href="/wiki/Netherlands" title="Netherlands">Netherlands</a></td> <td>[for his] discovery of the laws of <a href="/wiki/Chemical_dynamics"...
36
Dados remotos
■ Testamos o código, confirmando que temos todos os países
def all_countries(html): """Return list of all countries in Wikipedia Nobel html table""" table = html.split('<table class="wikitable sortable">')[1] table.split('</table>')[0] cells = table.split('<td>') countries = [] for cell in cells: if cell.startswith('<span class="flagicon"'): countries.append(cell.split('>')[4].split('<')[0]) return countries
In : r = requests.get('https://...Nobel_laureates_in_Chemistry') In : countries = all_countries(r.text) Out: ['Netherlands', 'Germany', 'Sweden', 'United Kingdom', 'Germany', 'France' 'Germany', 'United Kingdom', 'Germany', 'Germany', 'Poland', 'France', 'France', 'Switzerland', 'United States', 'Germany', 'Germany', 'Germany' 'United Kingdom', 'United Kingdom', 'Austria', 'Germany', 'Sweden', 'Germany', 'Germany', 'United Kingdom', 'Sweden', 'Germany', 'Germany', 'Germany', 'United States', 'United States', 'France', 'France', ...]
37
Dados remotos
■ Países diferentes, por ordem alfabética• Basta usar o sort da lista, que ordena a lista
def unique_countries(countries): """Return unique countries in list, sorted alphabetically""" unique = [] for c in countries: if c not in unique: unique.append(c) unique.sort() return unique
In : names = unique_countries(countries) Out: ['Argentina', 'Australia', 'Austria', 'Belgium', 'Canada', 'Croatia', 'Czechoslovakia', 'Denmark', 'Finland', 'France', 'Germany', 'Israel', 'Italy', 'Japan', 'Mexico', 'Netherlands', 'Norway', 'Poland', 'Soviet Union', 'Sweden', 'Switzerland', 'United Kingdom', 'United States', 'West Germany', 'Yugoslavia']
38
Dados remotos
■ Contar quantas vezes ocorre cada país• Começamos com uma lista a zeros, vamos somando no sítio certo
def count_per_category(values, categories): """Return number of occurrences of each category in values""" counts = [] for _ in categories: counts.append(0) for v in values: ix = categories.index(v) counts[ix] = counts[ix]+1 return counts
In : counts = count_per_category(countries,names) Out: [1, 1, 1, 1, 4, 1, 1, 1, 1, 8, 21, 4, 1, 7, 1, 4, 1, 1, 1, 5, 5, 26, 69, 10, 1]
39
Dados remotos
■ Laureados por país, juntar tudo
def laurates_per_country(url): """Returns string with laureates per country from wiki page""" r = requests.get(url) if not r.ok: return 'Error getting data' countries = all_countries(r.text) names = unique_countries(countries) counts = count_per_category(countries,names) table = '' for ix in range(len(names)): table = table + names[ix] +'\t'+str(counts[ix])+'\n' return table
In : chemistry = laurates_per_country('https://...Nobel_laureates_in_Chemistry'In : print(chemistry) Argentina 1 Australia 1 ... United States 69 West Germany 10 Yugoslavia 1
40
Dados remotos
■ Como estas páginas têm o mesmo formato, funciona com outras:
In : physics = laurates_per_country('https://...Nobel_laureates_in_Physics') In : print(physics) Australia 2 Austria 3 Austria-Hungary 1 Belgium 1 Canada 4 ... Netherlands 9 Pakistan 1 Poland 1 Republic of China 3 Russia 5 Soviet Union 7 Sweden 4 Switzerland 4 United Kingdom 22 United States 78 West Germany 9
41
Dados remotos
■ Como estas páginas têm o mesmo formato, funciona com outras:
In : medicine = laurates_per_country('https://...Nobel_laureates_in_Medicine') In : print(medicine) Argentina 2 Australia 6 Austria 4 Austria-Hungary 1 ... Norway 2 Portugal 1 Romania 1 Russia 2 South Africa 3 Spain 1 Sweden 7 Switzerland 7 United Kingdom 26 United States 90 Venezuela 1 West Germany 4
42
Internet
Resumo
43
Internet
Resumo■ Internet: rede de redes de computadores• Diferentes níveis de protocolos "empilhados" permitem abstraír dos detalhes
■ World Wide Web: rede de documentos• Construída sobre a Internet (URL, HTTP, HTML)
■ Acesso a recursos na WWW, tipicamente em HTML• Módulo requests• Processar html (processar strigs)
Leitura adicional:■ Recomendada: Capítulo 9 dos apontamentos■ Opcional: documentação do módulo requests• http://docs.python-requests.org/en/master/