Python网页抓取疑难:静态URL翻页数据获取方案咨询
解决无URL变化的拍卖数据批量抓取问题
当切换页面URL不变时,说明网站采用异步请求(AJAX)或表单提交加载数据,翻页参数(如页码、每页条数)通过请求体传递而非URL。以下是具体解决步骤:
1. 先抓包分析请求逻辑
打开浏览器开发者工具(F12),切换到Network标签:
- 刷新目标页面,点击翻页按钮,观察新出现的请求(优先看
XHR/Fetch类型) - 查看该请求的请求方法(POST/GET)、Form Data(或Query参数),重点记录页码参数(如
pageNumber)、每页条数(如itemsPerPage),以及页面中可能存在的隐藏验证参数(如CFM页面的会话令牌)
2. 用requests+Pandas批量抓取(含BeautifulSoup辅助)
如果网站需要隐藏参数验证,BeautifulSoup用于提取页面中的必填字段;若无需验证,直接模拟请求即可。示例代码如下:
import requests import pandas as pd from bs4 import BeautifulSoup import time # 基础配置 base_url = "https://denver.coloradotaxsale.com/index.cfm?folder=auctionResults&mode=preview" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } total_items = 3000 items_per_page = 50 # 按实际抓包结果调整每页条数 total_pages = (total_items + items_per_page - 1) // items_per_page # 初始化会话,保持Cookie session = requests.Session() initial_res = session.get(base_url, headers=headers) # 提取页面隐藏参数(如果抓包发现需要) soup = BeautifulSoup(initial_res.text, "html.parser") # 示例:假设页面有__VIEWSTATE这类验证字段,实际以抓包结果为准 # viewstate = soup.find("input", {"name": "__VIEWSTATE"})["value"] all_data = [] # 循环遍历所有页码 for page in range(1, total_pages + 1): # 构造请求参数(完全匹配抓包得到的Form Data) form_data = { "pageNumber": str(page), "itemsPerPage": str(items_per_page), # "__VIEWSTATE": viewstate # 若有则添加 } # 发送POST请求(若抓包显示是GET则用get方法) res = session.post(base_url, data=form_data, headers=headers) # 解析表格数据,保留你的清理逻辑 df = pd.read_html(res.content, header=1)[0] df = df.drop([0,1,2]) all_data.append(df) print(f"已完成第{page}/{total_pages}页抓取") time.sleep(1) # 添加间隔,避免触发反爬 # 合并所有数据并保存 final_df = pd.concat(all_data, ignore_index=True) final_df.to_csv("denver_auction_full_results.csv", index=False)
关键注意事项
- 务必严格匹配抓包得到的请求参数和方法,缺失参数会导致请求失败
- 加入请求间隔(如
time.sleep(1)),避免被网站封禁IP - 如果遇到验证码或复杂反爬,可能需要结合Selenium模拟浏览器操作,但优先尝试上述轻量方案
内容的提问来源于stack exchange,提问作者James Ho
相关产品推荐
相关产品推荐

