Google карты размещают идентификатор с использованием селена - PullRequest
1 голос
/ 20 апреля 2019
from selenium import webdriver
import re
driver= webdriver.Chrome(executable_path=r"C:\Users\chromedriver")
sentence = "chiropractor in maryland"
url="https://google.com/search?hl=en&q={}".format(sentence)
driver.get(url)
links=driver.find_elements_by_xpath('//a[@href]')
maps=[i for i in links if i.text=="Maps"][0].click()
html=driver.page_source
#ChIJaYGxdRj9t4kRcJmJlvQkKX0
#ChIJCf4MzWjgt4kRluBnhQTHlBM
#ChIJBXxr8brIt4kRVE-gIYDyV8c
#ChIJX0W_Xo4syIkRUAtRFy8nz1Y place ids in html

Здравствуйте, это мой первый проект селена. Я пытаюсь найти идентификаторы мест из результата. Я добавил некоторые идентификаторы мест (я получил с помощью API), я пытался найти их в инструментах инспектора, но я не смог 'Однако, они доступны в исходном коде страницы, который я пытался использовать с помощью регулярных выражений. Похоже, они следуют по следующему пути

2,[null,null,\\"bizbuilder:gmb_web\\",[6,7,4,1,3]\\n]\\n]\\n]\\n,1,null,null,null,null,null,null,[\\"-8523065488279764631\\",\\"9018780361702349168\\"]\\n]\\n]\\n]\\n,null,null,null,[[\\"chiropractor\\"]\\n]\\n,null,\\"ChIJaYGxdRj9t4kRcJmJlvQkKX0\\",null,null,null,[\\"South Gate\\",\\"806 Landmark Dr Suite 126\\",\\"806 Landmark Dr Suite 126\\",\\"Glen Burnie\\"]\\n,null,null,null,null,null,[null,\\"SearchResult.TYPE_PERSONAL_

после "\" мануального терапевта \ "] \ n] \ n, null, \" Place ID", null ...

, но я не могу найти регулярное выражение для него. Мне нужна помощь в написании правильного регулярного выражения или найти другой способ найти palce_id. Я надеюсь, что нетодин ответ со ссылкой на использование их API

1 Ответ

1 голос
/ 20 апреля 2019

Я думаю, что это можно улучшить, но сама строка находится в теге скрипта, в котором есть window.APP_OPTIONS. Каждый из этих идентификаторов начинается с ChIJ, имеет определенный набор символов и имеет общую длину 27.

Я также начал непосредственно со страницы карты, а не нажимал на нее. Мне не нужно условие ожидания, несмотря на несколько пробежек. Это может быть добавлено, если требуется / требуется.

from selenium import webdriver
from bs4 import BeautifulSoup as bs
import re

sentence = "chiropractor in maryland"
url = 'https://www.google.com/maps/search/{}'.format(sentence)
d = webdriver.Chrome()
d.get(url)
soup = bs(d.page_source, 'lxml')

for script in soup.select('script'):
    if 'window.APP_OPTIONS' in script.text:
        script = script.text
        break    
r = re.compile(r'(ChIJ[a-zA-Z\.0-9\-\_]{23})')
items = r.findall(script)
print(items)

d.quit()

Немного рискованнее, вы могли бы поработать с page_source direct

from selenium import webdriver
from bs4 import BeautifulSoup as bs
import re

sentence = "chiropractor in maryland"
url = 'https://www.google.com/maps/search/{}'.format(sentence)
d = webdriver.Chrome()
d.get(url)
r = re.compile(r'(ChIJ[a-zA-Z\.0-9\-\_]{23})')
items = r.findall(d.page_source)
print(items)

d.quit()

Примечания:

Я указываю шаблон, предназначенный для соответствия только требуемым элементам в настоящее время (для данного поиска). Вполне возможно, что в будущих / новых поисках этот шаблон может появиться и не быть идентификатором. Page_source - это большее пространство поиска и, следовательно, большая вероятность встретить нежелательную строку, которая соответствует шаблону. Тег script не только там, где вы ожидаете найти идентификаторы, но и является меньшим пространством поиска. Со временем вы также можете захотеть проверить, чтобы набор символов не требовал дополнительных символов для соответствия новым идентификаторам. Вы можете легко проверить результат по количеству страниц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...