如何从网站提取信息?

时间:2020-02-15 04:51:39

标签: python selenium web-scraping beautifulsoup

我正试图从该网站收集所有船只的信息: module reloading

这是我现在的代码:

variables[6]

https://www.marinetraffic.com/en/data/?asset_type=vessels&columns=flag,shipname,photo,recognized_next_port,reported_eta,reported_destination,current_port,imo,ship_type,show_on_live_map,time_of_latest_position,lat_of_latest_position,lon_of_latest_position&ship_type_in|in|Cargo%20Vessels|ship_type_in=7

我正在使用硒,因为它不起作用。我有数千艘船要从中提取数据,但效率不高。 (此外,我只需要从货运船只中提取信息(您可以使用过滤器或通过查看船只类型列上的绿色标志来找到该信息。)并且我需要提取国家/地区名称(标志),Imo和船只名称。

我应该使用什么?硒或Bs4 +请求或其他库?如何?我刚刚开始抓取网页...

我无法获得Imo,也无法获得任何东西! HTML结构很奇怪。

我将不胜感激。谢谢! :)

2 个答案:

答案 0 :(得分:1)

您无需单击每个容器来打开详细信息,而是可以从结果页面中获取要搜索的信息。这将获得每个船只,提取您想要的信息,如果还有更多船只,请单击到下一页:

import selenium.webdriver as webdriver

url = "https://www.marinetraffic.com/en/data/?asset_type=vessels&columns=flag,shipname,photo,recognized_next_port,reported_eta,reported_destination,current_port,imo,ship_type,show_on_live_map,time_of_latest_position,lat_of_latest_position,lon_of_latest_position&ship_type_in|in|Cargo%20Vessels|ship_type_in=7"

browser = webdriver.Chrome('C:\Users\CSA\OneDrive - College Sainte-Anne\Programming\PYTHON\Learning\WS\chromedriver_win32 (1)\')
browser.get(url)
browser.implicitly_wait(5)

checking_for_vessels = True
vessel_count = 0

while checking_for_vessels:
    vessel_left_container = browser.find_element_by_class_name('ag-pinned-left-cols-container')
    vessels_left = vessel_left_container.find_elements_by_css_selector('div[role="row"]')

    vessel_right_container = browser.find_element_by_class_name("ag-body-container")
    vessels_right = vessel_right_container.find_elements_by_css_selector('div[role="row"]')

    for i in range(len(vessels_left)):
        vessel_count += 1
        vessel_country_list = vessels_left[i].find_elements_by_class_name('flag-icon')

        if len(vessel_country_list) == 0:
            vessel_country = 'Unknown'
        else:
            vessel_country = vessel_country_list[0].get_attribute('title')

        vessel_name = vessels_left[i].find_element_by_class_name('ag-cell-content-link').text
        vessel_imo = vessels_right[i].find_element_by_css_selector('[col-id="imo"] .ag-cell-content div').text

        print('Vessel #' + str(vessel_count) + ': ' + vessel_name + ', ' + vessel_country + ', ' + vessel_imo)

    pagination_container = browser.find_element_by_class_name('MuiTablePagination-actions')
    page_number = pagination_container.find_element_by_css_selector('input').get_attribute('value')
    max_page_number = pagination_container.find_element_by_class_name('MuiFormControl-root').get_attribute('max')

    if page_number == max_page_number:
        checking_for_vessels = False
    else:
        next_page_button = pagination_container.find_element_by_css_selector('button[title="Next page"]')
        next_page_button.click()

有一艘未显示船旗的船只,因此进行了检查,如果未找到船旗,则将国家替换为“未知”。可以对容器名称和imo进行相同的检查。

隐式等待时间减少到5,因为已知的问题是在一艘船上丢失了一个标志,而等待100秒才能解决这个问题是多余的。如果发现问题等待时间足够长,可以将该数字调整得更高。

似乎您正在使用Windows计算机。您可以将chromedriver的路径放在计算机上的PATH变量中,然后在实例化浏览器驱动程序时不必使用该路径。显然,您通往chromedriver的路径与我的不同,因此希望您提供的内容正确无误,否则将无法正常工作。

答案 1 :(得分:0)

我喜欢与bs4合作,但是我认为info会有所帮助。

相关问题