如何为需要身份认证的多页URL编写爬虫for循环实现分页采集
多页URL爬虫采集实现
需求说明
- 需要通过for循环实现多页URL的爬虫采集,由于代码涉及身份认证,此处使用示例URL演示,核心分页标识为
currentPage=1 - 第i页对应的URL参数为
currentPage=i,i取值为正整数1、2、3、4…… - 原有代码仅支持单页数据采集,需改造为支持多页批量采集
优化后完整代码
原有代码存在单页硬编码、全局变量存储数据易覆盖的问题,修改后可直接实现多页采集:
import requests from requests.adapters import HTTPAdapter from requests.packages.urllib3.util.retry import Retry import urllib3 import pandas as pd from requests_kerberos import OPTIONAL, HTTPKerberosAuth import web # 重试会话复用逻辑保留 def requests_retry_session(retries=10, backoff_factor=0.3, status_forcelist=(500, 502, 503, 504), session=None): session = session or requests.Session() retry = Retry(total=retries, read=retries, connect=retries, backoff_factor=backoff_factor, status_forcelist=status_forcelist) adapter = HTTPAdapter(max_retries=retry) session.mount("http://", adapter) session.mount("https://", adapter) return session # 初始化认证cookie a = web.get_mwinit_cookie() # 爬虫函数修改为返回单页数据,取消全局变量 def Scraper(url): urllib3.disable_warnings() with requests_retry_session() as req: resp = req.get(url, timeout=30, verify=False, allow_redirects=True, auth=HTTPKerberosAuth(mutual_authentication=OPTIONAL), cookies=a) data = pd.read_html(resp.text, flavor=None, header=0, index_col=0) return pd.concat(data, sort=False) if __name__ == "__main__": # 此处配置需要采集的最大页码 max_page = 10 # 示例URL基础模板,用%s占位分页参数位置 base_url = "https://example-url.com/ABCD/customer?currentPage=%s&end" # 存储所有页数据的列表 all_data = [] for page in range(1, max_page + 1): # 拼接当前页URL current_url = base_url % page print(f"正在采集第{page}页:{current_url}") page_df = Scraper(current_url) all_data.append(page_df) # 合并所有页数据为总表 total_df = pd.concat(all_data, ignore_index=True, sort=False) # 打印/导出总表 print(total_df) # 可选导出为Excel:total_df.to_excel("采集结果.xlsx")
核心修改说明
- 取消了原函数的全局变量
df,改为每个分页采集完成后返回当前页的DataFrame,避免数据覆盖 - 新增了URL模板,通过for循环动态拼接每一页的
currentPage参数 - 用列表存储所有分页的DataFrame,最后统一合并为全量数据,性能更优
- 修正了原代码中
HTTPAuth拼写错误,替换为导入的HTTPKerberosAuth,补全了URL的引号和请求参数问号分隔符
内容的提问来源于stack exchange,提问作者Jean123
相关产品推荐
相关产品推荐

