Foxtrot站点爬虫分页后筛选参数丢失及按页码翻页实现咨询
解决方案
核心思路
直接从初始带筛选参数的URL中提取查询参数,每次翻页仅修改页码参数,重新拼接成完整URL发起请求,完全不依赖页面分页元素的href属性,避免筛选参数丢失。
实现步骤
- 第一步:解析初始URL的结构,拆分出域名、路径、查询参数等部分
- 第二步:固定保留filter、pFilter等筛选参数,仅动态修改
page参数的值构造下一页URL - 第三步:以当前页是否返回商品卡片作为翻页终止条件,替代原有的下一页按钮存在性判断
代码修改说明
首先导入URL处理模块:
from urllib.parse import urlparse, parse_qs, urlencode, urlunparse from typing import List, Tuple from selenium.webdriver import Firefox, Options from selenium.webdriver.common.by import By from selenium.common.exceptions import NoSuchElementException
修改后的parse函数逻辑如下:
def parse(init_url: str) -> List[Tuple[str, str, str]]: options = Options() options.add_argument('--headless') items = [] driver = Firefox(options=options) driver.implicitly_wait(5.5) # 解析初始URL拆分各组件 url_parts = list(urlparse(init_url)) query_params = parse_qs(url_parts[4]) current_page = 1 try: while True: # 仅更新页码参数,其余筛选参数保持不变 query_params['page'] = [str(current_page)] # 重新拼接完整请求URL url_parts[4] = urlencode(query_params, doseq=True) current_url = urlunparse(url_parts) print('Load:', current_url) driver.get(current_url) # 修正原选择器错误:原.last-child只会匹配最后一个商品,改为匹配所有商品卡片 item_els = driver.find_elements(By.CSS_SELECTOR, ".card") # 当前页无商品时终止翻页 if not item_els: break for item_el in item_els: try: name = item_el.find_element(By.CSS_SELECTOR, '.card__title').text except: name = 'Null' try: price = item_el.find_element(By.CSS_SELECTOR, '.card-price').text except NoSuchElementException: price = '-' try: nal = item_el.find_element(By.CSS_SELECTOR, '.card__buttons').text except NoSuchElementException: nal = "-" row = name, price, nal print(row) items.append(row) current_page += 1 finally: # 补充浏览器进程退出逻辑,避免后台残留 driver.quit() return items
注意事项
- 传入的初始init_url必须是第一页带完整filter、pFilter筛选参数的URL,确保后续所有分页请求都继承筛选条件
- 若Foxtrot站点存在单页最大页码限制,可额外添加current_page阈值判断,避免无意义请求
内容的提问来源于stack exchange,提问作者Константин Николаевич Бояр II
相关产品推荐
相关产品推荐

