无法从网页表格导入数据:Scrapy爬取FundsExplorer表格求助
解决FundsExplorer FII排名数据爬取问题
你的问题核心在于目标网站的表格是JavaScript动态加载的,直接请求静态页面无法获取到表格内容,而且原代码的CSS选择器也没有定位到正确的元素(静态响应里根本不存在这个表格)。下面是两种可行的解决方法:
方法一:直接调用后台API(推荐)
这类网站通常会通过AJAX请求后台API获取数据,比爬取渲染后的HTML更高效稳定。通过浏览器开发者工具的「网络」面板可以找到数据接口,该网站的FII排名数据接口返回JSON格式,直接解析即可:
import scrapy class FiispiderSpider(scrapy.Spider): name = "fiispider" allowed_domains = ["fundsexplorer.com.br"] # 直接请求API接口而非页面URL start_urls = ["https://www.fundsexplorer.com.br/wp-json/funds/v1/ranking"] def parse(self, response): # 解析JSON响应 data_list = response.json() for item in data_list: # 提取你需要的字段,示例提取名称、代码、最近12个月收益率 yield { '名称': item.get('simple_name'), '代码': item.get('symbol'), '12个月收益率(%)': item.get('twelve_months') # 其他字段可根据API返回的JSON结构自行添加,比如'price'、'dy'等 }
方法二:使用Scrapy渲染JavaScript
如果必须爬取渲染后的页面,可以使用scrapy-splash工具模拟浏览器渲染JS。步骤如下:
- 安装依赖:
pip install scrapy-splash,并启动Splash服务(需Docker环境) - 修改爬虫代码,配置Splash请求:
import scrapy from scrapy_splash import SplashRequest class FiispiderSpider(scrapy.Spider): name = "fiispider" allowed_domains = ["fundsexplorer.com.br"] start_urls = ["https://www.fundsexplorer.com.br/ranking"] def start_requests(self): for url in self.start_urls: yield SplashRequest( url=url, callback=self.parse, args={'wait': 2} # 等待2秒让JS加载完成 ) def parse(self, response): # 现在可以定位到渲染后的表格行 rows = response.css('tr.default-fiis-table__row') for row in rows: yield { '名称': row.css('td:nth-child(2) a::text').get(), '代码': row.css('td:nth-child(1) span::text').get(), '当前价格': row.css('td:nth-child(3) span::text').get() # 根据表格列的位置调整选择器 }
注意事项
- 方法一的API接口可能会有更新,若失效可重新通过浏览器开发者工具抓包获取最新接口
- 爬取时请遵守网站的
robots.txt规则,避免请求过于频繁导致被封禁
内容的提问来源于stack exchange,提问作者gbonavina
相关产品推荐
相关产品推荐

