Ir ao conteúdo

Posts recomendados

Postado

Estou enfrentando um problema com meu código em Python que abre várias páginas HTML e extrai elementos de uma classe específica, se existirem. O código funciona bem por algumas iterações, mas trava quando executado um número suficiente de vezes, sempre na mesma página HTML (7757). Curiosamente, se processar essa página individualmente, o código funciona sem problemas.

Esse problema tem me incomodado há algum tempo e não sei mais o que fazer. Já testei muitas abordagens. Se alguém já teve uma experiência semelhante, por favor, preciso de ajuda.

Ao tentar depurar, percebi que o código sempre trava dentro do pacote lxml, usado pelo requests_html. Pode ser um bug da biblioteca, mas o que explicaria o travamento apenas após algumas iterações?

Agradeceria muito qualquer ajuda. Esse problema tem tirado o meu sono.

O código é o seguinte:

 

import pandas as pd
import requests_html

def main():
    df_links = pd.read_csv('links.csv', index_col=0)

    session = requests_html.HTMLSession()

    try:
        for i in range(0, len(df_links.index)):
            url = df_links.iloc[i]['hyperlink']
            print(f"[{i}/{len(df_links.index)}]: {url}", flush=True)
            response = session.get(url)
            status_code = response.status_code
            if status_code == 200:
                response_html = response.html
                dateList = response_html.find('relative-time')
    except Exception as e:
        print("Something went wrong...", flush=True)

if __name__ == "__main__":
    main()

links.csv

Postado

tira do try except e me manda um print do erro levantado quando trava, se gerar erro.

 

você importou uma lib gigante igual o pandas só para ler uma lista de um arquivo de texto (.csv é um arquivo de texto) ?

 

 

 

Postado

nenhum erro é levantado, o código só fica parado. Então, esse trecho de código foi recortado de um código maior, por isso existe a importação do pandas.

Postado

Oi, acabei de testar sua sugestão. O código segue abaixo:

 

import os
from requests_html import HTML
import timeout_decorator

@timeout_decorator.timeout(100)
def extract_time(filepath):
    if os.path.isfile(filepath):
        with open(filepath, 'r', encoding='utf-8') as file:
            html_content = file.read()
    html = HTML(html=html_content)
    dateList = html.find('relative-time')
    
pasta = './files'
arquivos = sorted(os.listdir(pasta))

for filename in arquivos :
    filepath = os.path.join(pasta, filename)
    print(f"[{filename}]", flush=True)
    extract_time(filepath)

 

Ainda assim, o código ficou travado na iteração 7757 😞

Pedi a alguns amigos para testarem e travou com todos.

Postado

você colocou para 100 segundos? é obvio que vai ficar travado.

 

Estou com um pouco de pressa, então vou colocar um exemplo básico aqui, não testei e fiz diretamente aqui ent posso ter errado alguma sintaxe, de qualquer forma só tacar no gpt que ele corrige errinhos básicos de sintaxe.

Outra, lembre sempre de separar e modular seu código, senão fica uma macarronada.

import pandas as pd
import requests_html
import timeout_decorator

class RequestLogic:
	def __init__(self):
		self.session = requests_html.HTMLSession()

	@timeout_decorator.timeout(10) #limita a 10 segundos para o tempo de requisição
	def get_response(self, url):
		return self.session.get(url)

	def get_status_code(response):
		return response.status_code

	@timeout_decorator.timeout(10) #limita também a 10 segundos a tentativa de achar a classe
	def get_html_class(response, class_name):
		return response.html.find(class_name)

	

def main():
    df_links = pd.read_csv('links.csv', index_col=0)
	request_logic = RequestLogic()

    for link_tuple in range(0, len(df_links.index)):
            url = df_links.iloc[link_tuple]['hyperlink']
			try:

	            response = request_logic.get_response(url)

			Except Exception as e:
				...
				#aqui faz o que tiver de fazer se a requisição falhar

			status_code = request_logic.get_status_code(response)

            if status_code == 200:
				try:
                dateList = request_logic.get_html_class(response, "relative-time")
				except Exception as e:
					...
					#aqui você trata os erros de não achar a classe


if __name__ == "__main__":
    main()

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!