You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python+Selenium实现Likibu.com多页数据爬取(共37页)

如何用Selenium爬取Likibu.com的所有分页数据

嘿,你已经搞定第一页的爬取了,这已经成功了一半!要把范围扩展到全部37页其实很简单,我们可以利用分页URL的规律来循环爬取每一页的数据。

先看看你提供的分页HTML结构,所有分页链接都遵循这个格式:

https://www.likibu.com/fr/search/39tuzgbpnycdv7tkj102g?guests=2&destination_id=4094&page=X

其中X就是页码,从1到37。所以我们只需要循环生成每个页码对应的URL,依次访问并提取数据即可。

下面是修改后的完整代码示例,我会加上详细的注释:

from selenium import webdriver
from bs4 import BeautifulSoup
import csv
import re
import time
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# 初始化浏览器驱动(这里以Chrome为例,记得下载对应版本的chromedriver)
driver = webdriver.Chrome()

# 第一步:获取初始搜索页面的第一页URL
driver.get("https://www.likibu.com/")
page_source = driver.page_source
soup = BeautifulSoup(page_source, "lxml")
first_page_link = soup.find(rel=re.compile("nofollow")).attrs["href"]

# 提取基础URL(去掉page参数,方便后续拼接不同页码)
base_url = first_page_link.split("page=")[0]

# 打开CSV文件准备写入(这里假设你需要爬取标题、价格、地址三个字段,可根据实际需求调整)
with open('likibu_accommodations.csv', 'w', newline='', encoding='utf-8') as csv_file:
    csv_writer = csv.writer(csv_file)
    # 写入表头
    csv_writer.writerow(["住宿标题", "价格", "位置"])

    # 动态获取总页码(避免硬写37,适配网站后续页码变化)
    driver.get(first_page_link)
    first_page_soup = BeautifulSoup(driver.page_source, "lxml")
    pagination_list = first_page_soup.find("ul", class_="pagination")
    # 从分页栏中提取最后一页的数字(注意HTML结构里的最后一个可点击页码是倒数第二个li)
    total_pages = int(pagination_list.find_all("li")[-2].text.strip())

    # 循环遍历每一页
    for page_num in range(1, total_pages + 1):
        # 构造当前页的URL
        current_page_url = f"{base_url}page={page_num}"
        driver.get(current_page_url)

        # 显式等待页面加载完成(等待住宿列表元素出现,比隐式等待更稳定)
        try:
            WebDriverWait(driver, 15).until(
                EC.presence_of_all_elements_located((By.CLASS_NAME, "住宿列表的类名"))  # 替换成实际的类名
            )
        except Exception as e:
            print(f"第{page_num}页加载超时,跳过该页: {e}")
            continue

        # 解析当前页面的HTML
        current_soup = BeautifulSoup(driver.page_source, "lxml")
        # 找到所有住宿项(替换成实际的元素定位方式)
        accommodations = current_soup.find_all("div", class_="住宿项的类名")

        # 遍历每个住宿项,提取数据
        for acc in accommodations:
            # 提取标题(根据实际HTML结构调整选择器)
            title = acc.find("h3").text.strip() if acc.find("h3") else "无标题"
            # 提取价格
            price = acc.find("span", class_="价格类名").text.strip() if acc.find("span", class_="价格类名") else "无价格"
            # 提取位置
            location = acc.find("div", class_="位置类名").text.strip() if acc.find("div", class_="位置类名") else "无位置"

            # 写入CSV
            csv_writer.writerow([title, price, location])

        # 打印进度,方便跟踪
        print(f"已完成第{page_num}/{total_pages}页的数据爬取")
        # 添加延迟,避免触发反爬机制
        time.sleep(2)

# 爬取完成后关闭浏览器
driver.quit()
print("所有页面爬取完成!")

几个重要的注意事项:

  • 替换类名:代码里的住宿列表的类名、住宿项的类名等都需要你替换成网站实际的HTML类名,你可以用浏览器的开发者工具(F12)来查看元素的类名。
  • 反爬应对:添加time.sleep(2)是为了降低请求频率,避免被网站封禁IP。如果还是遇到反爬,可以考虑增加延迟,或者使用代理IP。
  • 显式等待:用WebDriverWait替代简单的implicitly_wait能让代码更稳定,确保页面元素加载完成后再进行解析,减少报错概率。
  • 动态页码:代码里通过解析分页栏获取总页码,而不是硬写37,这样如果网站后续页码数变化,代码不需要修改就能适配。

内容的提问来源于stack exchange,提问作者Mohammed Rasfa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:07:56