使用Beautiful Soup爬取网站表格:为何仅返回229行?如何获取全部数据
解决动态加载表格数据爬取不全的问题
问题根源
你遇到的是典型的动态内容加载问题:目标网站的表格数据并非一开始就嵌入在静态HTML里,而是通过JavaScript在页面加载后(比如滚动页面触发)从后端接口拉取并渲染的。直接用requests.get()只能获取页面初始的静态HTML,自然拿不到后续加载的内容,所以数据行数远少于浏览器中看到的。
两种可行解决方案
方案1:直接调用后端数据接口(推荐)
打开浏览器开发者工具(F12),切换到「网络」标签,刷新页面后滚动到底部,观察XHR/fetch类型的请求,找到返回服务数据的接口(通常是JSON格式)。直接请求这个接口能高效获取完整数据:
import pandas as pd import requests # 替换为你在开发者工具中找到的真实API接口地址 api_url = "https://sosyalkedi.com/api/services" response = requests.get(api_url) data = response.json() # 根据接口返回的JSON结构整理成DataFrame df = pd.DataFrame(data) print(df.head()) print(f"总数据行数:{len(df)}")
方案2:用浏览器自动化工具渲染完整页面
如果找不到接口或接口有反爬限制,就用playwright或selenium模拟浏览器加载页面,等所有数据渲染完成后再解析:
import pandas as pd from playwright.sync_api import sync_playwright from bs4 import BeautifulSoup with sync_playwright() as p: browser = p.chromium.launch(headless=False) # 设置headless=True可后台运行 page = browser.new_page() page.goto("https://sosyalkedi.com/services") # 滚动到页面底部,触发所有数据加载 page.evaluate("window.scrollTo(0, document.body.scrollHeight)") page.wait_for_timeout(2000) # 等待2秒确保数据加载完成 # 获取渲染后的完整HTML html = page.content() browser.close() # 后续解析逻辑和你原来的代码一致 soup = BeautifulSoup(html, "html.parser") all_data = [] for tr in soup.select("tr:not(:has(td[colspan], th))"): prev = tr.find_previous("td", attrs={"colspan": True}) tds = [td.get_text(strip=True) for td in tr.select("td")] all_data.append([prev.get_text(strip=True), *tds[:5]]) df = pd.DataFrame( all_data, columns=["Parent", "ID", "Servis", "1000 adet fiyatı", "Minimum Sipariş", "Maksimum Sipariş"], ) print(df.head()) print(f"总数据行数:{len(df)}")
注意事项
- 使用
playwright需要先安装依赖:pip install playwright,再运行playwright install安装浏览器驱动。 - 若网站有反爬机制,可添加自定义请求头、设置随机延迟或使用代理规避限制。
内容的提问来源于stack exchange,提问作者luthierz
相关产品推荐
相关产品推荐

