Python 如何从网站中提取信息?

Python 如何从网站中提取信息?,python,selenium,web-scraping,beautifulsoup,Python,Selenium,Web Scraping,Beautifulsoup,我正试图从本网站收集所有船只的信息: 这是我现在的代码: 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,s

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

这是我现在的代码:

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(executable_path=r"C:\Users\CSA\OneDrive - College Sainte-Anne\Programming\PYTHON\Learning\WS\chromedriver_win32 (1)\chromedriver.exe")
browser.get(url)

browser.implicitly_wait(100)
Vessel_link = browser.find_element_by_class_name("ag-cell-content-link")
Vessel_link.click()

browser.implicitly_wait(30)
imo = browser.find_element_by_xpath('//*[@id="imo"]')
print(imo)

我用的是硒,这不起作用,因为。我有数千艘船只要从中提取数据,但这样做效率不高。(另外,我只需要从货船上提取信息(你可以使用过滤器或通过查看船舶类型栏上的绿色标志来找到),我还需要提取国家名称(国旗)、Imo和船舶名称

我应该使用什么?Selenium或Bs4+请求或其他库?以及如何使用?我刚刚开始web抓取

我无法获得Imo或任何东西!HTML结构非常奇怪


非常感谢您的帮助。谢谢!:)

我喜欢与您一起工作,但我认为这会有所帮助。

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

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路径与我的不同,因此希望您提供的是正确的,否则将无法正常工作。

他们通过API销售这些信息。即使你现在可以刮它,它也可能在几个小时内不起作用。您可能希望支付并使用API,或者从其他来源查找您的信息: