1. 使用“下一页”按钮
如果网页上有“下一页”按钮或链接,你可以设置一个循环来点击该按钮,而直到它不可用为止。
代码示例
Python
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
import time
def initialize_driver():
driver = webdriver.Chrome()
driver.implicitly_wait(10)
return driver
def open_page(driver, url):
driver.get(url)
def collect_data(driver):
# 从当前页面示例收集数据
items = driver.find_elements(By.CLASS_NAME, "item_class")
for item in items:
print(item.text) # 这里可以保存或处理数据
def click_next_button(driver):
try:
next_button = driver.find_element(By.LINK_TEXT, "Next")
next_button.click()
return True
except NoSuchElementException:
return False # 按钮未找到,意味着我们到了最后一页
def main():
driver = initialize_driver()
open_page(driver, "https://example.com/page1")
try:
while True:
collect_data(driver)
if not click_next_button(driver):
break # 如果“Next”按钮不存在,跳出循环
time.sleep(2) # 等待下一页面加载
finally:
driver.quit()
main()
代码解释
initialize_driver() — 初始化 driver。
open_page() — 打开起始页面。
collect_data() — 收集当前页面的数据。
click_next_button() — 找到并点击 “Next” 按钮。如果按钮不存在,返回 False,表示循环结束。
main() 的循环 — 负责页面的循环爬取。当 “Next” 按钮不可用时停止。
2. 使用页码的分页方式
一些网站会有编号的分页链接(例如“1”,“2”,“3”),在这种情况下可以收集所有链接并依次访问它们。
代码示例
Python
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
def initialize_driver():
driver = webdriver.Chrome()
driver.implicitly_wait(10)
return driver
def open_page(driver, url):
driver.get(url)
def collect_data(driver):
items = driver.find_elements(By.CLASS_NAME, "item_class")
for item in items:
print(item.text)
def go_to_page(driver, page_number):
page_link = driver.find_element(By.LINK_TEXT, str(page_number))
page_link.click()
def main():
driver = initialize_driver()
open_page(driver, "https://example.com/page1")
try:
total_pages = 5 # 如果已知总页数,请在此填写
for page in range(1, total_pages + 1):
collect_data(driver)
if page < total_pages: # 最后一页后不再跳转
go_to_page(driver, page + 1)
time.sleep(2) # 等待页面加载
finally:
driver.quit()
main()
代码解释
go_to_page() — 根据页码找到链接并跳转。
main() 的循环 — 使用 total_pages 确定页面数量。在到达最后一页前,依次跳转访问页面。
3. 修改 URL 来访问页面
某些网站的 URL 结构十分简单,每个页面通过数字标识,例如 https://example.com/page/1, https://example.com/page/2 等等。在这种情况下,可以直接修改 URL 来加载页面,无需寻找元素。
代码示例
Python
from selenium import webdriver
import time
def initialize_driver():
driver = webdriver.Chrome()
driver.implicitly_wait(10)
return driver
def open_page(driver, url):
driver.get(url)
def collect_data(driver):
items = driver.find_elements_by_class_name("item_class")
for item in items:
print(item.text)
def main():
driver = initialize_driver()
try:
total_pages = 5 # 如果已知总页数,请在此填写
base_url = "https://example.com/page/"
for page_number in range(1, total_pages + 1):
url = f"{base_url}{page_number}"
open_page(driver, url)
collect_data(driver)
time.sleep(2) # 等待页面加载
finally:
driver.quit()
main()
代码解释
变量 base_url 保存基础 URL。循环将其与页码拼接并按顺序访问页面。
循环 会生成每个页面的 URL,并在无需点击元素的情况下完成页面数据爬取,从而降低报错的可能性。
4. 优化建议
- 尽量减少动态元素的点击操作: 使用链接和 URL 比点击 JavaScript 加载的按钮更可靠。
- 使用最短的等待时间: 跳转到新页面时使用最短的
time.sleep(2)确保加载完成,但不要超过必要时间。 - 在页面完全加载后再采集数据: 确保页面加载完成后再开始收集数据。使用
implicitly_wait提高可靠性。 - 日志记录: 添加日志记录来跟踪当前页面、错误及成功操作。这会帮助你在运行脚本时更方便地调试。
GO TO FULL VERSION