forked from DaviMarta/Automatiza-o
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Web-Scraping Google Maps #1.py
161 lines (121 loc) · 5.89 KB
/
Web-Scraping Google Maps #1.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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#importar pacotes necessários
import pandas as pd
import geopandas as gpd
import requests
import json
import shapely
import fiona
from pyproj import Proj, transform, Transformer
from sqlalchemy import create_engine
import psycopg2
import geoalchemy2
keywords = ["loja de roupa","mecanica","sapato","suplemento","odontologia", "dentista","mercado","ortopetista","farmacia","acabamento","sacola"]
for keyword in keywords:
def csv_to_point(non_spatial_data):
#crie o geodataframe e exporte-o como um arquivo de ponto
del non_spatial_data['Tags']
spatial_df = gpd.GeoDataFrame(non_spatial_data, geometry=gpd.points_from_xy(non_spatial_data.Longitude, non_spatial_data.Latitude))
#spatial_df.to_csv("point_data.csv")
print(spatial_df)
#spatial_df.to_file("point_data.shp")
#create a projection file that corresponds to where data was taken from
#prj = open("point_data.prj", "w")
epsg = 'GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]]'
#prj.write(epsg)
#prj.close()
return(spatial_df)
def find_locations(search_url, api_key):
#lista de listas para todos os dados
final_data = []
#while loop para solicitar e analisar os arquivos JSON solicitados
while True:
respon = requests.get(search_url)
jj = json.loads(respon.text)
results = jj['results']
#analise todas as informações necessárias
for result in results:
name = result['name']
place_id = result ['place_id']
lat = result['geometry']['location']['lat']
longi = result['geometry']['location']['lng']
rating = result['rating']
types = result['types']
data = [name, place_id, lat, longi, rating, types]
final_data.append(data)
#se houver uma próxima página, o loop será reiniciado com uma url atualizada
#se não houver próxima página, o programa grava em um csv e salva em df
if 'next_page_token' not in jj:
labels = ['Place Name','ID_Field', 'Latitude', 'Longitude', 'Rating', 'Tags']
location_df = pd.DataFrame.from_records(final_data, columns=labels)
#location_df.to_csv('location.csv')
break
else:
next_page_token = jj['next_page_token']
search_url = 'https://maps.googleapis.com/maps/api/place/nearbysearch/json?key='+str(api_key)+'&pagetoken='+str(next_page_token)
return(final_data, location_df)
def find_details(final_data, api_key):
final_detailed_data =[]
#Usa o ID exclusivo de cada local para usar outra solicitação de API para obter informações de telefone e site de cada empresa.
for places in final_data:
id_field = places[1]
req_url = 'https://maps.googleapis.com/maps/api/place/details/json?place_id='+str(id_field)+'&fields=name,formatted_phone_number,website&key='+str(api_key)
respon = requests.get(req_url)
jj = json.loads(respon.text)
print(jj)
results = jj['result']
identification = id_field
try:
phone = results["formatted_phone_number"]
except KeyError:
continue
try:
website = results["website"]
except KeyError:
continue
title = results["name"]
detailed_data = [title, identification, phone, website]
final_detailed_data.append(detailed_data)
columns = ["Business", "ID_Field","Phone", "Website"]
details_df = pd.DataFrame.from_records(final_detailed_data, columns=columns)
details_df.to_csv('further_details.csv')
return details_df
def join_data(details_df,location_df):
final_sheet = location_df.join(details_df.set_index('ID_Field'), on='ID_Field')
final_sheet.to_csv(str(keyword) + ".csv")
print(final_sheet)
return final_sheet
def main():
#assigning Parâmetros para pesquisa de localização
api_key = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
search_radius = '100000'
coords = '-X.XXXXXXXXXXXXXXXXXX, -X.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
request_url = 'https://maps.googleapis.com/maps/api/place/nearbysearch/json?location='+coords+'&radius='+str(search_radius)+'&keyword='+str(keyword)+'&key='+str(api_key)
#encontre os locais dos estabelecimentos desejados no google maps
final_data, location_df = find_locations(request_url, api_key)
#encontre site, telefone e avaliações de estabelecimentos
details_df = find_details(final_data, api_key)
#junte os dois dataframes para ter um produto final
non_spatial_data = join_data(details_df,location_df)
#c
spatial_df = csv_to_point(non_spatial_data)
if __name__ == "__main__":
main()
import os
import pandas as pd
path = r ""#COLOCAR O LOCAL ONDE ESTÁ OS EXCELS SALVOS
# use compreensão de lista para criar uma lista de arquivos csv
csv_files = [file for file in os.listdir(path) if file.endswith('.csv')]
# cria uma lista vazia para armazenar os DataFrames
df_list = []
# iterar pelos arquivos csv
for csv_file in csv_files:
# lê o arquivo csv atual em um DataFrame
df = pd.read_csv(os.path.join(path, csv_file))
# adiciona uma nova coluna 'file_name' com o nome do arquivo csv atual
df['name'] = os.path.basename(csv_file)
# anexa o DataFrame atual à lista
df_list.append(df)
# concatenar todos os DataFrames em um único DataFrame
merged_df = pd.concat(df_list)
# grava o DataFrame mesclado em um novo arquivo csv
merged_df.to_excel("all.xlsx", index=False)