Are you over 18 and want to see adult content?
More Annotations
A complete backup of nbmmachinery.com
Are you over 18 and want to see adult content?
A complete backup of saladaeletrica.com.br
Are you over 18 and want to see adult content?
A complete backup of korenizivota.com
Are you over 18 and want to see adult content?
A complete backup of globalkariyer.com.tr
Are you over 18 and want to see adult content?
Favourite Annotations
Gallay Medical & Scientific Equipment Suppliers Australia
Are you over 18 and want to see adult content?
Create Your Own Free Website in Minutes | Websitebuilder
Are you over 18 and want to see adult content?
Welcome to Tower Federal Credit Union - Tower Federal Credit Union
Are you over 18 and want to see adult content?
A complete backup of scotcourts.gov.uk
Are you over 18 and want to see adult content?
Object reference not set to an instance of an object.
Are you over 18 and want to see adult content?
CD and DVD Burning Software - Alcohol Soft copy and virtual drive software Alcohol 120 and 52% Free Edition
Are you over 18 and want to see adult content?
UltraSeps T-Shirt Color Separation Software - UltraSeps Color Separation Software
Are you over 18 and want to see adult content?
Frugal Nutrition | Simple, Delicious, Nutritious, and Frugal Recipes for Everyday Cooks!
Are you over 18 and want to see adult content?
Text
sliding window
REQUESTS | PYTHON HELPTRANSLATE THIS PAGE Para fazer as requisições HTTP ao serviço, vamos utilizar a biblioteca requests (instalável via pip install requests) e para manipular o JSON retornado pelo serviço, vamos usar a biblioteca json (inclusa na biblioteca padrão). Primeiramente, vamos importar as bibliotecas necessárias: 1. A FUNÇÃO ENUMERATE() Para contornar esse problema, existe a função enumerate (). Essa função pode receber como entrada uma lista e irá retornar um objeto do tipo enumerate, que poderá ser percorrido pelo for. Vejamos um exemplo simples: l = for i, word in enumerate (l): print i, word. Isso irá gerar a seguinte saída: FILAS E PILHAS EM PYTHON OBTENDO A DATA E A HORA ATUAIS EM PYTHON Para obtermos os valores de data e hora atuais, podemos utilizar o módulo datetime, que fornece formas bem simples para fazermos isso. Basta utilizar o método now() existente na classe: from datetime import datetime now = datetime.now() print now.year print now.month print now.day print now.hour print now.minute print now.second Corrigido, de acordo com o comentário WEB SCRAPING EM PÁGINAS BASEADAS EM JAVASCRIPT …TRANSLATE THIS PAGE Web scraping em páginas baseadas em JavaScript com Scrapy. O Scrapy é um framework todo prontinho pra lidar com a maioria dos problemas que enfrentamos ao fazer web scraping. Porém, é um tanto comum termos que extrair dados de páginas cuja parte do conteúdo seja gerada por código JavaScript, que é tipicamente executado no nossonavegador.
FILTER() – FILTRANDO ELEMENTOS DE UMA LISTA Imagine uma situação na qual você tenha uma lista composta por uma grande quantidade de números, e deseja utilizar esses números para a realização de um cálculo. Porém, alguns desses valores devem ser descartados, por não se enquadrarem na faixa de valores que você pode utilizar nos cálculos. Como retirar os elementos que nãocumprem
COLORINDO GRAFOS
STRUCT | PYTHON HELPTRANSLATE THIS PAGE pack ('i5s', 42, 'hello') O primeiro argumento passado para a função pack deve ser o formato que irá definir como será a estrutura C que irá armazenar os dados dos nossos objetos Python. No exemplo acima, informamos através da string 'i5s' que a estrutura possui 2 campos: um int (representato por i ); QUEUE | PYTHON HELPTRANSLATE THIS PAGESEE MORE ON PYTHONHELP.WORDPRESS.COM SLICE | PYTHON HELPTRANSLATE THIS PAGE Esse método permite você percorrer uma sequência de tantos em tantos elementos por vez. Por exemplo, se você tem uma lista você pode usar o each_cons para percorrer de 2 em 2 elementos: ou de 3 em 3 elementos de cada vez: Ele ajuda a criar operações que envolvem uma espécie de “janela deslizante” (sliding window
REQUESTS | PYTHON HELPTRANSLATE THIS PAGE Para fazer as requisições HTTP ao serviço, vamos utilizar a biblioteca requests (instalável via pip install requests) e para manipular o JSON retornado pelo serviço, vamos usar a biblioteca json (inclusa na biblioteca padrão). Primeiramente, vamos importar as bibliotecas necessárias: 1. A FUNÇÃO ENUMERATE() Para contornar esse problema, existe a função enumerate (). Essa função pode receber como entrada uma lista e irá retornar um objeto do tipo enumerate, que poderá ser percorrido pelo for. Vejamos um exemplo simples: l = for i, word in enumerate (l): print i, word. Isso irá gerar a seguinte saída: FILAS E PILHAS EM PYTHON OBTENDO A DATA E A HORA ATUAIS EM PYTHON Para obtermos os valores de data e hora atuais, podemos utilizar o módulo datetime, que fornece formas bem simples para fazermos isso. Basta utilizar o método now() existente na classe: from datetime import datetime now = datetime.now() print now.year print now.month print now.day print now.hour print now.minute print now.second Corrigido, de acordo com o comentário WEB SCRAPING EM PÁGINAS BASEADAS EM JAVASCRIPT …TRANSLATE THIS PAGE Web scraping em páginas baseadas em JavaScript com Scrapy. O Scrapy é um framework todo prontinho pra lidar com a maioria dos problemas que enfrentamos ao fazer web scraping. Porém, é um tanto comum termos que extrair dados de páginas cuja parte do conteúdo seja gerada por código JavaScript, que é tipicamente executado no nossonavegador.
FILTER() – FILTRANDO ELEMENTOS DE UMA LISTA Imagine uma situação na qual você tenha uma lista composta por uma grande quantidade de números, e deseja utilizar esses números para a realização de um cálculo. Porém, alguns desses valores devem ser descartados, por não se enquadrarem na faixa de valores que você pode utilizar nos cálculos. Como retirar os elementos que nãocumprem
COLORINDO GRAFOS
SLICE | PYTHON HELPTRANSLATE THIS PAGE Esse método permite você percorrer uma sequência de tantos em tantos elementos por vez. Por exemplo, se você tem uma lista você pode usar o each_cons para percorrer de 2 em 2 elementos: ou de 3 em 3 elementos de cada vez: Ele ajuda a criar operações que envolvem uma espécie de “janela deslizante” (sliding window
HTML | PYTHON HELPTRANSLATE THIS PAGE Templates, em um projeto Web com Python + Google App Engine, nada mais são do que arquivos HTML acrescidos de algumas marcações específicas para representar dados dinâmicos. Observe que em meio ao HTML, temos 4 campos diferentes: { { nome }}, { { url }}, { { email }} e { { mensagem }}. Em um template, sempre que houver uma string dotipo
DOCSTRINGS | PYTHON HELPTRANSLATE THIS PAGE Docstrings são strings que inserimos dentro de nosso código Python com o intuito de fornecer uma explicação sobre o funcionamento deste. Essa string deve ser colocada como a primeira linha da definição de uma classe, método ou função. O texto representado por tal string será apresentado quando for executado o comando help() utilizando como entrada ORDENAÇÃO DE UMA LISTA É comum termos uma lista toda bagunçada e querermos ordenar os elementos contidos nela. Para ordenar uma lista de valores, basta chamar o método sort da lista. Vamos ver como isso funciona na prática. Primeiramente, vamos criar uma lista com 10 elementos e depois bagunçá-la usando a função shuffle, do módulo random. Tudo que precisamos fazer para FILTER() – FILTRANDO ELEMENTOS DE UMA LISTA Imagine uma situação na qual você tenha uma lista composta por uma grande quantidade de números, e deseja utilizar esses números para a realização de um cálculo. Porém, alguns desses valores devem ser descartados, por não se enquadrarem na faixa de valores que você pode utilizar nos cálculos. Como retirar os elementos que nãocumprem
CONJUNTOS EM PYTHON
Sets (ou, como iremos chamar daqui para a frente, conjuntos) são estruturas disponíveis como builtins do Python, utilizadas para representar coleções desordenadas de elementos únicos. É importante sempre lembrar dos conjuntos por suas duas principais características: Os elementos não são armazenados em uma ordem específica e confiável; WEB SCRAPING COM SCRAPY Imagine que você queira extrair conteúdo da Web que não esteja em apenas uma página só: você precisa de uma maneira de "navegar" no site para as páginas que realmente contém as informações úteis. Por exemplo, você pode estar interessado nas notícias destaques do dia no Portal Brasil.gov.br, mas somente aquelas das seções "Infraestrutura" e "CiênciaCOLORINDO GRAFOS
Imagine que você tenha um mapa com algumas áreas delimitadas (países, estados, etc), e deseja colorir cada área com uma cor diferente das áreas vizinhas. Para um mapa pequeno (digamos, com no máximo 7 áreas), você pode simplesmente atribuir uma cor para cada área e se dar por satisfeito. Mas para um mapa com muitas UM CONTADOR DE ELEMENTOS EM SEQUÊNCIAS Às vezes precisamos realizar a contagem do número de aparições de determinados elementos em uma sequência, como uma string ou uma lista. Por exemplo, quero saber quantas vezes cada letra apareceu em uma string. Como fazer isso em Python? Primeiro, vamos fazer "na mão" e depois vamos conhecer uma solução "pronta". A solução acimaapresentada
ACESSANDO RECURSOS NA WEB COM PYTHON Acessando recursos na web com Python. Uma das coisas mais divertidas de se fazer com um computador é programá-lo para que busque informações na web para que não precisemos ficar clicando em um monte de páginas até chegar à informação que desejamos. Poderíamos escrever um programa para buscar e mostrar os próximoshorários de
STRUCT | PYTHON HELPTRANSLATE THIS PAGE pack ('i5s', 42, 'hello') O primeiro argumento passado para a função pack deve ser o formato que irá definir como será a estrutura C que irá armazenar os dados dos nossos objetos Python. No exemplo acima, informamos através da string 'i5s' que a estrutura possui 2 campos: um int (representato por i ); A FUNÇÃO ENUMERATE() Para contornar esse problema, existe a função enumerate (). Essa função pode receber como entrada uma lista e irá retornar um objeto do tipo enumerate, que poderá ser percorrido pelo for. Vejamos um exemplo simples: l = for i, word in enumerate (l): print i, word. Isso irá gerar a seguinte saída: MAP(), REDUCE(), FILTER() E LAMBDACONJUNTOS EM PYTHON
Sets (ou, como iremos chamar daqui para a frente, conjuntos) são estruturas disponíveis como builtins do Python, utilizadas para representar coleções desordenadas de elementos únicos. É importante sempre lembrar dos conjuntos por suas duas principais características: Os elementos não são armazenados em uma ordem específica e confiável; FILTER() – FILTRANDO ELEMENTOS DE UMA LISTA Imagine uma situação na qual você tenha uma lista composta por uma grande quantidade de números, e deseja utilizar esses números para a realização de um cálculo. Porém, alguns desses valores devem ser descartados, por não se enquadrarem na faixa de valores que você pode utilizar nos cálculos. Como retirar os elementos que nãocumprem
ORDENAÇÃO DE UMA LISTA É comum termos uma lista toda bagunçada e querermos ordenar os elementos contidos nela. Para ordenar uma lista de valores, basta chamar o método sort da lista. Vamos ver como isso funciona na prática. Primeiramente, vamos criar uma lista com 10 elementos e depois bagunçá-la usando a função shuffle, do módulo random. Tudo que precisamos fazer para ACESSANDO O ÚLTIMO ELEMENTO DE UMA LISTA E para acessar o último elemento de uma lista qualquer? >>> L 21. O código acima é uma das formas de acessar o último elemento de uma lista, mas não é a forma mais conveniente. Python nos oferece uma forma muito melhor para fazer isso: >>> L 21. Também podemos acessar o penúltimo elemento através do índice -2,e assim
FILAS E PILHAS EM PYTHON OBTENDO A DATA E A HORA ATUAIS EM PYTHON Para obtermos os valores de data e hora atuais, podemos utilizar o módulo datetime, que fornece formas bem simples para fazermos isso. Basta utilizar o método now() existente na classe: from datetime import datetime now = datetime.now() print now.year print now.month print now.day print now.hour print now.minute print now.second Corrigido, de acordo com o comentário WEB SCRAPING EM PÁGINAS BASEADAS EM JAVASCRIPT …TRANSLATE THIS PAGE Web scraping em páginas baseadas em JavaScript com Scrapy. O Scrapy é um framework todo prontinho pra lidar com a maioria dos problemas que enfrentamos ao fazer web scraping. Porém, é um tanto comum termos que extrair dados de páginas cuja parte do conteúdo seja gerada por código JavaScript, que é tipicamente executado no nossonavegador.
STRUCT | PYTHON HELPTRANSLATE THIS PAGE pack ('i5s', 42, 'hello') O primeiro argumento passado para a função pack deve ser o formato que irá definir como será a estrutura C que irá armazenar os dados dos nossos objetos Python. No exemplo acima, informamos através da string 'i5s' que a estrutura possui 2 campos: um int (representato por i ); A FUNÇÃO ENUMERATE() Para contornar esse problema, existe a função enumerate (). Essa função pode receber como entrada uma lista e irá retornar um objeto do tipo enumerate, que poderá ser percorrido pelo for. Vejamos um exemplo simples: l = for i, word in enumerate (l): print i, word. Isso irá gerar a seguinte saída: MAP(), REDUCE(), FILTER() E LAMBDACONJUNTOS EM PYTHON
Sets (ou, como iremos chamar daqui para a frente, conjuntos) são estruturas disponíveis como builtins do Python, utilizadas para representar coleções desordenadas de elementos únicos. É importante sempre lembrar dos conjuntos por suas duas principais características: Os elementos não são armazenados em uma ordem específica e confiável; FILTER() – FILTRANDO ELEMENTOS DE UMA LISTA Imagine uma situação na qual você tenha uma lista composta por uma grande quantidade de números, e deseja utilizar esses números para a realização de um cálculo. Porém, alguns desses valores devem ser descartados, por não se enquadrarem na faixa de valores que você pode utilizar nos cálculos. Como retirar os elementos que nãocumprem
ORDENAÇÃO DE UMA LISTA É comum termos uma lista toda bagunçada e querermos ordenar os elementos contidos nela. Para ordenar uma lista de valores, basta chamar o método sort da lista. Vamos ver como isso funciona na prática. Primeiramente, vamos criar uma lista com 10 elementos e depois bagunçá-la usando a função shuffle, do módulo random. Tudo que precisamos fazer para ACESSANDO O ÚLTIMO ELEMENTO DE UMA LISTA E para acessar o último elemento de uma lista qualquer? >>> L 21. O código acima é uma das formas de acessar o último elemento de uma lista, mas não é a forma mais conveniente. Python nos oferece uma forma muito melhor para fazer isso: >>> L 21. Também podemos acessar o penúltimo elemento através do índice -2,e assim
FILAS E PILHAS EM PYTHON OBTENDO A DATA E A HORA ATUAIS EM PYTHON Para obtermos os valores de data e hora atuais, podemos utilizar o módulo datetime, que fornece formas bem simples para fazermos isso. Basta utilizar o método now() existente na classe: from datetime import datetime now = datetime.now() print now.year print now.month print now.day print now.hour print now.minute print now.second Corrigido, de acordo com o comentário WEB SCRAPING EM PÁGINAS BASEADAS EM JAVASCRIPT …TRANSLATE THIS PAGE Web scraping em páginas baseadas em JavaScript com Scrapy. O Scrapy é um framework todo prontinho pra lidar com a maioria dos problemas que enfrentamos ao fazer web scraping. Porém, é um tanto comum termos que extrair dados de páginas cuja parte do conteúdo seja gerada por código JavaScript, que é tipicamente executado no nossonavegador.
QUEUE | PYTHON HELPTRANSLATE THIS PAGE Para usar na prática, existem soluções prontas e muito mais recomendadas, como por exemplo o módulo python queue, que pode ser usado tanto para implementação de Filas quanto para a implementação de Pilhas. SLICE | PYTHON HELPTRANSLATE THIS PAGE Esse método permite você percorrer uma sequência de tantos em tantos elementos por vez. Por exemplo, se você tem uma lista você pode usar o each_cons para percorrer de 2 em 2 elementos: ou de 3 em 3 elementos de cada vez: Ele ajuda a criar operações que envolvem uma espécie de “janela deslizante” (sliding window
HTML | PYTHON HELPTRANSLATE THIS PAGE Templates, em um projeto Web com Python + Google App Engine, nada mais são do que arquivos HTML acrescidos de algumas marcações específicas para representar dados dinâmicos. Observe que em meio ao HTML, temos 4 campos diferentes: { { nome }}, { { url }}, { { email }} e { { mensagem }}. Em um template, sempre que houver uma string dotipo
ORDENAÇÃO DE UMA LISTA É comum termos uma lista toda bagunçada e querermos ordenar os elementos contidos nela. Para ordenar uma lista de valores, basta chamar o método sort da lista. Vamos ver como isso funciona na prática. Primeiramente, vamos criar uma lista com 10 elementos e depois bagunçá-la usando a função shuffle, do módulo random. Tudo que precisamos fazer para DIVISÃO | PYTHON HELPTRANSLATE THIS PAGE Em Python, a divisão inteira arredonda o resultado para baixo, ou seja, sempre para o menor número inteiro mais próximo. Por exemplo: 3 / 2 seria 1.5, mas o resultado é arredondado para 1 (e não 2 ), pois 1 < 2. Já no caso de -3 / 2, o resultado seria -1.5, mas por se tratar de uma divisão inteira, ele é arredondado para -2 e não para PROGRAME DEFENSIVAMENTE COM ASSERÇÕES O trânsito é um dos ambientes em que o ser humano reconhece que precisa de ajuda pra que funcione direito pra todo mundo. Digo aqui "reconhece" querendo dizer na verdade o contrário: todo mundo acha que é o único bom motorista no mundo, que os outros é que estão querendo ferrá-lo furando sinal fechado, correndo ACESSANDO O ÚLTIMO ELEMENTO DE UMA LISTA E para acessar o último elemento de uma lista qualquer? >>> L 21. O código acima é uma das formas de acessar o último elemento de uma lista, mas não é a forma mais conveniente. Python nos oferece uma forma muito melhor para fazer isso: >>> L 21. Também podemos acessar o penúltimo elemento através do índice -2,e assim
ACESSANDO APIS REST COM PYTHON Um serviço web (web service) é um mecanismo utilizado para comunicação entre dois ou mais programas através da infraestrutura da internet. Apesar do que o nome pode sugerir, um serviço web não oferece funcionalidades diretamente para o usuário final, mas sim para outros programas que precisam de sua ajuda para realizar algumatarefa, seja para
FILAS E PILHAS EM PYTHON Filas e Pilhas em Python. Você pode não perceber, mas boa parte dos programas que você usa no dia-a-dia utilizam internamente os tipos abstratos de dados chamados filas e pilhas. Eles são chamados dessa forma porque representam uma estrutura de dados com operações associadas que definem um certo comportamento. TRATAMENTO DE EXCEÇÕES 5. try: except Exception: O código localizado entre o try: e o except é executado de forma que se algo de errado acontecer ali, o except Exception vai imediatamente chamar o código localizado abaixo de si para realizar o tratamento da exceção. Ou seja, se algo de errado acontecer na linha 2, as linhas 4-5 serão executadas para tratar essePYTHON HELP
MENU
Pular para o conteúdo* Inicial
* Por que Python?
* IDEs Python
* Sobre
Padrão
Publicado por
Valdir Stumm Jr
Postado no
25 de fevereiro de 2018Publicado em
dicas rápidas
, estruturas
comentários
3 Comentários
PRESERVANDO A ORDEM DE SEQUÊNCIAS AO REMOVER DUPLICATAS Imagine que você tenha uma lista com as URLs extraídas de uma página web e queira eliminar as duplicatas da mesma. Transformar a lista em um conjunto (_set_) talvez seja a forma mais comum de se fazer isso. Tipo assim:1
2
3
4
5
6
7
8
9
10
>>> urls =
>>> set(urls)
{'http://api.example.com/a', 'http://api.example.com/b', 'http://api.example.com/c'} Porém, observe que perdemos a ordem original dos elementos. Esse é um efeito colateral indesejado da eliminação de duplicatas através da transformação em um conjunto. Um jeito de preservar a ordem dos elementos após a remoção das duplicatas é utilizar este macete com collections.OrderedDict:
1
2
3
4
5
>>> from colllections import OrderedDict >>> OrderedDict.fromkeys(urls).keys() Legal né? Agora vamos entender o que o código acima fez. Antes de mais nada, é preciso saber que OrderedDict é uma estrutura de dados muito similar a um dicionário. A grande diferença é que o OrderedDict guarda internamente a ordem de inserção dos elementos. Assim, quando iteramos sobre um objeto desse tipo, ele irá retornar seus elementos na ordem em que foram inseridos. Agora vamos quebrar as operações em partes para entender melhor oque aconteceu:
1
>>> odict = OrderedDict.fromkeys(urls) O método fromkeys() cria um dicionário usando como chaves os valores passados como primeiro parâmetro e como valor o que for passado como segundo parâmetro (ou None, caso não passemos nada). Como resultado, temos:1
2
3
4
>>> odict
OrderedDict()
Agora que temos um dicionário com as chaves mantidas em ordem de inserção, podemos chamar o método keys() para obter somente as chaves que, neste caso, são as nossas URLs:1
2
3
4
>>> odict.keys()
OBS.: em Python 3, o método keys() retorna uma view ao invés de uma lista. Esse tipo de objeto suporta iteração e teste de pertinência, assim como a lista. Caso você realmente precise de uma lista, basta construir uma usando o resultado de keys():1
>>> list(odict.keys()) Powered by wordads.co Thank you for submitting the report! Seen ad many times Not relevant Offensive Covers content Broken Report this ad A eliminação de duplicatas é só uma consequência do design de dicionários, já que a unicidade das chaves é uma das propriedades fundamentais dessa estrutura de dados. Caso queira entender melhor os princípios por trás de um dicionário, leia sobre tabelas hash: https://www.ime.usp.br/~pf/estruturas-de-dados/aulas/st-hash.htmlAnúncios
Powered by wordads.co Thank you for submitting the report!Seen ad many times
Not relevant
Offensive
Covers content
Broken
Denunciar este anúncioAnúncios
Powered by wordads.co Thank you for submitting the report!Seen ad many times
Not relevant
Offensive
Covers content
Broken
Denunciar este anúncioCOMPARTILHAR:
* Clique para compartilhar no Twitter(abre em nova janela) * Clique para compartilhar no Telegram(abre em nova janela) * Clique para compartilhar no Pocket(abre em nova janela) * Clique para enviar por e-mail a um amigo(abre em nova janela) * Clique para imprimir(abre em nova janela)*
Padrão
Publicado por
Valdir Stumm Jr
Postado no
30 de outubro de 2017Publicado em
scrapy , web
scraping
comentários
2 Comentários
COMO AUTENTICAR UM SPIDER SCRAPY EM UM WEBSITE OBS.: ainda não conhece o Scrapy? Então leia este tutorial.
Vez por outra os sistemas que a gente usa não entregam as informações da forma que desejamos. Seja o sistema do seu cartão de crédito que não lhe dá uma visualização legal dos seus gastos, ou até mesmo seu _app_ de táxi que não lhe deixa fazer uma análise mais aprofundada dos trajetos que você tem feito. Ah se todos eles tivessem um botãozinho “exportar tudo em JSON”! A realidade é dura e a maioria dos _apps_ não nos dão essa opção. Uma alternativa nesses casos é _RASPAR_ os dados que desejamos do site do tal _app_, e isso envolve fazer seu _web spider_ se autenticar no sistema. Nesse post, vamos ver como fazer para que um spider Scrapy faça login em um sistema qualquer. COMO FUNCIONA A AUTENTICAÇÃO EM UM WEBSITE? Existem várias maneiras diferentes, mas em linhas gerais a autenticação em websites funciona assim: * O usuário acessa URL que contém formulário de login. Exemplo: http://quotes.toscrape.com/login * O usuário preenche campos do formulário com suas credenciais e clica no botão de login * O navegador envia os dados preenchidos para o servidor, no corpo de uma requisição HTTP do tipo POST * O servidor valida as credenciais do usuário e envia de volta uma resposta contendo uma página indicando que o usuário se autenticou com sucesso e, juntamente com ela, um COOKIEDE SESSÃO.
O COOKIE DE SESSÃO é uma informação que o browser irá armazenar localmente e irá enviar juntamente com as requisições subsequentes ao mesmo website, de forma que o último possa identificar quem é o usuário fazendo tais requisições. Assim sendo, nosso spider deverá reproduzir os passos recém descritos para que consiga se autenticar em um website. Então vamos aele!
NOSSO SPIDER
Vamos construir um spider que se autentique em http://quotes.toscrape.com e de lá extraia o link para a página no Goodreads de cada autor, informação que só é visível para usuários autenticados. Dê uma olhada no esqueleto do nosso spider:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# -*- coding:utf-8 -*-import scrapy
class LoginSpider(scrapy.Spider): name = 'login-spider'start_urls =
def parse(self, response): # depois a gente vai implementar aqui o preenchimentodo formulário
# contido em response e fazer a requisição de login self.log('visitei a página de login: {}'.format(response.url)) def parse_author_links(self, response): # aqui a gente vai extrair os links para as páginasdos autores
# ou seja, quando chegar aqui, o spider já estaráautenticado
pass
Quando rodarmos nosso spider, o Scrapy vai chamar automaticamente o método parse() assim que a resposta para a URL http://quotes.toscrape.com/login tiver sido baixada e a mensagem de log será impressa. Vá em frente e rode o spider acima só pra verisso acontecendo:
$ scrapy runspider loginspider.py MANIPULANDO O FORMULÁRIO O formulário de login do nosso site está representado assim:1
2
3
4
5
6
7
8
Powered by wordads.co Thank you for submitting the report! Seen ad many times Not relevant Offensive Covers content Broken Report this ad Perceba que temos 4 inputs nesse formulário: username, password, o botão de login em si e um campo oculto chamado CSRF_TOKEN. Não vou entrar em detalhes sobre proteção CSRF,
mas o que você precisa saber é que a maioria dos sites por aí vai ter um campo desses no formulário de login deles e que você precisa enviar tal campo juntamente com a requisição de autenticação. Caso contrário, o servidor não irá validar sua requisição. No Scrapy, requisições do tipo POST podem ser feitas com um tipo especial de Request chamado FormRequest. Nossa
requisição de autenticação será:1
2
3
4
5
6
7
8
9
req = scrapy.FormRequest( url='http://quotes.toscrape.com/login',formdata={
'username': 'john.doe', 'password': 'anything', 'csrf_token': token,},
callback=self.parse_author_links,}
Alguns detalhes importantes: * O valor do campo csrf_token é gerado dinamicamente para cada requisição à página de login. Assim, teremos que extrair ele da página de login antes de fazer a requisição. * A URL passada ao objeto FormRequest deve ser aquela encontrada no atributo action do formulário de login. * As chaves do dicionário passado ao parâmetro formdata devem usar como nome o valor do atributo name do input correspondente noformulário.
Agora que a gente já sabe como fazer uma requisição do tipo POST,vamos ao spider:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# -*- coding:utf-8 -*-import scrapy
from scrapy.exceptions import CloseSpider class LoginSpider(scrapy.Spider): name = 'login-spider'start_urls =
def parse(self, response): self.log('visitei a página de login: {}'.format(response.url))token =
response.css('input::attr(value)').extract_first() yield scrapy.FormRequest( url='http://quotes.toscrape.com/login',formdata={
'username': 'john.doe', 'password': 'anything', 'csrf_token': token,},
callback=self.parse_author_links,)
def parse_author_links(self, response):has_logout_link =
response.css('a').extract_first() if not has_logout_link: raise CloseSpider('falha de autenticação') self.log('acabei de fazer login') links = response.css('.quote a::attr(href)').extract()for link in links:
yield {'link': link} next_page = response.css('li.next a::attr(href)').extract_first()if next_page:
yield scrapy.Request( url=response.urljoin(next_page), callback=self.parse_author_links,)
Na linha 11 (método parse()), extraímos o token da página para enviar junto com a requisição de autenticação e, logo em seguida, o método parse() gera a requisição POST para a URL de login. Repare que registramos o método self.parse_author_links como o _callback_ para manipular a página enviada como resposta pelo servidor. Powered by wordads.co Thank you for submitting the report! Seen ad many times Not relevant Offensive Covers content Broken Report this ad No método parse_author_links, verificamos se o botão de logout apareceu na página (o que indica que estamos autenticados) e, caso não esteja, encerramos a execução do spider (linha 25). Depois disso, basta extrair as URLs dos autores (linhas 28-30). Veja a versão completa do spider aqui.
E O COOKIE DE SESSÃO? Ah, lembra que falei no começo do artigo que o navegador armazena um cookie de sessão e envia ele junto com as requisições subsequentes pro mesmo site? Pois é, o Scrapy faz a mesma coisa pra gente. Ou seja, não precisamos nos preocupar em manter a sessão. SIMPLIFICANDO UM POUCO É bem comum termos que submeter valores presentes em campos ocultos (_hidden_) juntamente com os dados que preenchemos no formulário. Para facilitar a nossa vida, o Scrapy fornece um método chamado FormRequest.from_response(),
que carrega automaticamente os valores dos campos do formulário que possuem valores default. Nosso método parse() ficaria assim se utilizássemos o from_response():1
2
3
4
5
6
7
8
9
10
def parse(self, response): self.log('visitei a página de login: {}'.format(response.url)) yield scrapy.FormRequest.from_response(response,
formdata={
'username': 'john.doe', 'password': 'anything',},
callback=self.parse_author_links,)
Como você pode ver, não precisamos extrair e passar o csrf token, nem passar a URL do formulário. O from_response já faz isso pragente.
POR FIM
Agora você já pode fazer um spider para extrair aqueles dados que você precisa para o seu relatório. Mas, antes de fazer seu spider, verifique se ele não está violando os termos de serviço do seu banco, ou seja lá qual sistema que você estiver acessando.COMPARTILHAR:
* Clique para compartilhar no Twitter(abre em nova janela) * Clique para compartilhar no Telegram(abre em nova janela) * Clique para compartilhar no Pocket(abre em nova janela) * Clique para enviar por e-mail a um amigo(abre em nova janela) * Clique para imprimir(abre em nova janela)*
Padrão
Publicado por
Valdir Stumm Jr
Postado no
10 de setembro de 2017Publicado em
dicas rápidas
, Python3
comentários
3 Comentários
ESQUISITICES (OU NÃO) NO ARREDONDAMENTO EM PYTHON 3 O arredondamento de números em Python 3 pode ser feito usando uma função _builtin_ chamada round(). Em sua forma mais simples, ela recebe um número qualquer e o arredonda para um número inteiro. Vejaela em ação:
>>> round(1.2)
1
>>> round(1.8)
2
Ela ainda aceita um segundo parâmetro, que indica quantos dígitos de precisão queremos no resultado. O valor padrão desse parâmetro é 0, mas podemos passar qualquer valor: >>> round(1.847, ndigits=2)1.85
>>> round(1.847, ndigits=1)1.8
E o que será que acontece quando queremos arredondar um número como 1.5? A round() arredonda pra cima ou pra baixo? Vamos ver:>>> round(1.5)
2
Arredonda pra cima? Vamos ver mais um número só pra ter certeza:>>> round(2.5)
2
Ops, agora foi pra baixo! Vamos ver mais alguns:>>> round(3.5)
4
>>> round(4.5)
4
>>> round(5.5)
6
Calma aí que tudo tem uma explicação. Em Python 3, a round() define o arredondamento assim: > Arredonda pro mais próximo. > Se empatar, arredonda pro número PAR mais próximo. Agora faz sentido né? Revendo os exemplos dali de cima, vemos que o arredondamento sempre foi feito pro par mais próximo:>>> round(3.5)
4
>>> round(4.5)
4
>>> round(5.5)
6
Powered by wordads.co Thank you for submitting the report! Seen ad many times Not relevant Offensive Covers content Broken Report this ad No caso do 3.5, tanto o 3 quanto o 4 estão à mesma distância dele. Ou seja, deu empate. Como a regra determina, round() desempata pro par mais próximo, que é 4.E EM PYTHON 2?
Em Python 2 é diferente. O empate em arredondamentos é sempre resolvido pra cima, em caso de números positivos:>>> round(1.5)
2.0
>>> round(2.5)
3.0
E pra baixo, em caso de números negativos:>>> round(-1.5)
-2.0
>>> round(-2.5)
-3.0
MAS POR QUE PYTHON 3 FAZ DIFERENTE? O objetivo é deixar o arredondamento menos tendencioso. Imagine um banco onde todos os arredondamentos são feitos para cima. Ao final do dia, o relatório de receitas do banco vai mostrar um valor mais alto do que o banco realmente recebeu. É exatamente o que acontece em PYTHON 2:>>> valores =
>>> sum(valores)
12.0
>>> sum(round(v) for v in valores)14.0
Usando a regra de arredondamento de Python 3, os valores arredondados nas operações tendem a ser amortizados, porque metade deles vai ser para cima e a outra metade para baixo, visto que metade dos números existente são pares e a outra metade são ímpares. Veja o mesmo código, agora rodando em PYTHON 3:>>> valores =
>>> sum(valores)
12.0
>>> sum(round(v) for v in valores)12
Na realidade, isso não é uma novidade de Python 3. Esse tipo de arredondamento é antigo e tem até nome: Bankers Rounding (Arredondamento de Banqueiros). Se ficou interessado no assunto, dê uma olhada num outro post daqui do blog, que mostra como funciona a divisão inteira em Python: https://pythonhelp.wordpress.com/2013/06/30/comportamento-inesperado-na-divisao-inteira/COMPARTILHAR:
* Clique para compartilhar no Twitter(abre em nova janela) * Clique para compartilhar no Telegram(abre em nova janela) * Clique para compartilhar no Pocket(abre em nova janela) * Clique para enviar por e-mail a um amigo(abre em nova janela) * Clique para imprimir(abre em nova janela)*
Padrão
Publicado por
Elias Dorneles
Postado no
5 de junho de 2017
Publicado em
Uncategorized
comentários
Deixe um comentário GERANDO AMOSTRAS ALEATÓRIAS COM RESERVOIR SAMPLING EM PYTHONAlô pessoal!
Hoje começamos um experimento com material para o Python Help no formato screencast! Nesse primeiro vídeo a gente mostra a implementação de um algoritmo bem legal chamado Reservoir Sampling, que serve para
obter amostras aleatórias de uma sequência de elementos de tamanhodesconhecido.
Assista e conte-nos o que achou! UPDATE: Fábio Utzig apontou uma otimização na nossa implementação para evitar alocações de memória desnecessárias no CPython, ficaria melhor evitar chamar append() e inicializar a lista sample com:1
sample = * sample_sizeValeu, Fábio, boa!
COMPARTILHAR:
* Clique para compartilhar no Twitter(abre em nova janela) * Clique para compartilhar no Telegram(abre em nova janela) * Clique para compartilhar no Pocket(abre em nova janela) * Clique para enviar por e-mail a um amigo(abre em nova janela) * Clique para imprimir(abre em nova janela)*
Padrão
Publicado por
Valdir Stumm Jr
Postado no
22 de outubro de 2016Publicado em
scrapy , web
scraping
comentários
3 Comentários
WEB SCRAPING EM PÁGINAS BASEADAS EM JAVASCRIPT COM SCRAPY O Scrapy é um framework todo prontinho pra lidar com a maioria dos problemas que enfrentamos ao fazer web scraping. Porém, é um tanto comum termos que extrair dados de páginas cuja parte do conteúdo seja gerada por código JavaScript, que é tipicamente executado no nosso navegador. Aí é que tá problema, pois o Scrapy não executa os scripts presentes no HTML. Tudo o que ele faz é baixar o HTML exatamente da forma que o servidor entrega. Este post vai fazer um apanhado geral sobre algumas formas de lidar com páginas baseadas em JavaScript. Vamos começar vendo como saber se determinada informação que queremos extrair é gerada por códigoJavaScript ou não.
COMO IDENTIFICAR UMA PÁGINA BASEADA EM JAVASCRIPT Um jeito simples de descobrir se as informações que queremos extrair são gerada por código JS é usando o nosso navegador. Carregue a página e então utilize a opção “Visualizar código-fonte”. Se o conteúdo que você quer extrair estiver ali representado em HTML, você pode ficar tranquilo, pois você poderá extraí-lo tranquilamente usando somente o Scrapy. > NOTA: não utilize a opção “Inspecionar Elemento” (ferramentas > do desenvolvedor) neste caso. Embora ela seja uma mão na roda pra > descobrirmos como os dados estão estruturados, o problema é que > ela já mostra o fonte da página após ter sido renderizada pelo > browser (incluindo conteúdo gerado dinamicamente por código JS). Por exemplo, abra http://quotes.toscrape.com. Esta página mostra frases de autores famosos e, se você abrir o código-fonte da página, verá que cada frase está representada por um blocodiv.quote.
Entretanto, se você carregar a variação gerada por JavaScript → http://quotes.toscrape.com/js, você irá perceber que as frases não estão lá bonitinhas dentro do HTML. Na realidade, elas estão entranhadas em um trecho de código JavaScript presente na página, que é executado pelo motor JavaScript do navegador. Outra opção é usar uma extensão pro navegador que permita desabilitar o JavaScript em uma aba, como o Quick JavaScript Switcher,
e então verificar se os dados que queremos extrair estão na página mesmo após desabilitamos o JavaScript. Bom, uma vez que identificamos que o conteúdo da página é gerado por código JavaScript, o próximo passo é usar alguma das soluções a seguir para que possamos lidar com páginas baseadas em JS usando oScrapy.
1. USANDO UM NAVEGADOR HEADLESS Usando o Scrapy, podemos terceirizar a tarefa de renderizar a página completa para um navegador web. Assim, ao invés de utilizarmos o HTML baixado pelo Scrapy, vamos fazer com que um navegador baixe a página e execute o código JS pra gente e entregue como resposta o HTML prontinho. Uma opção legal para isso é o PhantomJS , que é um navegador headless e que pode ser facilmente integrado com Python via Selenium.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import scrapy
from selenium import webdriver class QuotesSeleniumSpider(scrapy.Spider): name = 'quotes-selenium'start_urls =
def __init__(self, *args, **kwargs): self.driver = webdriver.PhantomJS() super(QuotesSeleniumSpider, self).__init__(*args,**kwargs)
def parse(self, response): self.driver.get(response.url) sel = scrapy.Selector(text=self.driver.page_source) for quote in sel.css('div.quote'):yield {
'text':
quote.css('span.text::text').extract_first(),'author':
quote.css('small.author::text').extract_first(),'tags':
quote.css('a.tag::text').extract()}
next_page_url = response.css("li.next > a::attr(href)").extract_first() if next_page_url is not None:yield
scrapy.Request(response.urljoin(next_page_url)) > NOTA: O spider acima requer o módulo Python para o Selenium, que > pode ser instalado via pip install selenium. Também é necessária > a instalação do binário do PhantomJS > em algum lugar do seu PATH. Powered by wordads.co Thank you for submitting the report! Seen ad many times Not relevant Offensive Covers content Broken Report this ad O spider acima instancia o driver selenium pro PhantomJS e, no método parse(), faz com que o PhantomJS baixe e renderize a página http://quotes.toscrape.com/js. O HTML renderizado (self.driver.page_source) é então usado para construir um objeto Selector que nos permite extrair dados usando os tradicionais seletores do Scrapy. Contudo, quando executarmos o código acima, cada página será baixada duas vezes: uma pelo downloader do Scrapy e outra pelo método parse(), na chamada à self.driver.get(). Para evitar esse comportamento, podemos criar um downloader middleware que utilize o selenium para baixar a página ao invés do downloader do Scrapy. Você pode ver o código do middleware clicando aqui e um spider que utiliza tal middleware aqui.
2. EXTRAINDO DADOS DE DENTRO DO CÓDIGO JAVASCRIPT O código fonte da página http://quotes.toscrape.com/js nos mostra que as frases que são renderizadas pelo navegador estão dentro de um arrayzão JavaScript chamado data:var data = [
{
"author": {
"goodreads_link": "/author/show/9810.Albert_Einstein", "name": "Albert Einstein", "slug": "Albert-Einstein"},
"tags": ,
"text": "\u201cThe world as we have created it is a process of our thinking. It cannot be changed without changing our thinking.\u201d"},
{
"author": {
"goodreads_link": "/author/show/1077326.J_K_Rowling", "name": "J.K. Rowling", "slug": "J-K-Rowling"},
"tags": ,
"text": "\u201cIt is our choices, Harry, that show what we truly are, far more than our abilities.\u201d"},
...
Os dados que queremos extrair já estão prontinhos dentro da página, então podemos extraí-los sem usar um navegador headless. Como os seletores do Scrapy apenas lidam com HTML/XML, vamos usar a lib js2xml para converter o array JavaScript acima para XML e então extrair os dados usando seletoresScrapy.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import scrapy
import js2xml
class QuotesJs2XmlSpider(scrapy.Spider): name = 'quotes-js2xml'start_urls =
def parse(self, response): script = response.xpath('//script/text()').extract_first() script_as_xml = js2xml.parse(script) sel = scrapy.Selector(_root=script_as_xml)for quote in
sel.xpath('//var/array/object'):yield {
'text':
quote.xpath('string(./property)').extract_first(), 'author': quote.xpath( 'string(./property//property)').extract_first(),
'tags':
quote.xpath('./property//string/text()').extract(),}
next_page_url = response.css("li.next > a::attr(href)").extract_first() if next_page_url is not None:yield
scrapy.Request(response.urljoin(next_page_url)) No método parse() do spider acima primeiramente obtemos o código JS contido no elemento (linha 10) e então utilizamos o js2xml para convertê-lo para JavaScript. Depois disso, bastou construir um seletor Scrapy sobre tal valor e extrair os dados usando XPath (ouCSS).
Powered by wordads.co Thank you for submitting the report! Seen ad many times Not relevant Offensive Covers content Broken Report this ad Além de ter menos dependências, esta solução tem um desempenho melhor pois não depende do carregamento de um navegador (mesmo que seja headless como o PhantomJS) durante a execução. 3. IMITANDO O COMPORTAMENTO DO NAVEGADOR A web está cheia de sites com conteúdo dinâmico carregado de acordo com ações do usuário. Por exemplo, o usuário de um e-commerce rola a página até o final e novos produtos são carregados automaticamente (a.k.a. rolagem infinita – _infinite scrolling_). Ou então o usuário clica em um botão que faz com que mais informações sejam mostradas sem recarregar a página. Nesses casos, o que tipicamente acontece é que o navegador faz requisições AJAX que retornam mais informações quando determinado evento do usuário é disparado (_scroll_, _click_, etc). Extrair dados de páginas desse tipo pode ser bem mais fácil do que a gente imagina. Ao invés de usar Selenium + PhantomJS, basta inspecionar as requisições AJAX que o navegador faz e imitá-las nonosso spider.
Considere a seguinte página: http://quotes.toscrape.com/scroll. A cada vez que rolamos ela até o fim, uma nova requisição é feita para a obtenção de novas frases que são então renderizadas pelo navegador. Para verificar quais requisições são feitas e para quais recursos, podemos usar o painel “Rede” das “Ferramentas do desenvolvedor” do nosso navegador favorito, como mostro abaixo noChrome:
No nosso exemplo, os novos resultados são obtidos por requisições para http://quotes.toscrape.com/api/quotes?page= e a resposta para as requisições vem prontinha em formato JSON. Ou seja, nem precisaremos usar XPath ou CSS para extrair os dados:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import json
import scrapy
class QuotesAjaxSpider(scrapy.Spider): name = 'quotes-ajax' base_url = 'http://quotes.toscrape.com/api/quotes?page=%d'start_urls =
def parse(self, response): json_data = json.loads(response.text) for quote in json_data:yield quote
if json_data:
next_page = self.base_url % (int(json_data) + 1) yield scrapy.Request(url=next_page, callback=self.parse) O spider acima imita as requisições AJAX feitas pelo navegador e obtém os dados de todas as frases do site. Em geral, você pode fazer o mesmo para a maioria das páginas que usam AJAX. Algumas podem ser mais complicadinhas, requerendo que você envie alguns dados pré-computados (como _hashes_) como parâmetro, mas nada que uma boa investigada na página não resolva.POR FIM
Espero que este post tenha ajudado a desmistificar um pouco o scraping de páginas baseadas em JavaScript. Como você pôde ver, nem sempre precisamos recorrer a uma ferramenta externa para renderizar o JS para a gente. Basta entender melhor como o protocolo HTTP e o navegador funcionam para que possamos lidar com esse tipo de problema. Powered by wordads.co Thank you for submitting the report! Seen ad many times Not relevant Offensive Covers content Broken Report this ad Em alguns casos mais complexos (e também mais raros), você precisará simular a interação do usuário com a página. Para isso, você pode usar os métodos do selenium webdriverou então simular
tal comportamento usando um script Lua com o Splash.
O código apresentado neste post está disponível em: https://github.com/stummjr/pythonhelp-scrapy-javascript/COMPARTILHAR:
* Clique para compartilhar no Twitter(abre em nova janela) * Clique para compartilhar no Telegram(abre em nova janela) * Clique para compartilhar no Pocket(abre em nova janela) * Clique para enviar por e-mail a um amigo(abre em nova janela) * Clique para imprimir(abre em nova janela)*
Padrão
Publicado por
Elias Dorneles
Postado no
1 de outubro de 2016Publicado em
misc
comentários
4 Comentários
USANDO COMANDO WITH PARA EVITAR ACOPLAMENTO TEMPORAL Hoje vamos falar sobre como melhorar um padrão que você provavelmente já viu em muito código:1
2
3
f = open(...)
....
f.close()
1
2
3
4
a = A(...)
a.start(...)
...
a.end()
1
2
3
4
c = Coisa(...)
c.cria(...)
....
c.destroi()
1
2
3
4
test = Test()
test.setUp()
test.run()
test.tearDown()
Os trechos de código acima possuem em comum o que chamamos acoplamento temporal (do inglês, temporal coupling).
Acoplamento
mede
o quanto uma coisa depende de outra em software, e é comumente medida entre módulos ou componentes – tipo, o quanto certas classes ou funções dependem uma da outra. Em geral, é desejável que haja poucas interdependências, para evitar que a complexidade se espalheem um projeto.
O acoplamento temporal acontece quando uma coisa precisa ser feita depois de outra, mesmo que seja dentro do mesmo módulo ou função. A relação de interdependência é com o tempo, isto é, o momento em que as coisas precisam acontecer. Alguns exemplos seriam: fechar um arquivo DEPOIS de terminar de carregar o conteúdo, liberar memória QUANDO acabar de usar, etc. REDUZINDO O ACOPLAMENTO TEMPORAL Desde a versão 2.5, Python possui o comando with para lidar exatamente com este tipo de situação. Com ele, podemosfazer:
1
2
3
with open(...) as f:dados = f.read()
# processa dados aqui Ao usar o bloco with para abrir um arquivo, o método _close()_ é chamado por trás dos panos pelo gerenciador de contexto incondicionalmente (isto é, mesmo que ocorra alguma exceção no código de dentro do bloco). O código equivalente seria:1
2
3
4
5
f = open(...)
try:
dados = f.read()
finally;
f.close()
Powered by wordads.co Thank you for submitting the report! Seen ad many times Not relevant Offensive Covers content Broken Report this ad Repare como o primeiro código é mais curto e mais simples que o segundo, pois há menos interdependências entre as coisas que estãoacontecendo.
A ideia é não precisar lembrar de ter que escrever _try/finally_ e chamar o _close()_, utilizando por trás dos panos um código que se certifique de que as coisas aconteçam na ordem esperada. A este código, chamamos de gerenciadores de contexto, ou _context managers_.
IMPLEMENTANDO UM GERENCIADOR DE CONTEXTO A maneira mais simples de implementar um gerenciador de contexto Python é utilizar o decorator contextlib.contextmanager. Vejamos um
exemplo:
1
2
3
4
5
6
7
8
9
10
11
import os
import contextlib
@contextlib.contextmanager def roda_em_dir(dir): orig_dir = os.getcwd()os.chdir(dir)
try:
yield
finally:
os.chdir(orig_dir)
Esse gerenciador de contexto nos permite rodar um código em um diretório qualquer, e ao fim dele voltar para o diretório queestávamos antes.
A função os.getcwd()devolve o
diretório atual e a função os.chdir()entra no
diretório passado como argumento, e depois os.chdir()é usada
novamente para voltar para o diretório original.Veja como usá-lo:
1
2
3
4
5
6
print('Comecei no diretorio: %s' % os.getcwd()) with roda_em_dir('/etc'): print('Agora estou no diretorio: %s' % os.getcwd()) print('E agora, de volta no diretorio: %s' % os.getcwd()) Rodando esse código na minha máquina, a saída é: Comecei no diretorio: /home/elias Agora estou no diretorio: /etc E agora, de volta no diretorio: /home/elias A função _roda_em_dir()_ é o que chamamos de uma corotina , pois utiliza o comando _yield_ para “pausar” sua execução, entregando-a para o código que está dirigindo-a. Neste caso, isso é o trabalho do decorator contextlib.contextmanager, que entrega a
execução para o código que está dentro do bloco _with_ até que este termine, o que devolverá a execução para a corotina _roda_em_dir()_, que irá executar o código dentro do _finally_. Não se preocupe se for um pouco difícil de entender como a coisa toda funciona, estamos passando por cima de alguns tópicos avançados aqui (decorators, corotinas, etc). O importante é que você se dê conta de que pode implementar um gerenciador de contexto rapidamente usando o contextlib.contextmanagercom uma função
que faça _yield_ dentro de um bloco _try/finally_. Vejamos um outro exemplo, desta vez vamos fazer um gerenciador de contexto que cria um arquivo temporário para utilizarmos em um código de teste, e deleta o arquivo automaticamente ao fim do blocowith:
1
2
3
4
5
6
7
8
9
10
11
import os
import contextlib
import tempfile
@contextlib.contextmanagerdef arquivo_temp():
_, arq = tempfile.mkstemp()try:
yield arq
finally:
os.remove(arq)
Powered by wordads.co Thank you for submitting the report! Seen ad many times Not relevant Offensive Covers content Broken Report this ad Repare como desta vez, o comando _yield_ não está mais sozinho, desta vez ele está enviando a variável ARQ que contém o nome do arquivo temporário para ser usado no _with_, como segue:1
2
3
4
5
with arquivo_temp() as arq: print('Usando arquivo temporario %s' % arq) print('Arquivo existe? %s' % os.path.exists(arq)) print('E agora, arquivo existe? %s' % os.path.exists(arq)) Rodando na minha máquina, a saída ficou: Usando arquivo temporario /tmp/tmp2IUF7H Arquivo existe? True E agora, arquivo existe? False Note como a variável ARQ pode ser usada depois do _with_ também: isto mostra que o contexto está sendo gerenciado de maneira especial, mas o espaço de nomes de variáveis ainda é o mesmo (ou seja, o comando with é mais parecido com _if_ e _for_, do que com o comando _def_, por exemplo).PARA CONCLUIR
Bem, apesar do mecanismo por trás ser um pouquinho complicado de entender inicialmente, você pode perceber que implementar um gerenciador de contexto não é muito difícil. Você precisa usar o decorator contextlib.contextmanagerem uma função
geradora fazendo yield dentro de um bloco _try/finally_ – moleza! Você também pode implementar um gerenciador de contexto escrevendo uma classe que implemente o protocolo do comando with,
que envolve basicamente implementar dois métodos especiais chamados___enter__
_
e ___exit__
_
que sinalizam respectivamente entrar e sair do bloco _with_. Em geral é mais conveniente utilizar o @contextlib.contextmanager, mas em alguns
casos é melhor implementar os métodos. Por exemplo, caso queira compartilhar o próprio objeto gerenciador do contexto dentro do with, você pode usar return self no método ___enter___. Agora, vá refatorar aqueles códigos com acoplamento temporal e sedivirta!
COMPARTILHAR:
* Clique para compartilhar no Twitter(abre em nova janela) * Clique para compartilhar no Telegram(abre em nova janela) * Clique para compartilhar no Pocket(abre em nova janela) * Clique para enviar por e-mail a um amigo(abre em nova janela) * Clique para imprimir(abre em nova janela)*
Padrão
Publicado por
Valdir Stumm Jr
Postado no
18 de setembro de 2016Publicado em
shell
comentários
6 Comentários
CUSTOMIZANDO O PROMPT DO IPYTHON 5+ Há poucos meses atrás foi lançada a versão 5 do IPython. O shell
que antes já era super legal, agora ficou mais interessante ainda, com _syntax highlighting_ no código digitado e um esquema de completação inline usando umas listinhas bem convenientes: Porém, a forma de configuração do prompt mudou. Algumas das dicas apresentadas no post Sintonia Fina no IPython não se aplicam mais. Assim, vou mostrar aqui como fazer para que o seu IPython 5+ fique com aparência semelhante à abaixo: O que mudou basicamente é que ao invés de simplesmente definir a string que será usada como prompt em um atributo, agora é preciso implementar uma subclasse de Prompts, com alguns métodos para alterar o comportamento do seu prompt:1
2
3
4
5
6
7
8
9
10
11
12
13
from IPython.terminal.prompts import Prompts, Token class MyCustomPrompt(Prompts): def in_prompt_tokens(self, cli=None):return
def out_prompt_tokens(self, cli=None):return
def continuation_prompt_tokens(self, cli=None, width=None):return
No exemplo acima, customizei os prompts de entrada (de In : para o tradicional >>>), de saída ( de Out: para nada) e de continuação (de ...: para nada). O legal dessa nova abordagem é que agora temos mais flexibilidade pra customizar os prompts, colocando valores dinâmicos dentro delesse quisermos.
COMO CONFIGURAR SEU PROMPT A configuração do IPython se dá através de perfis, então vamos começar criando o perfil default: $ ipython profile create Isso irá criar um diretório ~/.ipython com a seguinte estrutura:.ipython
├── extensions ├── nbextensions └── profile_default ├── ipython_config.py ├── ipython_kernel_config.py├── log
├── pid
├── security
└── startup
└── README
Powered by wordads.co Thank you for submitting the report! Seen ad many times Not relevant Offensive Covers content Broken Report this ad Agora salve a classe MyCustomPrompt em um arquivo ~/.ipython/my_custom_prompt.py e depois disso edite o arquivo ~/.ipython/profile_default/ipython_config.py para que tenha o seguinteconteúdo:
1
2
3
4
5
6
7
8
from my_custom_prompt import MyCustomPromptc = get_config()
c.TerminalInteractiveShell.prompts_class = MyCustomPrompt c.TerminalIPythonApp.display_banner = False c.TerminalInteractiveShell.separate_in = '' Pronto, agora o seu IPython 5+ deverá se parecer com aquele que mostrei no screenshot lá no começo do post. Se você estiver usando uma versão anterior do IPython, verifique meu post anterior sobre o mesmo assunto: https://pythonhelp.wordpress.com/2013/12/29/sintonia-fina-do-ipython/ Confira as minhas configurações do IPython em: https://github.com/stummjr/dotfiles/tree/master/ipythonCOMPARTILHAR:
* Clique para compartilhar no Twitter(abre em nova janela) * Clique para compartilhar no Telegram(abre em nova janela) * Clique para compartilhar no Pocket(abre em nova janela) * Clique para enviar por e-mail a um amigo(abre em nova janela) * Clique para imprimir(abre em nova janela)*
NAVEGAÇÃO DE POSTS ← Posts AnterioresBUSCAR
Pesquisa
ÚLTIMOS POSTS
* Preservando a ordem de sequências ao remover duplicatas * Como autenticar um spider Scrapy em um website * Esquisitices (ou não) no arredondamento em Python 3 * Gerando amostras aleatórias com Reservoir Sampling em Python * Web scraping em páginas baseadas em JavaScript com Scrapy * Usando comando with para evitar acoplamento temporal * Customizando o prompt do IPython 5+ * O estranho caso do else em loops* Tente outra vez
* Funções anônimas em PythonTOP 10
* Brincando com Listas * Trabalhando com datas e horas em Python - datetime * Obtendo a data e a hora atuais em Python * map(), reduce(), filter() e lambda * Ordenação de uma lista * Fatiamento (slicing) de Strings em Python * Acessando APIs REST com Python * Acessando recursos na web com Python * Medindo tempo de execução de código Python* all() e any()
CATEGORIAS
algoritmos
banco de dados
dicas
rápidas
documentação
estruturas
listas
misc
módulos
oo
Python3
scrapy
shell
strings
Uncategorized
web
web scraping
POSTS POR AUTOR
* ELIAS DORNELES
* VALDIR STUMM JR
SEGUIR BLOG VIA E-MAILSeguir
ARQUIVOS
* fevereiro 2018 (1) * outubro 2017 (1) * setembro 2017 (1)* junho 2017 (1)
* outubro 2016 (2) * setembro 2016 (1)* abril 2016 (1)
* agosto 2015 (1)
* fevereiro 2015 (1) * janeiro 2015 (3) * setembro 2014 (1)* agosto 2014 (1)
* julho 2014 (1)
* junho 2014 (1)
* maio 2014 (1)
* abril 2014 (2)
* fevereiro 2014 (1) * janeiro 2014 (1) * dezembro 2013 (2) * novembro 2013 (1) * outubro 2013 (3) * setembro 2013 (4)* agosto 2013 (1)
* julho 2013 (2)
* junho 2013 (5)
* maio 2013 (2)
* abril 2013 (4)
* março 2013 (6)
* fevereiro 2013 (1) * janeiro 2013 (2) * dezembro 2012 (1) * novembro 2012 (2) * outubro 2012 (1) * setembro 2012 (4)* agosto 2012 (2)
* julho 2012 (4)
* junho 2012 (7)
* maio 2012 (5)
* abril 2012 (1)
* março 2012 (1)
* fevereiro 2012 (1) * janeiro 2012 (1) * dezembro 2011 (2) * novembro 2011 (7) * outubro 2011 (3) * setembro 2011 (2)* agosto 2011 (5)
* julho 2011 (1)
* março 2011 (4)
* fevereiro 2011 (3) * janeiro 2011 (2)LICENÇA
RSS
RSS - Posts
Anúncios
Powered by wordads.co Thank you for submitting the report!Seen ad many times
Not relevant
Offensive
Covers content
Broken
Denunciar este anúncio Blog no WordPress.com. Do Not Sell My Personal InformationPython Help
Crie um website ou blog gratuito no WordPress.com. Do Not Sell My PersonalInformation
Publicar em
Cancelar
Privacidade e cookies: Esse site utiliza cookies. Ao continuar a usar este site, você concorda com seu uso. Para saber mais, inclusive sobre como controlar os cookies, consulte aqui: Política de cookies* Seguir
*
* Python Help
* Personalizar
* Seguir
* Registre-se
* Fazer login
* Denunciar este conteúdo * Gerenciar assinaturas * Esconder esta barra Enviar para oendereço de e-mail Seu nome Seu endereço de e-mailCancelar
Post não foi enviado - verifique os seus endereços de e-mail! Verificação de e-mail falhou, tente novamente Desculpe, seu blog não pode compartilhar posts por e-mail. Powered by wordads.co Thank you for submitting the report!Seen ad many times
Not relevant
Offensive
Covers content
Broken
Report this ad
Details
Copyright © 2024 ArchiveBay.com. All rights reserved. Terms of Use | Privacy Policy | DMCA | 2021 | Feedback | Advertising | RSS 2.0