gpt4 book ai didi

python - 如何从网站中提取信息?

转载 作者:行者123 更新时间:2023-12-01 06:24:21 25 4
gpt4 key购买 nike

我正在尝试从该网站收集所有船只的信息: 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

这是我现在的代码:

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)

My output

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

我应该使用什么? Selenium 或 Bs4 + requests 或其他库?如何?我刚刚开始网络抓取...

我什么也拿不到 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 路径与我的不同,因此希望您提供的内容是正确的,否则这将不起作用。

关于python - 如何从网站中提取信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60235937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com