CodeGym /课程 /Python SELF ZH /多页爬取的主要方法

多页爬取的主要方法

Python SELF ZH
第 38 级 , 课程 2
可用

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 提高可靠性。
  • 日志记录: 添加日志记录来跟踪当前页面、错误及成功操作。这会帮助你在运行脚本时更方便地调试。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION