如何用BeautifulSoup获取klikdokter网站全部药品链接(含查看更多内容)
解决方案
问题原因
你当前使用的requests仅能获取页面首次加载的静态HTML内容,页面上「查看更多」按钮触发的是异步动态加载请求,这部分内容不会包含在初始的静态响应里,所以会出现内容遗漏。
可用修改方案
方案1:抓异步接口请求(优先推荐,效率更高)
操作步骤:
- 打开浏览器F12开发者工具,切换到「网络」面板,筛选「Fetch/XHR」请求
- 点击页面上任意「查看更多」按钮,查看触发的新请求,复制请求地址、请求头、参数规则
- 按参数规则构造所有分类的分页请求,直接拉取全量药品数据,不需要解析前端页面
方案2:使用自动化工具模拟浏览器操作
如果不想抓包,可以用Selenium、Playwright这类工具模拟真人点击「查看更多」按钮,等内容完全加载后再提取链接,示例代码如下(以Playwright为例):
from playwright.sync_api import sync_playwright from bs4 import BeautifulSoup AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 11_5_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.2 Safari/605.1.15' BASEURL = 'https://www.klikdokter.com/obat' with sync_playwright() as p: # 启动浏览器,调试时可把headless设为False显示浏览器界面 browser = p.chromium.launch(headless=True, user_agent=AGENT) page = browser.new_page() page.goto(BASEURL, wait_until='networkidle') # 按钮文本为印尼语,可根据实际页面展示替换定位规则 more_buttons = page.locator('text=Lihat Semua') for i in range(more_buttons.count()): try: more_buttons.nth(i).click(timeout=3000) # 等待内容加载完成 page.wait_for_load_state('networkidle') except: # 跳过点击失败的按钮,避免程序中断 continue # 拿到加载完成后的完整页面源码,用BeautifulSoup解析 soup = BeautifulSoup(page.content(), 'html.parser') for tag in soup.find_all('a', class_='topics-index--section__item-link'): href = tag.get('href') if href is not None: print(href) browser.close()
注意事项
- 构造请求时要保持和浏览器请求一致的User-Agent、Cookie等头信息,避免被反爬拦截
- 可以适当添加请求延迟,避免请求频率过高被封IP
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

