动态加载页面爬取:请求Shipspotting API返回404如何解决?
解决Shipspotting API请求404的问题
核心问题分析
你当前用GET请求/ssapi/gallery-search返回404,是因为该接口实际需要POST请求,且必须携带必要参数与完整请求头,同时接口返回JSON数据而非HTML,无需用BeautifulSoup解析。
修正步骤与代码示例
- 切换请求方法为POST:该接口仅接受POST请求,GET请求会直接返回404
- 携带必要请求参数:包括分类ID、页码、每页条数等,参数可通过浏览器开发者工具抓取实际请求内容获取
- 完善请求头:补充
Accept、X-Requested-With等字段,同时先访问分类页面获取会话Cookie - 解析JSON响应:直接处理接口返回的JSON结构数据,提取图片文件名
修正后的代码示例:
import requests import time cat_page = 'https://www.shipspotting.com/photos/gallery?category=' # 初始化会话,保持Cookie与请求头一致性 session = requests.Session() session.headers.update({ "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:96.0) Gecko/20100101 Firefox/96.0", "Accept": "application/json, text/javascript, */*; q=0.01", "X-Requested-With": "XMLHttpRequest" }) for cat_name, cat_id in cat_dict.items(): cat_link = cat_page + str(cat_id) # 先访问分类页面,获取必要的会话信息与Cookie session.get(cat_link) # 构造POST请求参数,可根据需求调整页码和每页条数 payload = { "category": str(cat_id), "page": 1, "limit": 24, # 网站默认每页24条,可修改 "sort": "latest", # 排序方式,可选latest/most_viewed等 "type": "" } try: response = session.post( 'https://www.shipspotting.com/ssapi/gallery-search', data=payload, headers={"Referer": cat_link} ) response.raise_for_status() # 触发HTTP错误提示 # 解析JSON响应并提取图片文件名 data = response.json() for item in data.get("items", []): img_url = item.get("image") if img_url: img_filename = img_url.split("/")[-1] print(f"分类[{cat_name}]图片文件名:{img_filename}") # 控制请求频率,避免反爬 time.sleep(1) except requests.exceptions.RequestException as e: print(f"分类[{cat_name}]请求失败:{str(e)}")
额外注意事项
- 若遇到CSRF验证失败,可从分类页面HTML中提取
csrf-token字段,添加到请求头的X-CSRF-Token中 - 分页获取时,需循环递增
page参数,直到返回的items为空,即所有页数据已获取完毕 - 请勿过度频繁请求,避免触发网站反爬机制导致IP被限制
内容的提问来源于stack exchange,提问作者tonyd629
相关产品推荐
相关产品推荐

