Ayuda código Python Scraping
Publicado por Jhony (1 intervención) el 03/07/2020 12:33:58
Buenos días.
Solicito por favor su ayuda, tengo el siguiente código python para hacer scraping a una web, el código precisamente lo he encontrado en la librería github, el problema que tengo es que lo copio y lo ejecuto en mi consola, el resultado debería ser un archivo csv totalmente relleno de datos, pero se me esta generando vacío. Alguien podría por favor decirme como puedo arreglarlo. De ante mano muchas gracias.
El código lo baje de este link: https://github.com/MLaburu/Prac1-Web-Scraping/blob/master/scraping.py
scraping.py
```
Solicito por favor su ayuda, tengo el siguiente código python para hacer scraping a una web, el código precisamente lo he encontrado en la librería github, el problema que tengo es que lo copio y lo ejecuto en mi consola, el resultado debería ser un archivo csv totalmente relleno de datos, pero se me esta generando vacío. Alguien podría por favor decirme como puedo arreglarlo. De ante mano muchas gracias.
El código lo baje de este link: https://github.com/MLaburu/Prac1-Web-Scraping/blob/master/scraping.py
scraping.py
```
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
from bs4 import BeautifulSoup
import datetime
import requests
import csv
import re
capitales = ['a-coruna', 'albacete', 'alicante', 'almeria', 'avila', 'badajoz', 'barcelona', 'bilbao', 'burgos', 'caceres', 'cadiz', 'castellon-de-la-plana', 'ciudad-real', 'cordoba', 'cuenca', 'girona', 'granada', 'guadalajara', 'huelva', 'huesca', 'jaen', 'las-palmas-de-gran-canaria', 'leon', 'lleida', 'logroño', 'lugo', 'madrid', 'malaga', 'murcia', 'ourense', 'oviedo', 'palencia', 'palma-de-mallorca', 'pamplona', 'pontevedra', 'salamanca', 'san-sebastian', 'santa-cruz-de-tenerife', 'santander', 'segovia', 'sevilla', 'soria', 'tarragona', 'teruel', 'toledo', 'valencia', 'valladolid', 'vitoria', 'zamora', 'zaragoza']
def modificarFecha(miFecha):
m = {
'enero': "01",
'febrero': "02",
'marzo': "03",
'abril': "04",
'mayo': "05",
'junio': "06",
'julio': "07",
'agosto': "08",
'septiembre': "09",
'octubre': "10",
'noviembre': "11",
'diciembre': "12"
} # Separamos el contenido de la fechamiFecha = re.sub(",","",miFecha)
miFecha = miFecha.split(" ")
# Obtenemos el numero del mesmes = m[miFecha[3].lower()]
# Obtenemos el diadia = miFecha[1]
# Obtenemos el añoyear = str(datetime.datetime.now().year)
fecha = year+"/"+mes+"/"+dia
return fecha
def limpiarDatos(datos):
# Eliminar % y °datos = re.sub('[%°]','',datos)
# Eliminar cm, mm y hPadatos = re.sub('[cmh][mP][a]?','',datos)
# Eliminar km/hdatos = re.sub('[k][m][/][h]','',datos)
# Eliminar tabulaciones y saltos de lineadatos = re.sub(r'[\n\t]', "", datos)
# Eliminar múltiples espaciosdatos = re.sub(' +',' ',datos)
return datos
def limpiarRegistros(registros):
for i in range(len(registros)):
# Si es el primer elemento de la lista, eliminar el antepenúltimoif i == 0:
registros[i].pop(len(registros[i])-4)
# De lo contrario, borrar el último elemento else:registros[i].pop(len(registros[i])-1)
return registros
def preprocesarRegistros(registros):
"""Funcion que se encarga de limpiar la lista que se obtiene de múltiples registros"""
l = []
l2 = []
# Dividir la lista en listas en función de los registrosfor i in range(len(registros)):
if registros[i] != "Humedad":
l2.append(limpiarDatos(registros[i]))
else:if l2 != []:
l.append(l2)
l2 = []
l2.append('Humedad')
if i == len(registros)-1:
l.append(l2)
l = limpiarRegistros(l)
return l
def saveCSV(dias, horasCapitales, previsionesCapitales, velocidadesCapitales, rachasCapitales, lluviasCapitales, nievesCapitales, nubesCapitales, tormentasCapitales, registrosCapitales):
"""Función que guarda en un csv los registros obtenidos mediante scraping"""
with open("SpanishCapitalsForecast.csv", 'w', encoding='utf8') as mycsv:
wr = csv.writer(mycsv)
wr.writerow(['Ciudad','Dia (AAAA/MM/DD)','Hora','Previsión (°C)','Velocidad (km/h)','Rachas (km/h)','Lluvias (mm)','Nieve (cm)','Nubes (%)','Tormenta (%)','Humedad (%)','Presión (hPa)','Sensación térmica (°C)','Prob. precipitación (%)','Hora observación', 'Visibilidad'])
for j in range(len(capitales)):
z = 0for i in range(len(horasCapitales[j])):
if horasCapitales[j][i] == '00:00':
z = z + 1
registro = registrosCapitales[j][i]
if i == 0:
wr.writerow([capitales[j], dias[z], horasCapitales[j][i], previsionesCapitales[j][i], velocidadesCapitales[j][i], rachasCapitales[j][i], lluviasCapitales[j][i], nievesCapitales[j][i], nubesCapitales[j][i], tormentasCapitales[j][i], registro[1], registro[3], registro[7], 'NULL', registro[5], registro[9]])
else:if 'Prob. de precipitación' in registro:
wr.writerow([capitales[j], dias[z], horasCapitales[j][i], previsionesCapitales[j][i], velocidadesCapitales[j][i], rachasCapitales[j][i], lluviasCapitales[j][i], nievesCapitales[j][i], nubesCapitales[j][i], tormentasCapitales[j][i], registro[1], registro[3], registro[7], registro[5], 'NULL', 'NULL'])
else:wr.writerow([capitales[j], dias[z], horasCapitales[j][i], previsionesCapitales[j][i], velocidadesCapitales[j][i], rachasCapitales[j][i], lluviasCapitales[j][i], nievesCapitales[j][i], nubesCapitales[j][i], tormentasCapitales[j][i], registro[1], registro[3], registro[5], 'NULL', 'NULL', 'NULL'])
def getCapitalRegistros(page_content):
"""Funcion que obtiene todos los registros de una capital"""
resultado = []
#Horashoras = page_content.findAll('div',attrs={"class":"m_table_weather_hour_detail_hours"})
horas = [hora.text for hora in horas if hora.text != 'Horas']
resultado.append(horas)
#Previsionesprevisiones = page_content.findAll('div',attrs={"class":"m_table_weather_hour_detail_pred"})
previsiones = [limpiarDatos(prevision.text) for prevision in previsiones if prevision.text != 'Previsión']
resultado.append(previsiones)
#Velocidadesvelocidades = page_content.findAll('div',attrs={"class":"m_table_weather_hour_detail_med"})
velocidades = [limpiarDatos(velocidad.text) for velocidad in velocidades if velocidad.text != 'Velocidad']
resultado.append(velocidades)
#Rachasrachas = [limpiarDatos(racha.text) for datos in page_content.findAll('div',attrs={"class":"m_table_weather_hour_detail_gust m_table_weather_hour_detail_child_mobile"}) for racha in datos.findAll('span') if racha.text != "Rachas"]
resultado.append(rachas)
#Lluviaslluvias = [limpiarDatos(lluvia.text) for datos in page_content.findAll('div',attrs={"class":"m_table_weather_hour_detail_rain m_table_weather_hour_detail_child_mobile"}) for lluvia in datos.findAll('span') if lluvia.text != "Lluvias"]
resultado.append(lluvias)
#Nievesnieves = [limpiarDatos(nieve.text) for datos in page_content.findAll('div',attrs={"class":"m_table_weather_hour_detail_snow m_table_weather_hour_detail_child_mobile"}) for nieve in datos.findAll('span') if nieve.text != "Nieve"]
resultado.append(nieves)
#Nubesnubes = [limpiarDatos(nube.text) for datos in page_content.findAll('div',attrs={"class":"m_table_weather_hour_detail_clouds m_table_weather_hour_detail_child_mobile"}) for nube in datos.findAll('span') if nube.text != "Nubes"]
resultado.append(nubes)
#Tormentastormentas = [limpiarDatos(tormenta.text) for datos in page_content.findAll('div',attrs={"class":"m_table_weather_hour_detail_thunder m_table_weather_hour_detail_child_mobile"}) for tormenta in datos.findAll('span') if tormenta.text != "Tormenta"]
resultado.append(tormentas)
#Humedad, Presion, Sensacion terminca, Prob. precipitación, Hora observación, Visibilidadregistros = [datosInternos.text for datos in page_content.findAll('div', attrs={"class":"m_table_weather_hour_detail_child"}) for datosInternos in datos.findAll('span')]
registros = preprocesarRegistros(registros)
resultado.append(registros)
return resultado
def getDias(page_content):
"""Función que obtiene el campo dias de cada registro"""
dias = []
for i in range(0, 4):
dia = page_content.find_all("h2")[i].text
dias.append(modificarFecha(dia))
return dias
# Inicializar listashorasCapitales, previsionesCapitales, velocidadesCapitales, rachasCapitales, lluviasCapitales, nievesCapitales, nubesCapitales, tormentasCapitales, registrosCapitales = ([] for i in range(9))
for capital in capitales: # URL a la que hacer scrapingpage_link = 'https://www.eltiempo.es/' + capital + '.html?v=por_hora'
# Respuesta devuelta por requestspage_response = requests.get(page_link, timeout=5)
# Contenido html de la URL solicitada…
- Prac1-Web-Scraping-master.zip(254,5 KB)
Valora esta pregunta


0
