如何用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
相关产品推荐
相关产品推荐

