Python网页爬取执行耗时过长问题排查与优化咨询
爬取纳斯达克机构持仓表格的问题分析与优化方案
你的代码存在的几个关键问题
- 拼写错误:
job1里的参数写成了classs_,正确应该是class_,这会导致job1直接返回None,后续所有链式调用都会失效,这是核心错误之一。 - 反爬拦截:直接用
requests.get请求纳斯达克网站,没有携带任何请求头,网站会识别为爬虫,要么返回慢、要么返回空页面,这是你耗时久的主要原因。 - ResultSet调用错误:
job5.findAll(...)返回的是ResultSet(列表类型),你直接用job6.find(...),列表没有find方法,这里会直接报错。 - 文本获取错误:
job11.findAll('tr', ...)返回的是多个tr元素的列表,列表没有.text属性,无法直接获取文本。 - 冗余的逐层查找:逐层嵌套查找不仅代码冗余,而且一旦中间某个节点找不到,整个流程就断了,还会降低解析效率。
优化方案与修正代码
核心优化点
- 添加请求头:模拟浏览器发送请求,避免被反爬拦截
- 简化选择器:使用CSS选择器直接定位目标表格,跳过无关层级,提升解析速度
- 错误处理:添加异常判断,避免节点找不到导致崩溃
- 正确遍历元素:对ResultSet进行遍历,逐个提取内容
修正后的代码
from bs4 import BeautifulSoup import requests # 模拟浏览器请求头 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } try: # 发送请求,设置超时避免卡住 response = requests.get('https://www.nasdaq.com/market-activity/stocks/aapl/institutional-holdings', headers=headers, timeout=10) response.raise_for_status() # 检查请求是否成功 soup = BeautifulSoup(response.text, 'lxml') # 直接用CSS选择器定位目标tbody,跳过冗余层级 tbody = soup.select_one('div.institutional-holdings__section--active-positions table.institutional-holdings__table tbody') if tbody: rows = tbody.find_all('tr', class_='institutional-holdings__row') for row in rows: # 提取每行的单元格文本 cells = row.find_all('td') row_data = [cell.get_text(strip=True) for cell in cells] print(row_data) else: print("未找到目标表格") except requests.exceptions.RequestException as e: print(f"请求出错: {e}") except Exception as e: print(f"解析出错: {e}")
代码说明
- 请求头:
User-Agent让网站认为是浏览器访问,避免被拦截 - CSS选择器:
div.institutional-holdings__section--active-positions直接定位到"Active Positions"所在的区块,再找到里面的表格tbody,比逐层查找高效得多 - 超时设置:
timeout=10避免请求卡住无响应 - 异常处理:捕获请求和解析过程中的错误,方便排查问题
- 文本提取:遍历每行单元格,用
get_text(strip=True)去除多余空格,得到干净的数据
内容的提问来源于stack exchange,提问作者kiestuthridge23
相关产品推荐
相关产品推荐

