es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo recorrer varias páginas de un sitio web utilizando Scrapy.

¡Hola a todos!
He estado trabajando con BeautifulSoup para mis proyectos de scraping. Actualmente, estoy aprendiendo Scrapy. He escrito un código en BeautifulSoup para recorrer varias páginas de un sitio web usando bucles for. Recorrí 10 páginas y obtuve las URL de las entradas de blog de esas páginas utilizando el siguiente código. Quiero hacer lo mismo en Scrapy pero no puedo entender cómo. ¿Se puede utilizar el mismo enfoque (código) con Scrapy para hacer lo mismo?
Aquí está el código de BeautifulSoup:

URL = ‘https://www.brookings.edu/topic/environment/page/’
lis=[]
for page in range(1, 10):
req = requests.get(URL + str(page) + ‘/?type=posts’)
soup = BeautifulSoup(req.text, ‘lxml’)
links = [link[‘href’] for link in soup.find_all(‘a’, href=re.compile(‘^(https://www.brookings.edu/blog/)’))]
links = list(set(links))
lis.append(links)

Este fragmento de código obtuvo los enlaces de 10 páginas del sitio web. Almacené estos enlaces (enlaces de entradas de blog) en la lista llamada “lis” fuera del bucle for. Luego, con otro bucle for en esa lista final, escribí mi código para extraer el texto de las entradas de blog.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, el mismo enfoque se puede utilizar con Scrapy para lograr el mismo resultado de obtener enlaces de múltiples páginas de un sitio web. En Scrapy, crearías una araña que rastree el sitio web y extraiga la información deseada, como los enlaces. Una implementación de ejemplo de Scrapy del código BeautifulSoup anterior se vería así:

    import scrapy
    
    class LinkSpider(scrapy.Spider):
        name = "link_spider"
        start_urls = ['https://www.brookings.edu/topic/environment/page/']
    
        def parse(self, response):
            links = response.css('a[href^="https://www.brookings.edu/blog/"]::attr(href)').getall()
            for link in links:
                yield {'link': link}
    
            next_page = response.css('.more a[href^="/topic/environment/page/"]::attr(href)').get()
            if next_page is not None:
                yield response.follow(next_page, self.parse)
    

    Aquí, name define el nombre de la araña, start_urls define la(s) URL(s) iniciales desde las cuales comenzar a rastrear, y parse es el método que se llamará para cada respuesta que la araña reciba. En parse, primero extraemos los enlaces de la página utilizando los selectores CSS integrados de Scrapy. El selector ::attr(href) extrae solo el atributo href de las etiquetas a que coinciden con la regla CSS dada. Luego, generamos un diccionario que contiene el enlace extraído.

    A continuación, buscamos el enlace a la siguiente página del sitio web utilizando otro selector CSS. Si se encuentra un enlace a la próxima página, lo seguimos llamando a response.follow con el enlace y el método parse como argumentos. Esto hará que Scrapy envíe una nueva solicitud a la próxima página y llame a parse con la respuesta de esa página.

    Es importante destacar que en Scrapy no es necesario usar requests para enviar solicitudes HTTP. Scrapy proporciona su propio mecanismo para realizar solicitudes y manejar respuestas, que se encarga de muchas cosas como el manejo de cookies, el seguimiento de redirecciones, etc.

Comments are closed.