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.

Forma de poblar un archivo .csv con datos raspados en Python con pandas que sea más cercana a “print”

Logré raspar múltiples páginas y puedo imprimir mis resultados correctamente con:

import requests
from bs4 import BeautifulSoup
import pandas as pd

url = ‘https://www.marketresearch.com/search/results.asp?qtype=2&datepub=3&publisher=Technavio&categoryid=0&sortby=r’

def scrape_it(url):
page = requests.get(url)
soup = BeautifulSoup(page.text, ‘html.parser’)

NextUrl = soup.find_all(class_="standardLinkDkBlue")[-1]['href']
stri = soup.find_all(class_="standardLinkDkBlue")[-1].string
html_text = requests.get(NextUrl).text
reports = soup.find_all('tr', class_='SearchTableRowAlt')
for report in reports:
    title = report.find('a', class_='linkTitle').text
    price = report.find('div', class_='resultPrice').text
    date_author = report.find('div', class_='textGrey').text
    detail_link = report.a['href']

print(f'''
{title}
{price}
{date_author}
{detail_link}
''')

Ahora, para insertar esto en .csv, estoy tratando de crear una matriz en lugar de imprimir, así que reemplazo print(f”’…”’) con:

final_res = [title, price, date_author, detail_link]
df = pd.DataFrame(final_res)
df.to_csv(‘results-tech.csv’)

Bueno, funciona para el primer resultado (coloca la salida en 4 filas de .csv), pero la ‘print’ extrajo datos de todos los informes (más de 250 de ellos) y todas las páginas.

¿Cómo puedo hacer esto para obtener los datos correctos y completos escritos en mi .csv?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para obtener todos los datos obtenidos escritos en un archivo CSV, es necesario modificar el código para crear una lista de listas que contenga los datos de cada informe. Luego puedes crear un marco de datos pandas a partir de la lista de listas y escribirlo en un archivo CSV. Así es como puedes modificar tu código:

    import requests
    from bs4 import BeautifulSoup
    import pandas as pd
    
    url = 'https://www.marketresearch.com/search/results.asp?qtype=2&datepub=3&publisher=Technavio&categoryid=0&sortby=r'
    
    def scrape_it(url):
        reports_data = []  # crear una lista vacía para almacenar los datos de todos los informes
    
        while url:  # iterar sobre todas las páginas
            page = requests.get(url)
            soup = BeautifulSoup(page.text, 'html.parser')
    
            NextUrl = soup.find_all(class_="standardLinkDkBlue")[-1]['href']
            url = NextUrl if NextUrl != '#' else None  # establecer url a None si llega a la última página
    
            reports = soup.find_all('tr', class_='SearchTableRowAlt')
            for report in reports:
                title = report.find('a', class_='linkTitle').text
                price = report.find('div', class_='resultPrice').text
                date_author = report.find('div', class_='textGrey').text
                detail_link = report.a['href']
    
                report_data = [title, price, date_author, detail_link]  # crear una lista que contenga los datos de un informe
                reports_data.append(report_data)  # agregar la lista a la lista principal
    
        df = pd.DataFrame(reports_data, columns=['Title', 'Price', 'Date/Author', 'Detail Link'])  # crear un marco de datos a partir de lista de listas
        df.to_csv('results-tech.csv', index=False)  # escribir el marco de datos en el archivo CSV
    
    scrape_it(url)
    

    En este código modificado, he creado una lista vacía reports_data para almacenar los datos de todos los informes. Luego he agregado un bucle while que sigue extrayendo páginas y almacenando datos en reports_data hasta que no haya más páginas para extraer (NextUrl es '#' para la última página).

    Dentro del bucle, he creado una lista report_data para almacenar los datos de un informe. Después de extraer datos para un informe, he agregado su lista report_data a la lista reports_data.

    Finalmente, después de extraer todos los informes, he creado un marco de datos pandas df a partir de la lista de listas reports_data, y luego he escrito df en un archivo CSV.

    Ten en cuenta que también he agregado nombres de columnas (['Title', 'Price', 'Date/Author', 'Detail Link']) al marco de datos para que el archivo CSV tenga encabezados de columna adecuados. También he establecido index=False en el método to_csv para evitar imprimir la columna de índice predeterminada en el archivo CSV.

Comments are closed.