Olá. Eu estou aprendendo Python, e resolvi fazer um projetinho utilizando o que eu aprendi. A Ideia é simples, procurar em uma página WEB links para arquivos (que estejam dentre as extensões passadas pelo usuário), e então baixe os mesmos. Porém eu não consegui testar minha aplicação por causa de um arro.
Meu código é esse:
#! /usr/bin/python
# coding: utf-8
#By: Thallysson Klein Flor
import io
import sys
import urllib.request as request
from bs4 import BaultifulSoup
import requests
class Main:
def download(response, output):
total_downloaded = 0
while True:
data = response.read(1024)
total_downloaded += len(data)
if not data:
break;
out_file.write(data)
print("Baixados {bytes}".format(bytes=total_downloaded))
def main ():
for url in sys.argv:
page = requests.get(url)
soup = BeaultifulSoup(page.content,"html.parser")
images = soup.find_all('img')
videos = soup.find_all ('video')
audios = soup.find_all ('audio')
links = soup.find_all ('a')
tipo = raw_input ('Que arquivos você deseja baixar?')
print ("Digite o NOME das extensões dos arquivos que você deseja baixar (separadas por uma , )")
tipos = tipo.split(",")
for t in tipo:
for index, img in imagens enumerate(imagens):
src = img [ ' src ' ]
if src.contains ('http') and src.contains(t):
response = request.urlopen (src)
out_file = io.FileIO ("IMG {}".format ( index), mode="w")
download (response, out_file)
response.close ()
out_file.close ()
for index, v in videos enumerate(videos):
src = v [ ' src ' ]
if src.contains ('http') and src.contains(t):
response = request.urlopen (src)
out_file = io.FileIO ("Video {}".format ( index), mode="w")
download (response, out_file)
response.close ()
out_file.close ()
for index, a in audios enumerate(audios):
src = a [ ' src ' ]
if src.contains ('http') and src.contains(t):
response = request.urlopen (src)
out_file = io.FileIO ("Audio {}".format ( index), mode="w")
download (response, out_file)
response.close ()
out_file.close ()
for index, link in links enumerate(links):
src = link [ ' src ' ]
if src.contains ('http') and src.contains(t):
response = request.urlopen (src)
out_file = io.FileIO ("Arquivo {}".format ( index), mode="w")
download (response, out_file)
response.close ()
out_file.close ()
if __name__ == "__main__":
main()
Está dando erro de “invalid sintax” em todas as funções enumerate de todos os loops. Alguém sabe me dizer o que eu fiz de errado?
Não, nem tudo o que se importa pertence/existe nativamente no python, é necessário instalação do módulo, como naquele exemplo do wpa que te mostrei lembra?
Se você observou bem a página, tinha um comando parecido com
pip install wpa_supplicant
Ou seja, ouve a instalação do módulo para depois sim a importação… são coisas distintas
O python tem uma fama de “baterias inclusas”, mas isso não quer dizer que vai ter tudo o que você deseja…
Vai se acostumando a usar o pip (gerenciador de dependências do python), pra instalar os módulos e “extender” o python conforme sua necessidade…
É, eu escrevi um programa com aquele exemplo do WPA que você me mostrou, porém eu não tive a chance de executa-lo porque migrei de sistema operacional e tive uma grande manutenção. Como eu ainda não testei, eu não sabia disso.
Bem, eu segui o link, e instalei no meu PC. Só pra avisar, eu uso Windows 10.
Porém agora está sendo apresentado o seguinte erro:
Traceback (most recent call last):
File "C:\Users\thall\Desktop\baixarArquivos.py", line 8, in <module>
from bs4 import BaultifulSoup
ImportError: cannot import name 'BaultifulSoup'
É realmente, foi um erro grotesco. Porém agora está sendo apresentado o seguinte erro: ModuleNotFoundError: No module named 'requests'
Porém eu já instalei o módulo requests, urllib3 e chardet2.
Consegui instalar e meus problemas com este módulo acabaram, pesso perdão novamente pela minha ignorância, eu vi esse exemplo com o requests em um PDF, porém está apresentando o seguinte erro pra mim:
Traceback (most recent call last):
File "C:\Users\thall\Desktop\baixarArquivos.py", line 67, in <module>
main()
File "C:\Users\thall\Desktop\baixarArquivos.py", line 24, in main
page = requests.get(url)
File "C:\Users\thall\AppData\Local\Programs\Python\Python36\lib\site-packages\requests\api.py", line 70, in get
return request('get', url, params=params, **kwargs)
File "C:\Users\thall\AppData\Local\Programs\Python\Python36\lib\site-packages\requests\api.py", line 56, in request
return session.request(method=method, url=url, **kwargs)
File "C:\Users\thall\AppData\Local\Programs\Python\Python36\lib\site-packages\requests\sessions.py", line 488, in request
resp = self.send(prep, **send_kwargs)
File "C:\Users\thall\AppData\Local\Programs\Python\Python36\lib\site-packages\requests\sessions.py", line 603, in send
adapter = self.get_adapter(url=request.url)
File "C:\Users\thall\AppData\Local\Programs\Python\Python36\lib\site- packages\requests\sessions.py", line 685, in get_adapter
raise InvalidSchema("No connection adapters were found for '%s'" % url)
requests.exceptions.InvalidSchema: No connection adapters were found for 'C:\Users\thall\Desktop\baixarArquivos.py'
Sabe me dizer o que eu fiz de errado? Eu fiz igual ao exemplo que eu vi.
Eu descobri o motivo do erro. A primeira posição do sys.argv não é o primeiro parâmetro e sim o nome do arquivo. Depois de corrigir esse e vários outros bugs que apareceram, meu código ficou assim:
#! /usr/bin/python
# coding: utf-8
#By: Thallysson Klein Flor
import io
import sys
import urllib.request as request
from bs4 import BeautifulSoup
import requests
from hurry.filesize import size
class Main:
def main ():
def download(response, output, url):
print("Baixando o arquivo {}".format(url))
total_downloaded = 0
while True:
data = response.read(1024)
total_downloaded += len(data)
if not data:
break;
out_file.write(data)
print("Baixados {bytes}".format(bytes=size(total_downloaded)), end="\r")
print("\nFinalizado")
for index, url in enumerate(sys.argv):
if index > 0:
page = requests.get(url)
soup = BeautifulSoup(page.content,"html.parser")
images = soup.find_all('img')
videos = soup.find_all ('video')
audios = soup.find_all ('audio')
links = soup.find_all ('a')
tipo = input ('Digite o nome das extensões (com o ".") dos arquivos que você deseja baixar (separadas por uma , ) ')
tipos = tipo.split(",")
for t in tipos:
print(t)
for index, img in enumerate(images):
src = img [ 'src' ]
if "http" in src and t in src:
response = request.urlopen (src)
out_file = io.FileIO ("IMG {}{}".format(index,t), mode="w")
download (response, out_file, src)
response.close ()
out_file.close ()
for index, v in enumerate(videos):
try:
src = v [ 'src' ]
except:
children = v.findChildren()
for child in children:
if child.name == "source":
src = child[ 'src' ]
break
if "http" in src and t in src:
response = request.urlopen (src)
out_file = io.FileIO ("Video {}{}".format(index,t), mode="w")
download (response, out_file, src)
response.close ()
out_file.close ()
for index, a in enumerate(audios):
src = a [ 'src' ]
if "http" in src and t in src:
response = request.urlopen (src)
out_file = io.FileIO ("Audio {}{}".format(index,t), mode="w")
download (response, out_file, src)
response.close ()
out_file.close ()
for index, link in enumerate(links):
print(link)
try:
src = link [ 'href' ]
if "http" in src and t in src:
response = request.urlopen (src)
out_file = io.FileIO ("Arquivo {}{}".format(index,t), mode="w")
download (response, out_file, src)
response.close ()
out_file.close ()
except:
print("Link sem arquivo")
if __name__ == "__main__":
main()