影刀RPA 翻页采集策略大全六种翻页方式的选择与组合作者林焱什么情况用这个列表页的数据采集是RPA最高频的场景之一。但翻页这件事比你想象的要复杂得多——不是每个网站的翻页方式都一样。有的用下一页按钮、有的用页码链接、有的用加载更多、有的滚动到底部自动加载、还有的URL规律明显直接拼链接就行。用错翻页策略的结果漏数据、重复采集、无限循环、或者卡在某一页动不了。这篇文章把六种最常见的翻页方式一一拆解告诉你遇到什么网站用什么策略以及各自的避坑要点。怎么做第一步先识别网站的翻页类型打开目标网站观察翻页区域。对应这六种类型翻页类型特征对应策略下一页按钮有下一页或按钮循环点击下一页页码跳转显示页码1,2,3…循环点击页码或URL拼页数加载更多查看更多按钮循环点击加载更多无限滚动滚动到底自动加载滚动等待URL规律URL中有pageN参数直接构造URL列表API分页数据由接口返回调API翻页第二步策略一——下一页按钮翻页最常见的翻页方式也最容易处理影刀流程 1. 【ForEach】→ 采集所有当前页数据 2. 【IF条件】→ 【元素存在】下一页按钮 ├── True: 【点击元素】→ 下一页按钮  │ 【等待元素】→ 第一行数据确认翻页成功 │ 【继续循环】回到步骤1 └── False: 【跳出循环】关键细节如何判断到了最后一页# 方法1检查下一页按钮是否disabled# 用F12查看最后一页的按钮class是否包含disablednext_btndriver.find_element(By.CSS_SELECTOR,.next-page)is_disableddisabledinnext_btn.get_attribute(class)# 方法2比较当前页和总页数total_pagesint(driver.find_element(By.CSS_SELECTOR,.total-pages).text)current_pageint(driver.find_element(By.CSS_SELECTOR,.current-page).text)ifcurrent_pagetotal_pages:break# 方法3最稳妥——检查点击后URL或内容是否变化old_urldriver.current_url driver.find_element(By.CSS_SELECTOR,.next-page).click()time.sleep(1)ifdriver.current_urlold_url:break# 没翻动到最后一页了踩坑重点有些网站的下一页按钮虽然在页面上但是透明的或者被遮挡的。用【元素存在】判断通过但【点击】报元素不可点击。这时候需要先滚动到按钮可见区域店群矩阵自动化突破运营极限# 在点击前滚动到按钮位置btndriver.find_element(By.CSS_SELECTOR,.next-page)driver.execute_script(arguments[0].scrollIntoView(true);,btn)time.sleep(0.3)btn.click()第三步策略二——页码链接翻页有些网站没有下一页只有页码数字[1] [2] [3] [4] [5] ... [100]直接造URL如果URL规律明显第1页: https://example.com/list?page1 第2页: https://example.com/list?page2 ...# 最简单的方式循环拼URLbase_urlhttps://example.com/list?page{}forpageinrange(1,101):# 假设共100页urlbase_url.format(page)print(f正在采集第{page}页:{url})# 用影刀的【打开网页】或【发送HTTP请求】获取总页数再循环# 先从页面提取总页数total_pages_textdriver.find_element(By.CSS_SELECTOR,.total-pages).text total_pagesint(total_pages_text)# 共100页 → 100forpageinrange(1,total_pages1):# 处理每一页pass第四步策略三——加载更多翻页点击加载更多按钮新数据追加到当前页底部不是跳转到新页面影刀流程 循环开始设最大次数防止死循环 【IF条件】→ 【元素存在】加载更多按钮 【点击元素】→ 加载更多按钮 【等待】→ 1秒等新数据加载 否则 【跳出循环】注意加载更多不改变当前URL数据是追加的。你在采集时需要保留之前采集到第几个的索引避免重复采集# 记录已采集数量processed_count0for_inrange(50):# 最多加载50次# 获取当前所有数据all_itemsdriver.find_elements(By.CSS_SELECTOR,.item)# 只处理新增的数据new_itemsall_items[processed_count:]foriteminnew_items:# 处理新数据passprocessed_countlen(all_items)# 尝试点击加载更多try:load_more_btndriver.find_element(By.CSS_SELECTOR,.load-more)ifload_more_btn.is_displayed():load_more_btn.click()time.sleep(1.5)else:breakexcept:break第五步策略四——无限滚动翻页页面滚动到底部自动加载没有按钮defscroll_and_collect(driver,max_scrolls100):滚动到底部采集数据直到没有新数据last_heightdriver.execute_script(return document.body.scrollHeight)processed_count0no_change_count0for_inrange(max_scrolls):# 滚动到底部driver.execute_script(window.scrollTo(0, document.body.scrollHeight);)time.sleep(2)# 等待新内容加载# 检查页面高度是否变化new_heightdriver.execute_script(return document.body.scrollHeight)ifnew_heightlast_height:no_change_count1ifno_change_count3:# 连续3次没新内容到底了breakelse:no_change_count0last_heightnew_height# 采集所有数据all_itemsdriver.find_elements(By.CSS_SELECTOR,.item)returnall_items针对特定容器的滚动有些页面不是body滚动是某个div滚动# 滚动指定容器containerdriver.find_element(By.CSS_SELECTOR,.list-container)driver.execute_script(arguments[0].scrollTop arguments[0].scrollHeight,container)第六步策略五——URL规律翻页最高效如果URL有明显的页码规律跳过页面交互直接造URL# 常见URL翻页模式patterns[https://example.com/list?page{},# ?page2https://example.com/list?p{}size50,# ?p2size50https://example.com/list/{}/,# /list/2/https://example.com/list?offset{},# ?offset50偏移量https://example.com/list_{}.html,# /list_2.html]# 批量生成URLbase_urlhttps://example.com/list?page{}size20urls[base_url.format(i)foriinrange(1,51)]# 生成50页URL# 在影刀中用ForEach遍历URL列表效率最高第七步策略六——API翻页最专业用F12的Network面板发现翻页用的是API接口直接调接口翻页importrequestsdefcollect_via_api(base_url,total_pages,headers):通过API翻页采集all_data[]forpageinrange(1,total_pages1):params{page:page,size:50,sort:create_time}resprequests.get(base_url,paramsparams,headersheaders,timeout10)ifresp.status_code200:dataresp.json()itemsdata.get(data,{}).get(list,[])all_data.extend(items)# 检查是否最后一页iflen(items)50orpagedata.get(data,{}).get(totalPages,0):breakelse:print(f第{page}页请求失败:{resp.status_code})breakreturnall_data有什么坑坑一翻页和采集的顺序搞反现象先翻页再采集上一页的数据——数据全丢了。正确顺序永远是temu店群自动化报活动案例循环开始 1. 采集当前页数据 2. 检查是否有下一页 3. 有翻页 → 等待加载 → 回到1 4. 没有跳出循环坑二下一页按钮点击后没等加载就继续现象点击下一页后立刻获取元素拿到的还是上一页的数据。解决翻页后必须等待页面变化。验证方式是检查某个标识性元素比如第一行的文本是否变化了# 翻页前记录first_item_textdriver.find_element(By.CSS_SELECTOR,.item:first-child .title).text# 点击下一页driver.find_element(By.CSS_SELECTOR,.next-page).click()# 等待第一行变化for_inrange(30):time.sleep(0.3)current_textdriver.find_element(By.CSS_SELECTOR,.item:first-child .title).textifcurrent_text!first_item_text:break# 翻页成功坑三加载更多按钮点完后消失现象多次点击加载更多后按钮不见了但你以为还会出现流程一直等。解决设置一个合理的最大循环次数同时检查按钮是否还存在且可用max_clicks30foriinrange(max_clicks):buttonsdriver.find_elements(By.CSS_SELECTOR,.load-more)ifnotbuttonsornotbuttons[0].is_displayed():break# 按钮没了到底了buttons[0].click()time.sleep(1)坑四无限滚动触发过快现象滚动太快页面还没加载就又滚了导致加载失败。原因滚动触发了加载请求但新数据还没渲染出来你又滚了一次触发了新的请求。多次并发请求可能导致数据错乱。解决滚动后等2-3秒检查数据是否真的变多了再继续。坑五URL中含有不可预测的参数现象URL中除了page参数还有_t时间戳或tokenxxx直接拼URL翻页失败。解决保留第一页URL中的其他参数只替换页码部分importre urlhttps://example.com/list?page1_t1710464425tokenabc123# 只替换page参数保留其他参数urlre.sub(rpage\d,fpage{new_page},url)总结翻页策略的选择优先级——API翻页 URL规律翻页 下一页按钮 “加载更多” 无限滚动。越往左效率越高、稳定性越好。能用接口就别用页面能用URL就别点按钮。