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?
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:
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 buclewhile
que sigue extrayendo páginas y almacenando datos enreports_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 listareport_data
a la listareports_data
.Finalmente, después de extraer todos los informes, he creado un marco de datos pandas
df
a partir de la lista de listasreports_data
, y luego he escritodf
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 establecidoindex=False
en el métodoto_csv
para evitar imprimir la columna de índice predeterminada en el archivo CSV.