Agora podemos começar a escrever o código. Para construir o nosso rastreador, seguiremos um fluxo recursivo para aceder a todos os links que encontrarmos. Mas primeiro, vamos definir o nosso ponto de entrada:
def crawl(url, filename):
page_body = get_page_source(url, filename)
soup = BeautifulSoup(page_body, 'html.parser')
start_crawling(soup)
crawl(FULL_START_URL, 'ecoroots.txt')
Implementamos a função crawl, que irá extrair os documentos HTML através do nosso procedimento get_page_source. Em seguida, irá construir o objeto BeautifulSoup que facilitará a nossa análise e chamar a função start_crawling, que dará início à navegação no site.
def get_page_source(url, filename):
driver.get(url)
soup = BeautifulSoup(driver.page_source, 'html.parser')
body = soup.find('body')
file_source = open(filename, mode='w', encoding='utf-8')
file_source.write(str(body))
file_source.close()
return str(body)
Conforme mencionado anteriormente, a função get_page_source utilizará o Selenium para obter o conteúdo HTML do site e gravará num ficheiro de texto a secção <body>, uma vez que é esta que contém todos os links internos que nos interessam.
unique_links = {}
def start_crawling(soup):
links = soup.find_all(lambda tag: is_internal_link(tag))
for link in links:
link_href = link.get('href')
if not link_href in unique_links.keys() or unique_links[link_href] == 0:
unique_links[link_href] = 0
link_url = BASE_URL + link_href
link_filename = link_href.replace(SECTION + '/products/', '') + '.txt'
crawl(link_url, link_filename)
unique_links[link_href] = 1
Esta é a lógica principal do rastreador. Assim que receber o objeto BeautifulSoup, irá extrair todos os links internos. Fazemos isso utilizando uma função lambda, com algumas condições que definimos na função is_internal_link:
def is_internal_link(tag):
if not tag.name == 'a': return False
if tag.get('href') is None: return False
if not tag.get('href').startswith(SECTION + '/products'): return False
return True
Isto significa que, para cada elemento HTML que encontramos, verificamos primeiro se é uma tag <a>, se tem um atributo href e, em seguida, se o valor do atributo href contém um link interno.
Depois de obtermos a lista de links, percorremos cada um deles, construímos a URL completa e extraímos o nome do produto. Com estes novos dados, temos um novo site que passamos para a função de rastreamento a partir do nosso ponto de entrada, pelo que o processo recomeça do início.
Mas e se encontrarmos um link que já visitámos? Como evitamos um ciclo infinito? Bem, para esta situação, temos a estrutura de dados unique_links. Para cada link que iteramos, verificamos se já foi acedido antes de começarmos a rastreá-lo. Se for novo, basta marcá-lo como visitado assim que o rastreamento estiver concluído.
Assim que executar o seu script, o rastreador começará a navegar pelos produtos do site. Pode demorar alguns minutos, dependendo do tamanho do site que escolher. Por fim, deverá agora ter um conjunto de ficheiros de texto que conterão o HTML de todas as páginas que o seu rastreador visitar.