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 fecha
miFecha = re.sub(",","",miFecha)
miFecha = miFecha.split(" ")
# Obtenemos el numero del mes
mes = m[miFecha[3].lower()]
# Obtenemos el dia
dia = miFecha[1]
# Obtenemos el año
year = str(datetime.datetime.now().year)
fecha = year+"/"+mes+"/"+dia
return fecha
def limpiarDatos(datos):
# Eliminar % y °
datos = re.sub('[%°]','',datos)
# Eliminar cm, mm y hPa
datos = re.sub('[cmh][mP][a]?','',datos)
# Eliminar km/h
datos = re.sub('[k][m][/][h]','',datos)
# Eliminar tabulaciones y saltos de linea
datos = re.sub(r'[\n\t]', "", datos)
# Eliminar múltiples espacios
datos = 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último
if 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 registros
for 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 = 0
for 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 = []
#Horas
horas = 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)
#Previsiones
previsiones = 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)
#Velocidades
velocidades = 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)
#Rachas
rachas = [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)
#Lluvias
lluvias = [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)
#Nieves
nieves = [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)
#Nubes
nubes = [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)
#Tormentas
tormentas = [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, Visibilidad
registros = [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 listas
horasCapitales, previsionesCapitales, velocidadesCapitales, rachasCapitales, lluviasCapitales, nievesCapitales, nubesCapitales, tormentasCapitales, registrosCapitales = ([] for i in range(9))
for capital in capitales:
# URL a la que hacer scraping
page_link = 'https://www.eltiempo.es/' + capital + '.html?v=por_hora'
# Respuesta devuelta por requests
page_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