如何抓取带ng-scope类的事件历史表格并转为DataFrame?
抓取Angular动态页面表格的解决方案
为什么你的代码没结果?
这个页面用Angular框架动态渲染内容,ng-scope是Angular的作用域标记类——页面初始加载的静态HTML里根本没有表格数据,所有内容都是后续通过JavaScript请求后端接口加载的。requests+BeautifulSoup只能抓取静态HTML,自然找不到目标元素。
方法1:用Selenium模拟浏览器抓取(新手友好)
Selenium可以模拟完整的浏览器环境,等待JavaScript渲染完成后再抓取内容,步骤如下:
安装依赖
先装Selenium和对应浏览器驱动(以Chrome为例):pip install seleniumChromeDriver要和你的Chrome版本匹配,下载后放到系统环境变量路径,或者在代码里指定路径。
可运行代码
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import pandas as pd # 初始化Chrome浏览器 driver = webdriver.Chrome() target_url = "https://portal.assessor.lacounty.gov/parceldetail/2004001003" driver.get(target_url) # 等待表格容器加载(最多等10秒) wait = WebDriverWait(driver, 10) # 定位带ng-scope的表格容器 table_wrap = wait.until(EC.presence_of_element_located((By.CLASS_NAME, "ng-scope"))) # 提取表格数据 table = table_wrap.find_element(By.TAG_NAME, "table") rows = table.find_elements(By.TAG_NAME, "tr") # 处理表头和行数据 headers = [th.text.strip() for th in rows[0].find_elements(By.TAG_NAME, "th")] table_data = [] for row in rows[1:]: cols = [td.text.strip() for td in row.find_elements(By.TAG_NAME, "td")] table_data.append(cols) # 转成DataFrame df = pd.DataFrame(table_data, columns=headers) print(df) # 关闭浏览器 driver.quit()
方法2:直接调用后端API(更高效)
打开浏览器开发者工具(F12)→ 切换到Network标签→ 刷新页面,查看XHR/fetch请求,能找到页面加载事件历史的接口(比如这个页面的接口是https://portal.assessor.lacounty.gov/api/Parcel/GetParcelEvents,参数带地块编号ain=2004001003)。直接请求接口拿JSON数据,再转DataFrame,比模拟浏览器快很多。
示例代码:
import requests import pandas as pd # 接口地址和参数(实际以抓包结果为准) api_url = "https://portal.assessor.lacounty.gov/api/Parcel/GetParcelEvents" params = {"ain": "2004001003"} # 模拟浏览器请求头,避免被拦截 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" } # 发送请求并解析数据 response = requests.get(api_url, params=params, headers=headers) event_data = response.json() # 转成DataFrame(假设返回的events字段是表格数据数组) df = pd.DataFrame(event_data["events"]) print(df)
注意事项
- Selenium驱动必须和浏览器版本一致,否则会启动失败。
- 调用API时,若请求被拦截,可从浏览器抓包结果里复制完整的请求头(包括Cookie、Referer等)加到代码里。
- 不要高频请求网站,遵守网站的反爬规则,避免IP被封禁。
内容的提问来源于stack exchange,提问作者sucksatmath
相关产品推荐
相关产品推荐

