Возвращать [] при парсинге данных с помощью bs4 - PullRequest
0 голосов
/ 20 июня 2020

Я пытаюсь очистить данные с веб-сайта, но пока это безуспешно. Я попробовал несколько наиболее многообещающих способов. Я пытаюсь получить yearBuild с сайта. Кто-нибудь может мне помочь. любые потенциальные клиенты будут очень признательны

import bs4 as bs
from selenium import webdriver  
wd = webdriver.Chrome()
url = ("https://www.marinetraffic.com/en/ais/details/ships/mmsi:255805792")
wd.get(url)
html_source = wd.page_source
wd.quit()
soup = bs.BeautifulSoup(html_source)
elems = soup.select('#yearBuild > b')
print(elems)
print(soup.prettify())

здесь elems возвращается как пустой список

Ответы [ 2 ]

1 голос
/ 20 июня 2020

Вы можете использовать их API для получения информации о корабле.

Например:

import re
import json
import requests


url = 'https://www.marinetraffic.com/en/ais/details/ships/mmsi:255805792'

ship_info_url = 'https://www.marinetraffic.com/en/vesselDetails/vesselInfo/shipid:{ship_id}'
headers = {'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:77.0) Gecko/20100101 Firefox/77.0'}

r = requests.get(url, headers=headers)
ship_id = re.search(r'shipid:(\d+)', r.url)[1]
data = requests.get(ship_info_url.format(ship_id=ship_id), headers=headers).json()

print(json.dumps(data, indent=4))
print('Year Built = ', data['yearBuilt'])

Печать:

{
    "name": "LAILA",
    "nameAis": "LAILA",
    "imo": 9377559,
    "eni": null,
    "mmsi": 255805792,
    "callsign": "CQDP",
    "country": "Portugal",
    "countryCode": "PT",
    "type": "Cargo - Hazard A (Major)",
    "typeSpecific": "Container Ship",
    "typeColor": "7",
    "grossTonnage": 28048,
    "deadweight": 38080,
    "teu": 2700,
    "liquidGas": null,
    "length": 215.5,
    "breadth": 29.87,
    "yearBuilt": 2008,
    "status": "Active",
    "isNavigationalAid": false,
    "correspondingRoamingStationId": null,
    "homePort": null
}
Year Built =  2008
0 голосов
/ 20 июня 2020

Могу я предложить использовать VesselFinder вместо MarineTraffi c? Данные те же самые, но MarineTraffi c сложно очистить, так как это все JavaScript, а VesselFinder можно очистить только с помощью BeautifulSoup.

VesselFinder также использует таблицы для отображения данных, поэтому их легко анализировать с помощью pandas.

Вот код:

import pandas as pd
import requests

r = requests.get('https://www.vesselfinder.com/vessels/LAILA-IMO-9377559-MMSI-255805792', headers={'User-Agent': 'iPhone'})

df = pd.read_html(r.text)
ship = ship = pd.concat([df[2], df[3]], ignore_index=True).set_index(0).to_dict()[1]

print(ship['Year of Built'])
...