我想從網頁https://www.balticshipping.com/vessels抓取資料,包括其詳細資訊頁面(例如https://www.balticshipping.com/vessel/imo/9331713)中的船舶資訊,并將此資料保存為 CSV表。轉到下一頁時,我看到 URL 沒有更改,因此我不知道如何同時從所有頁面獲取資料。有沒有什么特定的方法可以將所有這些資料保存在一個 CSV 檔案中? 下一步按鈕檢查視圖
import requests
from bs4 import BeautifulSoup
baseurl ='https://www.balticshipping.com/'
headers= {'User-Agent': 'Mozilla/5.0'}
productlinks = []
response = requests.get('https://www.balticshipping.com/vessels')
soup = BeautifulSoup(response.content, 'html.parser')
productlist =soup.find_all('div', id="search_results")
#loop to get all href from ul
for item in productlist:
for link in item.find_all('a', href = True):
productlinks.append(baseurl link['href'])
print(productlinks)
我嘗試使用此代碼從當前頁面獲取所有鏈接,但它給了我一個空結果,也許“productlist =soup.find_all('div', id="search_results")'行中存在一些錯誤,因為它沒有通過使用 id 而不是 class 的任何資料。
uj5u.com熱心網友回復:
您可以通過 api 訪問該資料。但請記住,您將遍歷大約 7700 多頁的資料。
import requests
from bs4 import BeautifulSoup
import pandas as pd
url ='https://www.balticshipping.com/'
ships_found = True
page = 0
rows = []
#while ships_found:
for page in range(10):
payload = {
'request[0][module]': 'ships',
'request[0][action]': 'list',
'request[0][id]': '0',
'request[0][data][0][name]': 'search_id',
'request[0][data][0][value]': '0',
'request[0][data][1][name]': 'name',
'request[0][data][1][value]': '',
'request[0][data][2][name]': 'imo',
'request[0][data][2][value]': '',
'request[0][data][3][name]': 'page',
'request[0][data][3][value]': f'{page}',
'request[0][sort]': '',
'request[0][limit]': '27',
'request[0][stamp]': '0',
'request[1][module]': 'top_stat',
'request[1][action]': 'list',
'request[1][id]': '0',
'request[1][data]': '',
'request[1][sort]': '',
'request[1][limit]': '',
'request[1][stamp]': '0'}
jsonData = requests.post(url, data=payload).json()
if len(jsonData['data']['request'][0]['ships']) == 0:
ships_found = False
print('End of Pages.')
else:
for each in jsonData['data']['request'][0]['ships']:
row = each['data']
rows.append(row)
page = 1
print(page)
df = pd.DataFrame(rows)
uj5u.com熱心網友回復:
@chitown88 解決方案有效,但從我所看到的 API 提供的資料不完整,所以我的解決方案是通過以下方式查詢船舶詳細資訊IMO number:
import requests
from bs4 import BeautifulSoup
baseurl ='https://www.balticshipping.com'
# Sample iteration from first page to page 10
for pagenum in range(10):
payload = {
'request[0][module]': 'ships',
'request[0][action]': 'list',
'request[0][id]': 0,
'request[0][data][0][name]': 'search_id',
'request[0][data][0][value]': 0,
'request[0][data][1][name]': 'name',
'request[0][data][1][value]': '',
'request[0][data][2][name]': 'imo',
'request[0][data][2][value]': '',
'request[0][data][3][name]': 'page',
'request[0][data][3][value]': pagenum,
'request[0][sort]': '',
'request[0][limit]': 9,
'request[0][stamp]': 0,
'request[1][module]': 'top_stat',
'request[1][action]': 'list',
'request[1][id]': 0,
'request[1][data]': '',
'request[1][sort]': '',
'request[1][limit]': '',
'request[1][stamp]': 0
}
response = requests.post(baseurl, data=payload)
try:
jsondata = response.json()
except requests.exceptions.JSONDecodeError:
print("Error occured while decoding JSON response.")
ships = jsondata['data']['request'][0]['ships']
for ship in ships:
ship_imo = ship['data']['imo']
print(ship_imo)
# Now query ship details by its IMO number
# just replace number in this example url: https://www.balticshipping.com/vessel/imo/9331713
# resp = requests.get('{baseurl}/vessel/imo/{ship_imo}'.format(baseurl=baseurl, ship_imo=ship_imo))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/346515.html
