如何用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,提问作者새러엄
相关产品推荐
相关产品推荐

