You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用BeautifulSoup爬取分页时URL不改变的网站?

解决URL无变化的分页爬取问题(结合BeautifulSoup)

嘿,我完全懂你被这个问题卡一天的烦躁——这种分页时URL纹丝不动的网站,确实比带page=1这类明参数的要绕点弯,但用BeautifulSoup完全能搞定,关键是抓对它的分页请求逻辑!

从你给出的代码能看出来,这个网站是用POST请求+表单参数来加载不同分页的,而不是把页码拼在URL里。核心就是data字典里的nowPage字段,你改这个值,就能拿到对应页码的内容。下面给你一步步拆解怎么结合BeautifulSoup实现完整爬取:

1. 核心逻辑:动态修改POST表单的页码参数

你已经拿到了正确的请求头、Cookie和参数结构,只需要把nowPage改成你要爬的页码,就能请求到对应页面的HTML。

2. 结合BeautifulSoup解析响应

拿到POST返回的HTML后,就和普通爬取流程一样,用BeautifulSoup提取你需要的内容——比如开奖号码、期数这些数据。

3. 实现循环爬取多页

设置好要爬的页码范围,循环修改nowPage,依次发送请求、解析、保存数据就行。

完整示例代码

import requests
from bs4 import BeautifulSoup
import time  # 用来控制请求频率,避免被封

# 你的Cookie和请求头,注意Cookie可能会过期,过期了要从浏览器重新拿
cookies = {
    'WMONID': 'smDC5Ku5TeX',
    'userId': 'robin9634',
    'UID': 'robin9634',
    'JSESSIONID': 'lLqLdHFEk4iEJdQ2HCR5m05tg6ZIxBdegEamDzxeEoTClkvqVDN4xzXeMPtTIN3e.cG9ydGFsX2RvbWFpbi9wZDU=',
}
headers = {
    'Connection': 'keep-alive',
    'Cache-Control': 'max-age=0',
    'Upgrade-Insecure-Requests': '1',
    'Origin': 'https://dhlottery.co.kr',
    'Content-Type': 'application/x-www-form-urlencoded',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
    'Sec-Fetch-Site': 'same-origin',
    'Sec-Fetch-Mode': 'navigate',
    'Sec-Fetch-User': '?1',
    'Sec-Fetch-Dest': 'document',
    'Referer': 'https://dhlottery.co.kr/gameInfo.do?method=powerWinNoList',
    'Accept-Language': 'ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7',
}
params = (
    ('method', 'powerWinNoList'),
)

# 定义爬取范围:比如从第1页到第10页
start_page = 1
end_page = 10

for page_num in range(start_page, end_page + 1):
    try:
        # 动态设置当前页码
        data = {
            'nowPage': str(page_num),
            'searchDate': '20200909',
            'calendar': '2020-09-09',
            'sortType': 'num'
        }
        
        # 发送POST请求
        response = requests.post(
            'https://dhlottery.co.kr/gameInfo.do',
            headers=headers,
            params=params,
            cookies=cookies,
            data=data
        )
        response.raise_for_status()  # 检查请求是否成功
        
        # 解析HTML
        soup = BeautifulSoup(response.text, 'html.parser')
        
        # 这里替换成你实际要提取的内容,比如开奖表格数据
        # 示例:提取每期的期数和开奖号码
        table_rows = soup.select('table.tbl_data tbody tr')
        for row in table_rows:
            cols = row.find_all('td')
            if cols:
                period = cols[0].get_text(strip=True)
                win_numbers = [col.get_text(strip=True) for col in cols[1:6]]
                print(f"第{period}期: {' '.join(win_numbers)}")
        
        # 每爬一页歇1秒,别给服务器太大压力
        time.sleep(1)
        
    except Exception as e:
        print(f"爬取第{page_num}页出错: {str(e)}")
        continue

几个重要注意事项

  • Cookie有效期:你当前用的Cookie可能会过期,如果之后请求返回403或者登录页面,记得打开浏览器重新登录网站,复制最新的Cookie过来替换。
  • 请求频率控制:一定要加time.sleep(),不然短时间内大量请求很容易被网站封禁IP。
  • 表单参数灵活性:如果要爬不同日期范围的数据,记得修改searchDate和calendar这两个参数,它们和nowPage一样是控制返回内容的关键。
  • 异常处理:代码里加了try-except块,能避免某一页爬取失败导致整个程序崩溃,你还可以根据需要扩展异常类型(比如超时、连接错误等)。

内容的提问来源于stack exchange,提问作者새러엄

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 08:42:49