-
Notifications
You must be signed in to change notification settings - Fork 0
/
crawler.py
79 lines (64 loc) · 2.7 KB
/
crawler.py
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import json
from lxml import html
from util import download
from util import Session
from exceptions import LoginException
URL = 'https://www.euvoupassar.com.br'
LOGIN_URL = 'https://www.euvoupassar.com.br/login/index/autenticar'
CURSOS_URL = 'https://www.euvoupassar.com.br/cursos/indice'
DOWNLOAD_URL = 'https://www.euvoupassar.com.br/application/download/'
def login(email, senha):
session, mensagem = Session.login(email, senha, LOGIN_URL)
crawler = None
if mensagem == 'Acesso liberado. Aguarde...':
crawler = EvpCrawler(session)
print(mensagem)
else:
raise LoginException(mensagem)
return crawler
class EvpCrawler:
def __init__(self, session):
self._session = session
def materias(self):
page = self._session.get(CURSOS_URL, allow_redirects=False)
tree = html.fromstring(page.content)
lis_query = '/html/body/div[1]/section/div/div[2]/div/section/ul/li'
materias = tree.xpath(lis_query)
for li_materia in materias:
nome_materia = li_materia.xpath('span/text()')[0]
yield nome_materia, li_materia
def cursos(self, nome_materia):
for materia in self.materias():
if materia[0] == nome_materia:
cursos = materia[1].xpath('ul/li')
for curso in cursos:
nome_curso = curso.xpath('span/text()')[0]
aulas_url = curso.xpath('span/a/@href')[0]
yield nome_curso, aulas_url
def aulas(self, aulas_url):
page = self._session.get(aulas_url, allow_redirects=False)
tree = html.fromstring(page.content)
aulas = tree.xpath('//div[@class="bloco-branco"]/ul/li')
for aula in aulas:
titulo_aula = aula.xpath('span/a/text()')[0]
data_aula = aula.xpath('div/div/@data-aula')[0]
mp4 = aula.xpath('div/div/a[@class="mp4 baixarMP4 "]')
pdf = aula.xpath('div/div/a[@class="pdf baixarPDF "]')
types = (
'mp4' if mp4 else '',
'pdf' if pdf else ''
)
yield {
'titulo_aula': titulo_aula,
'data_aula': data_aula,
'types': types
}
def baixarAula(self, data_aula, type, path=''):
response = self._session.post(DOWNLOAD_URL + type,
data={'id': data_aula})
json_response = json.loads(response.content.decode('utf-8'))
url = json_response['url']
response = self._session.get(json_response['url'], stream=True)
if response.status_code == 200:
nome_arquivo = url.split('/').pop()
return download(nome_arquivo, path, response)