从海洋交通页面抓取数据

M-W*_*ane 0 python selenium web-scraping

我正在尝试从此网页抓取数据:海上交通

我确实尝试了 python 和 Selenium 中的正常抓取,但我无法找出任何目标数据。(纬度/经度/速度)

在此输入图像描述

是否有我缺少的特殊格式?

这是我开始的代码

from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors')
options.add_argument('--incognito')
options.add_argument('--headless') 
driver = webdriver.Chrome("C:/webdrivers/chromedriver.exe", options=options)
page = driver.page_source
Run Code Online (Sandbox Code Playgroud)

但是通过使用 CTRL + FI 进行简单的文本搜索找不到任何令人满意的内容。

知道如何把它刮下来吗?

谢谢

use*_*432 6

如果您在浏览器中查看该页面并记录浏览器的网络流量,您会注意到向各种 API 端点发出一些 XHR HTTP GET 请求,其响应是 JSON 并包含您正在查找的信息。您所要做的就是模仿这些请求 - 不需要 BeautifulSoup 或 Selenium:

def get_ship_position(ship_id):
    import requests

    url = "https://www.marinetraffic.com/vesselDetails/latestPosition/shipid:{}".format(ship_id)

    headers = {
        "accept": "application/json",
        "accept-encoding": "gzip, deflate",
        "user-agent": "Mozilla/5.0",
        "x-requested-with": "XMLHttpRequest"
    }

    response = requests.get(url, headers=headers)
    response.raise_for_status()

    return response.json()


def main():

    from datetime import datetime

    data = get_ship_position("371441")
    ts = datetime.utcfromtimestamp(data["lastPos"])
    print("Last known position: {} / {} @ {}".format(data["lat"], data["lon"], ts))
    
    return 0


if __name__ == "__main__":
    import sys
    sys.exit(main())
Run Code Online (Sandbox Code Playgroud)

输出:

Last known position: -1.53057 / -48.77838 @ 2021-08-04 10:33:33
Run Code Online (Sandbox Code Playgroud)