Dr_Lion Posted June 5, 2014 at 10:50 PM Report #558407 Posted June 5, 2014 at 10:50 PM Ora bem andava aqui entretido e lembrei-me que podia fazer um script em python para me facilitar algumas tarefas nos jogos de browser online. Pois bem, tudo certo, até á parte de introduzir o login e password, é que não me parece que esteja a entrar com as credênciais, pois estou a guardar a página depois de tentar logar, e a página que obtenho é uma página sem eu aparecer como logado. Já tentei várias formas que aparecem na net, com o urllib2, alguém sabe indicar o que estou a fazer mal? import urllib, urllib2, cookielib #cookie storage cj = cookielib.CookieJar() #create an opener opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) #Add useragent, sites don't like to interact programs. opener.addheaders.append(('User-Agent', 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:28.0) Gecko/20100101 Firefox/28.0')) opener.addheaders.append(('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8')) opener.addheaders.append(('Accept-Language', 'en-US,en;q=0.5')) opener.addheaders.append(('Accept-Encoding', 'gzip, deflate')) opener.addheaders.append(('Connection', 'keep-alive')) #opener.addheaders.append( ('Referer', 'http://www.hacker-project.com') ) login_data = urllib.urlencode({'user' : 'Dr_Lion', 'pwd' : 'xxxxxxxx', 'submit' : 'Login' }) resp = opener.open('http://www.hacker-project.com', login_data) #you are now logged in and can access "members only" content. #when your all done be sure to close it f = urllib2.urlopen("http://www.hacker-project.com") pagina = f.read() fich=open("conteudo_pag.htm", "w") fich.write(pagina) fich.close() resp.close() A password obviamente não é a verdadeira, mas se for necessário arranjo uma outra conta com umas credênciais corretas. Não entendo o que se passa, a página mostra como se não conseguisse fazer login.
Dr_Lion Posted June 9, 2014 at 04:16 PM Author Report #558766 Posted June 9, 2014 at 04:16 PM Após muita pesquisa, e ter cruzado a informação de vários sites, consegui fazer login na página utilizando a lib mechanize, fica o código, agora falta-me fazer o mais fácil, que é obter os dados que me interessam e processa-los. import sys import os import mechanize import time url = "http://hacker-project.com/index.php" br = mechanize.Browser() #cookies, come to the dark side, we have . . cj = cookielib.LWPCookieJar() br.set_cookiejar(cj) # Browser options br.set_handle_equiv(True) br.set_handle_gzip(True) br.set_handle_redirect(True) br.set_handle_referer(True) br.set_handle_robots(False) #adicionar um user-agent, tentar que o server pense que se trate de um browser br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')] page = br.open(url) #tentar as duas alternativas br.select_form(name="login") #send login information br.form["user"] = "Utilizador" br.form["pwd"] = "password" #submit form br.submit() page = br.open("http://hacker-project.com") pagin = page.read().decode("UTF-8") #br.click_link(link) fi = open("tmpp.htm", "w") fi.write(pagin) fi.close() Se alguém tiver alguma sugestão ou conselhos a dar fico á espera.
Dr_Lion Posted July 4, 2014 at 06:40 PM Author Report #561596 Posted July 4, 2014 at 06:40 PM Tenho estado um tempo parado, hoje decidi voltar a isto, e ia tudo muito bem, até que estando eu a usar o python para percorrer a página aberta pelo mechanize <page = br.open(link)> depois esperava eu que fazendo um <for line in page:> ele me retornasse as linhas certinhas, a verdade é que não o faz, dá-me ideia que me retorna a página web como sendo apenas uma linha, ou seja, não entende/ignora os \n. Alguma forma de corrigir este comportamento de ignorar a mudança de linha?
Pedro C. Posted July 6, 2014 at 07:43 PM Report #561672 Posted July 6, 2014 at 07:43 PM Ele entende os "\n" simplesmente não faz qualquer instrução para usar o mesmo para separar o texto em linhas numa lista, por exemplo. Em Python nativo poderias usar "page.readlines()" no qual ele constrói uma lista em que cada elemento é uma linha. Se a biblioteca que estiveres a usar não tiver este função experimenta fazer, após a instrução de leitura: linhas = pagin.split('\n') A função split faz uma lista utlizando como separador o argumento dentro dela, neste caso o "\n". Já agora confirma que o ficheiro fi ("tmpp.htm") tem a formatação correcta com os "\n" (não vá ele estar a tirá-los com algum automatismo).
Dr_Lion Posted July 21, 2014 at 11:39 AM Author Report #562926 Posted July 21, 2014 at 11:39 AM Já consegui resolver o problema, ao que parece não tinha nada haver com o python, mas com uma falha minha, que no meio de alguns ciclos encadeados devia estar a fazer alguma azelhisse, ou uma iteração sobre a mesma variável, ou algo parecido que me estava a alterar a variável no momento errado e por isso quando lá voltava em vez de ter uma lista com cada linha do ficheiro, tinha uma lista com cada letra de cada linha ou coisa semelhante. De qualquer forma agradeço a ajuda, o readlines() de facto funciona, só não sei se o seu comportamento é bom ou não para ficheiros grandes, mas de qualquer forma aqui não é o caso.
Pedro C. Posted July 21, 2014 at 07:40 PM Report #562963 Posted July 21, 2014 at 07:40 PM Não sei o que entendes por ficheiros grandes mas, regra geral, nenhuma função em Python que envolva listas é bom para dados extensos (ocupa demasiado memória e é possível que tenha menor performance que bibliotecas numéricas, por exemplo).
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now