Skip to content

Commit 475336f

Browse files
committed
add get_images
1 parent 56711b8 commit 475336f

File tree

5 files changed

+191
-31
lines changed

5 files changed

+191
-31
lines changed

GoogleMapspy/R.md

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -571,4 +571,66 @@ var = {4: {'id': 4,
571571
```
572572
'0x14f9e3054ae0727f:0xde8f78c8fa6ac846'
573573
1511488761830077055:16037169602679720006
574+
```
575+
576+
```
577+
578+
https://www.google.com/maps/preview/photo?authuser=0&hl=ar&gl=eg&pb=!1e2!3m3!1s0x14f9e7860c2edadf%3A0xe7ee7daab22713f!9e0!11s%2Fg%2F11rn4ndyt8!5m50!2m2!1i203!2i100!3m2!2i20!5b1!7m42!1m3!1e1!2b0!3e3!1m3!1e2!2b1!3e2!1m3!1e2!2b0!3e3!1m3!1e8!2b0!3e3!1m3!1e10!2b0!3e3!1m3!1e10!2b1!3e2!1m3!1e9!2b1!3e2!1m3!1e10!2b0!3e3!1m3!1e10!2b1!3e2!1m3!1e10!2b0!3e4!2b1!4b1!9b0!6m3!1sfBnWZJe_L5GjkdUPnfi7-AQ!7e81!15i16698!16m2!2b1!4e1
579+
https://www.google.com/maps/preview/photo?authuser=0&hl=ar&gl=eg&pb=!1e2!3m3!1s0x14f9e7860c2edadf:0xe7ee7daab22713f!9e0!11s/g/11rn4ndyt8!5m50!2m2!1i203!2i100!3m2!2i20!5b1!7m42!1m3!1e1!2b0!3e3!1m3!1e2!2b1!3e2!1m3!1e2!2b0!3e3!1m3!1e8!2b0!3e3!1m3!1e10!2b0!3e3!1m3!1e10!2b1!3e2!1m3!1e9!2b1!3e2!1m3!1e10!2b0!3e3!1m3!1e10!2b1!3e2!1m3!1e10!2b0!3e4!2b1!4b1!9b0!6m3!1sfBnWZJe_L5GjkdUPnfi7-AQ!7e81!15i16698!16m2!2b1!4e1
580+
581+
!1e2!3m3!1s0x14f9e7860c2edadf:0xe7ee7daab22713f!9e0!11s/g/11rn4ndyt8!5m50!2m2!1i203!2i100!3m2!2i20!5b1!7m42!1m3!1e1!2b0!3e3!1m3!1e2!2b1!3e2!1m3!1e2!2b0!3e3!1m3!1e8!2b0!3e3!1m3!1e10!2b0!3e3!1m3!1e10!2b1!3e2!1m3!1e9!2b1!3e2!1m3!1e10!2b0!3e3!1m3!1e10!2b1!3e2!1m3!1e10!2b0!3e4!2b1!4b1!9b0!6m3!1sfBnWZJe_L5GjkdUPnfi7-AQ!7e81!15i16698!16m2!2b1!4e1
582+
583+
{1: {'id': 1, 'type': 'enum (as integer)', 'value': 2},
584+
3: {'id': 3,
585+
'length': 3,
586+
'type': 'matrix',
587+
'value': {1: {'id': 1,
588+
'type': 'string',
589+
'value': '0x14f9e7860c2edadf:0xe7ee7daab22713f'},
590+
9: {'id': 9, 'type': 'enum (as integer)', 'value': 0},
591+
11: {'id': 11, 'type': 'string', 'value': '/g/11rn4ndyt8'}}},
592+
5: {'id': 5,
593+
'length': 50,
594+
'type': 'matrix',
595+
'value': {2: {'id': 2,
596+
'length': 2,
597+
'type': 'matrix',
598+
'value': {1: {'id': 1, 'type': 'integer', 'value': 203},
599+
2: {'id': 2, 'type': 'integer', 'value': 100}}},
600+
3: {'id': 3,
601+
'length': 2,
602+
'type': 'matrix',
603+
'value': {2: {'id': 2, 'type': 'integer', 'value': 20},
604+
5: {'id': 5, 'type': 'boolean', 'value': True}}},
605+
7: {'id': 7,
606+
'length': 42,
607+
'type': 'matrix',
608+
'value': {1: {'id': 1,
609+
'length': 3,
610+
'type': 'matrix',
611+
'value': {1: {'id': 1,
612+
'type': 'enum (as integer)',
613+
'value': 10},
614+
2: {'id': 2,
615+
'type': 'boolean',
616+
'value': True},
617+
3: {'id': 3,
618+
'type': 'enum (as integer)',
619+
'value': 4}}},
620+
2: {'id': 2, 'type': 'boolean', 'value': True},
621+
4: {'id': 4, 'type': 'boolean', 'value': True}}},
622+
9: {'id': 9, 'type': 'boolean', 'value': True}}},
623+
6: {'id': 6,
624+
'length': 3,
625+
'type': 'matrix',
626+
'value': {1: {'id': 1,
627+
'type': 'string',
628+
'value': 'fBnWZJe_L5GjkdUPnfi7-AQ'},
629+
7: {'id': 7, 'type': 'enum (as integer)', 'value': 81},
630+
15: {'id': 15, 'type': 'integer', 'value': 16698}}},
631+
16: {'id': 16,
632+
'length': 2,
633+
'type': 'matrix',
634+
'value': {2: {'id': 2, 'type': 'boolean', 'value': True},
635+
4: {'id': 4, 'type': 'enum (as integer)', 'value': 1}}}}
574636
```

GoogleMapspy/google_maps.py

Lines changed: 78 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from GoogleMapspy.function import get_1d, country_suffix_dict
88
from GoogleMapspy.var import Place, Review
99
from urllib.parse import quote
10+
from urllib.parse import urlparse, parse_qs, unquote
1011

1112
ua = UserAgent()
1213

@@ -26,6 +27,32 @@ def __init__(self, latitude: str = "", longitude: str = "", lang: str = "en", co
2627
self.places = []
2728
self.reviews = []
2829

30+
def get_images(self, ids=[]):
31+
if ids:
32+
id1, id2 = ids
33+
else:
34+
raise
35+
self.__set_latitude()
36+
r = self.session.request("GET", self._get_images_url(id1_=id1, id2_=id2), headers=self.headers)
37+
r.raise_for_status()
38+
list_data = json.loads(r.text[5:])
39+
images = []
40+
l = []
41+
for image in list_data[0]:
42+
l.append(image[6][0])
43+
var = {"name": "all_image", "images": l}
44+
images.append(var)
45+
46+
for cat in list_data[12][0]:
47+
l = []
48+
for image in cat[3]:
49+
if len(image) > 6:
50+
l.append(image[6][0])
51+
var = {"name": cat[2], "images": l}
52+
images.append(var)
53+
54+
return images
55+
2956
def get_reviews(self, ids=[], url="", clear_old=True, streem=True, sleep_time: int = 5):
3057
if ids:
3158
id1, id2 = ids
@@ -62,30 +89,49 @@ def get_reviews(self, ids=[], url="", clear_old=True, streem=True, sleep_time: i
6289
return self.reviews
6390

6491
@staticmethod
65-
def __get_ids_from_url(url):
66-
res = re.findall(r"!1s(.*):(.*)!8", url)
92+
def __get_ids_from_url(url, hex_=False):
93+
if not hex_:
94+
res = re.findall(r"1s(\w+):(\w+)!", url)
95+
96+
if res:
97+
return [int(res[0][0], 16), int(res[0][1], 16)]
98+
return ["", ""]
99+
else:
100+
res = re.findall(r"s(\w+:\w+)!", url)
101+
if res:
102+
return res[0]
103+
104+
@staticmethod
105+
def __get_name_from_url(url):
106+
res = re.findall(r"/place/(.*)/@", url)
67107
if res:
68-
return [int(res[0][0], 16), int(res[0][1], 16)]
69-
return ["", ""]
108+
return res[0]
109+
return ""
70110

71-
def get_place(self, keyword, offset=0, p=100):
111+
def get_place(self, keyword="", url="", offset=0, p=100):
72112
self.__set_latitude(keyword)
73-
r = self.session.request("GET", self._url_search(keyword, p, offset), headers=self.headers)
74-
r.raise_for_status()
113+
if keyword:
114+
r = self.session.request("GET", self._url_search(keyword, p, offset), headers=self.headers)
115+
r.raise_for_status()
75116

76-
list_data = json.loads(r.text[5:])
117+
list_data = json.loads(r.text[5:])
77118

78-
data, type_ = self.__prepare_data(list_data)
79-
if type_ == "place":
80-
place = Place(data[14])
81-
elif type_ == "list":
82-
place = Place(data[0][14])
119+
data, type_ = self.__prepare_data(list_data)
120+
if type_ == "place":
121+
place = Place(data[14])
122+
elif type_ == "list":
123+
place = Place(data[0][14])
124+
else:
125+
return None
126+
elif url:
127+
r = self.session.request("GET", self._url_get_place(url), headers=self.headers)
128+
r.raise_for_status()
129+
130+
list_data = json.loads(r.text[5:])
131+
place = Place(list_data[6])
83132
else:
84-
return None
85-
# r = self.session.request("GET", self._url_get_place(name), headers=self.headers)
86-
# r.raise_for_status()
87-
# list_data = json.loads(r.text[5:])
88-
# place = Place(list_data[6])
133+
raise
134+
89135
return place
90136

91137
@staticmethod
@@ -198,10 +244,13 @@ def _url_search(self, keyword, p, offset):
198244
"!61b1!67m2!7b1!10b1!69i657"
199245
)
200246

201-
def _url_get_place(self, place_name, id1_, id2_=0):
202-
247+
def _url_get_place(self, url):
248+
id1_id2 = self.__get_ids_from_url(url, hex_=True)
249+
if not id1_id2:
250+
raise Exception("not valid url")
251+
place_name = self.__get_name_from_url(url)
203252
return (
204-
f"https://www.google.com/maps/preview/place?authuser=0&hl={self.hl}&gl={self.gl}&q={quote(place_name)}&pb=!1m11!1s{hex(id2_)}:{hex(id1_)}!3m9!1m3"
253+
f"https://www.google.com/maps/preview/place?authuser=0&hl={self.hl}&gl={self.gl}&q={quote(place_name)}&pb=!1m11!1s{id1_id2}!3m9!1m3"
205254
f"!1d{self.zoom}!2d{self.longitude}!3d{self.latitude}!2m0!3m2!1i1536!2i686!4f13.1!12m4!2m3!1i360!2i120!4i8!13m57!2m2"
206255
"!1i203!2i100!3m2!2i4!5b1!6m6!1m2!1i86!2i86!1m2!1i408!2i240!7m42!1m3!1e1!2b0!3e3!1m3!1e2!2b1!3e2!1m3!1e2!2b0!3e3"
207256
"!1m3!1e8!2b0!3e3!1m3!1e10!2b0!3e3!1m3!1e10!2b1!3e2!1m3!1e9!2b1!3e2!1m3!1e10!2b0!3e3!1m3!1e10!2b1!3e2!1m3!1e10"
@@ -239,3 +288,11 @@ def _url_get_review(self, id1, id2, last_id="", page=200):
239288
return (
240289
f"https://www.google.com/maps/preview/review/listentitiesreviews?authuser=0&hl={self.hl}&gl={self.gl}&"
241290
f"pb=!1m2!1y{id1}!2y{id2}!{'2m2' if last_id else '2m1'}!2i{page}{('!3s' + last_id) if last_id else ''}!3e1!4m5!3b1!4b1!6b1!7b1!20b1!5m2!1sJavSZPiQCfGqkdUPx469kA4!7e81")
291+
292+
def _get_images_url(self, id1_, id2_):
293+
return (
294+
f"https://www.google.com/maps/preview/photo?authuser=0&hl={self.hl}&gl={self.gl}&pb=!1e2!3m3!"
295+
f"1s{hex(int(id1_))}:{hex(int(id2_))}!9e0!11s/g/11rn4ndyt8!5m50!2m2!1i203!2i100!3m2!2i20!5b1!7m42!1m3!1e1!2b0!3e3!1m3!1e2"
296+
"!2b1!3e2!1m3!1e2!2b0!3e3!1m3!1e8!2b0!3e3!1m3!1e10!2b0!3e3!1m3!1e10!2b1!3e2!1m3!1e9!2b1!3e2!1m3!1e10!2b0"
297+
"!3e3!1m3!1e10!2b1!3e2!1m3!1e10!2b0!3e4!2b1!4b1!9b0!6m3!1sfBnWZJe_L5GjkdUPnfi7-AQ!7e81!15i16698!16m2!2b1"
298+
"!4e1")

GoogleMapspy/var.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,13 @@ def phone(self):
1616
elif self.data[3]:
1717
return self.data[3][0]
1818

19+
@property
20+
def all_phones(self):
21+
if self.data[178]:
22+
return self.data[178]
23+
elif self.data[3]:
24+
return self.data[3]
25+
1926
@property
2027
def reviews(self) -> dict:
2128
if self.data[4]:
@@ -108,6 +115,10 @@ def google_place_id(self):
108115
def review_ids(self):
109116
return self.data[37][0][0][29]
110117

118+
@property
119+
def hex_ids(self):
120+
return self.data[10]
121+
111122
@property
112123
def url(self):
113124
return self.data[42]
@@ -142,7 +153,7 @@ def json(self):
142153
"google_place_id": self.google_place_id,
143154
"review_ids": self.review_ids,
144155
"url": self.url,
145-
"days":self.days,
156+
"days": self.days,
146157
}
147158

148159

@@ -228,5 +239,4 @@ def json(self):
228239
"place_name": self.place_name,
229240
"likes": self.likes,
230241
"id": self.id,
231-
232242
}

README.md

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ GoogleMapsPY aim to scrape data from Google Maps without Google API or Browser
1010
| Search and return Places ||
1111
| Get Place by name ||
1212
| Get Reviews ||
13-
| | |
13+
| Get Images | |
1414

1515

1616
### Installation
@@ -41,7 +41,7 @@ for index, place in enumerate(maps.search(keyword)):
4141
```
4242

4343
### Get Place
44-
44+
by place_name
4545
`place_name` must be accurate
4646
```python
4747
from GoogleMapspy import GoogleMaps
@@ -51,9 +51,19 @@ place_name = "مطعم الكتكوت للمشويات، مدينة الروضة
5151
place = maps.get_place(place_name)
5252
print(place)
5353
```
54+
or by google maps place url
55+
56+
```python
57+
from GoogleMapspy import GoogleMaps
58+
59+
maps = GoogleMaps(lang="en", country_code="eg")
60+
url = "https://www.google.com/maps/place/%D9%85%D8%B7%D8%B9%D9%85+%D8%A7%D9%84%D8%B5%D8%A7%D9%81%D9%89+%D8%A7%D9%84%D9%85%D8%A3%D9%83%D9%88%D9%84%D8%A7%D8%AA+%D8%A7%D9%84%D8%A8%D8%AD%D8%B1%D9%8A%D8%A9%E2%80%AD/@31.3236418,31.7580646,17z/data=!4m17!1m10!3m9!1s0x14f9e7860c2edadf:0xe7ee7daab22713f!2z2YXYt9i52YUg2KfZhNmD2KrZg9mI2Kog2YTZhNmF2LTZiNmK2KfYqg!8m2!3d31.3279843!4d31.7535306!10e5!14m1!1BCgIgAQ!16s%2Fg%2F11rn4ndyt8!3m5!1s0x14f9e72c1e2e1beb:0x656909fce8b20df!8m2!3d31.3237011!4d31.7580212!16s%2Fg%2F11hzjy_4bd?entry=ttu"
61+
place = maps.get_place(url=url)
62+
print(place)
63+
```
5464

5565
### Get Reviews
56-
pass ids
66+
by ids
5767
```python
5868
from GoogleMapspy import GoogleMaps
5969

@@ -65,7 +75,7 @@ ids = place.review_ids # ["1511502518116541527", "2022987617800227988"]
6575
for i, review in enumerate(maps.get_reviews(ids=ids)):
6676
print(i, review)
6777
```
68-
or google maps place url
78+
or by google maps place url
6979
```python
7080
from GoogleMapspy import GoogleMaps
7181

@@ -75,6 +85,21 @@ for i, v in enumerate(maps.get_reviews(url=url, sleep_time=1)):
7585
print(i, v)
7686
```
7787

88+
### Get Images
89+
by ids
90+
```python
91+
from GoogleMapspy import GoogleMaps
92+
93+
maps = GoogleMaps(lang="en", country_code="eg")
94+
place_name = "مطعم الكتكوت للمشويات، مدينة الروضة، مركز فارسكور"
95+
place = maps.get_place(place_name)
96+
print(place)
97+
ids = place.review_ids # ["1511502518116541527", "2022987617800227988"]
98+
images = maps.get_images(ids)
99+
print(images)
100+
```
101+
102+
78103
### Place object property:
79104
| name | type | return |
80105
|-------------------|-------|--------------------------------------|

test/test_run.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,20 @@
99
# places = maps.search(keyword, streem=False, sleep_time=0)
1010
# print(places)
1111

12-
place_name = "مطعم الكتكوت للمشويات، مدينة الروضة، مركز فارسكور"
13-
place = maps.get_place(place_name)
14-
print(place.days)
15-
12+
# place_name = "مطعم الكتكوت للمشويات، مدينة الروضة، مركز فارسكور"
13+
# place = maps.get_place(place_name)
14+
# print(place)
15+
#
16+
# d = maps.get_images(place.review_ids)
17+
# print(d)
1618
# ids = place.review_ids # ["1511502518116541527", "2022987617800227988"]
1719
# for i, v in enumerate(maps.get_reviews(ids=ids, sleep_time=1)):
1820
# print(i, v)
1921
#
2022
# url = "https://www.google.com/maps/place/%D9%86%D8%A7%D8%AF%D9%8A+%D8%A7%D9%84%D9%85%D9%87%D9%86%D8%AF%D8%B3%D9%8A%D9%86+%D8%AF%D9%85%D9%8A%D8%A7%D8%B7+%D8%A7%D9%84%D8%AC%D8%AF%D9%8A%D8%AF%D8%A9%E2%80%AD/@31.4438138,31.7206443,14.44z/data=!4m6!3m5!1s0x14f9e3054ae0727f:0xde8f78c8fa6ac846!8m2!3d31.4519438!4d31.6843306!16s%2Fg%2F1pty8slyq?entry=ttu"
2123
# for i, v in enumerate(maps.get_reviews(url=url, sleep_time=1)):
2224
# print(i, v)
25+
26+
# url = "https://www.google.com/maps/place/%D9%83%D9%86%D8%AA%D8%A7%D9%83%D9%8A%E2%80%AD/@31.4398058,31.5456013,15.13z/data=!4m19!1m10!3m9!1s0x14f9e7860c2edadf:0xe7ee7daab22713f!2z2YXYt9i52YUg2KfZhNmD2KrZg9mI2Kog2YTZhNmF2LTZiNmK2KfYqg!8m2!3d31.3279843!4d31.7535306!10e5!14m1!1BCgIgAQ!16s%2Fg%2F11rn4ndyt8!3m7!1s0x14f75c007d47ea73:0xab691d2a3fba4d12!8m2!3d31.4412519!4d31.5342442!9m1!1b1!16s%2Fg%2F11g8gl1n55?entry=ttu"
27+
# place = maps.get_place(url=url)
28+
# print(place)

0 commit comments

Comments
 (0)