【问题标题】:Google maps place id using selenium谷歌地图使用硒的地方ID
【发布时间】:2019-09-10 06:46:32
【问题描述】:
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

您好,这是我的第一个 selenium 项目我正在尝试从结果中查找地点 ID 我添加了一些地点 ID(我使用 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_

after "\"chiropractor\"]\n]\n,null,\"Place ID",null ...

但我找不到它的正则表达式。 我需要帮助编写正确的正则表达式或找到另一种查找 palce_id 的方法。 我希望没有人回答参考使用他们的 API

【问题讨论】:

    标签: python regex web-scraping


    【解决方案1】:

    我认为这可以改进,但字符串本身位于包含window.APP_OPTIONS 的脚本标记中。这些 id 中的每一个都以 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 处理风险更大

    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()
    

    注意事项:

    我正在指定一种模式,旨在仅匹配当前所需的项目(对于给定的搜索)。可以想象,在未来/新的搜索中,该模式可能会出现而不是一个 id。 page_source 是一个更大的搜索空间,因此更有可能遇到与模式匹配的不需要的字符串。脚本标签不仅是您希望找到 id 的地方,而且还是一个较小的搜索空间。随着时间的推移,您可能还想检查字符集是否需要任何额外的字符来匹配新的 id。您可以轻松地检查每页计数的结果。

    【讨论】:

    • 两者都很好用,您在搜索页面源时风险更大是什么意思?
    • 我正在指定一个模式,该模式恰好只匹配当前所需的项目。可以想象,pattern 可能会出现而不是 id。 page_source 是一个更大的搜索空间,因此更有可能遇到与模式匹配的不需要的字符串。脚本标签不仅是您希望找到 id 的地方,也是一个较小的搜索空间。
    猜你喜欢
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    相关资源
    最近更新 更多