Python:Web抓取Airbnb获取列表的纬度和经度值

2024-09-25 08:36:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试获取Airbnb中显示的列表的经度和纬度,我认为这些信息是嵌入在google地图中的。当我试图通过使用lxml库或漂亮的Soup复制完整的Xpath来获取该对象时,我无法获得它。例如,清单https://www.airbnb.co.uk/rooms/15307317,在一个带有标记div img with attribute data veloute=“map/GoogleMapStatic”的对象中,地图中心有经度和纬度的信息,我试图使用以https://maps.googleapis.com/maps/api/staticmap?center=开头的链接,但我无法用代码识别正确的对象。在

url = 'https://www.airbnb.co.uk/rooms/15307317'
response = http.request('GET', url)
soup = BeautifulSoup(response.data, 'lxml')
soup.find("div", {"data-veloute":"map/GoogleMapStatic"})
soup.find("img", {"data-veloute":"map/GoogleMapStatic"})

或者下一个代码:

^{pr2}$

有没有可能得到这些信息?在


Tags: 对象https信息mapdatawww地图lxml
3条回答

response保存到一个文件中,然后查看页面的真实外观。大多数内容是动态加载的。您需要一个浏览器来处理javascript动态内容加载。在

seleniumpyppeteer是最流行的浏览器脚本库。在

正如RafalS建议的那样,您应该使用selenium或其他浏览器脚本库。在

这是我想到的。在

from selenium import webdriver
from selenium.webdriver.chrome.options import Options 
import time
from bs4 import BeautifulSoup
import urllib.parse as urlparse
from urllib.parse import parse_qs

def main():
    chrome_options = Options()  
    chrome_options.add_argument(" headless")  #if you don't want the GUI to pop up
    driver = webdriver.Chrome(options=chrome_options)
    driver.get('https://www.airbnb.co.uk/rooms/15307317')
    time.sleep(2)
    soup = BeautifulSoup(driver.page_source, "lxml")
    url = (soup.find("img", {"data-veloute":"map/GoogleMapStatic"})).attrs['src']
    parsed = urlparse.urlparse(url)
    print(parse_qs(parsed.query)['center'])

if __name__ == '__main__':
    main()

输出:

^{pr2}$

它们出现在脚本标记中。您可以从响应文本进行regex,而无需借助浏览器的开销。在

import requests, re

r = requests.get('https://www.airbnb.co.uk/rooms/15307317')
p_lat = re.compile(r'"lat":([-0-9.]+),')
p_lng = re.compile(r'"lng":([-0-9.]+),')
lat = p_lat.findall(r.text)[0]
lng = p_lng.findall(r.text)[0]
print(lat,lng)

相关问题 更多 >