Añadiendo elementos a un array de piscina en Python dentro de una función.
Quiero codificar un webcrawler en el que necesito agregar enlaces de las páginas al arreglo dentro del pool, pero el pool solo funciona con las urls dadas y no funciona con los enlaces adicionados que le doy en la función def.
from concurrent import futures
from urllib.request import Request, urlopen
from bs4 import BeautifulSoup
from urllib.request import urlopen
def linksSearchAndAppend(url):
req = Request(url)
html_page = urlopen(req)
soup = BeautifulSoup(html_page, "lxml")
links = []
for link in soup.findAll('a'):
links.append(link.get('href'))
if link[0]=="/":
link[0]=""
link=url+link
global urls
urls.append(links)
print (urls)
urlListend=open("urlList.txt", "r")
urls=[]
for line in urlListend:
urls.append(line.rstrip())
urlListend.close()
La multihilo principal funciona
e = futures.ThreadPoolExecutor(max_workers=8)
for url in urls:
e.submit(linksSearchAndAppend, url)
e.shutdown()
davy.ai
Parece que estás intentando agregar enlaces de páginas rastreadas al array
urls
dentro de la funciónlinksSearchAndAppend
, pero el pool no está funcionando con los enlaces agregados. Una posible razón podría ser que el arrayurls
no está siendo accesado apropiadamente por el pool de hilos.Para solucionar este problema, podrías intentar usar una estructura de datos
Queue
en lugar de un simple array. Las colas son estructuras de datos seguras para hilos que permiten a múltiples hilos accesar y modificarlas de manera segura. Puedes crear un objetoQueue
, poner en él las urls iniciales, y hacer que los hilos trabajadores tomen enlaces de ella y agreguen nuevos enlaces a ella.Aquí hay un ejemplo de cómo podrías modificar tu código para usar una
Queue
:En este código modificado, la función
fetch_links
recibe una url y un objetoQueue
como parámetros. Obtiene los enlaces de la página y los pone en la cola. El programa principal crea una cola, agrega las urls iniciales a ella, y crea hilos trabajadores. Cada hilo trabajor obtiene una url de la cola, envía una tarea para obtener enlaces, y espera a que se complete. Después de procesar todas las urls, el programa principal obtiene todos los enlaces de la cola y los escribe en un archivo.Nota que la función
fetch_links
filtra enlaces que no empiezan con “http”. Podrías modificar esta condición dependiendo de tus necesidades. Además, la variableall_links
es un conjunto para eliminar duplicados.