使用BeautifulSoup爬取Redfin数据时出现空DataFrame如何解决
错误原因及修复方案
核心错误点
- 列表页请求未携带headers,直接触发Redfin反爬策略,返回的不是正常房源页面,自然找不到对应元素
- 分页URL格式错误,Redfin的分页路径为
/page-页码,你写的_={page}后缀不符合平台规则,请求到的是404页面 - 存储数据的
productlinks和p列表放在了分页循环内部,每翻一页就会清空之前存储的所有数据,即使前面爬取到内容最后也会被清空 - 没有加异常捕获逻辑,一旦某个页面结构变动、或者单房源页没有对应价格元素,就会出现报错导致数据为空
修正后的代码
import requests from bs4 import BeautifulSoup import pandas as pd import time headers ={ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' } # 把列表定义到循环外部,避免数据被重置 productlinks=[] p=[] for page in range(1, 5): # 修正分页URL格式 url = f'https://www.redfin.com/city/5357/WA/Edmonds/page-{page}' # 列表页请求也加上headers r = requests.get(url, headers=headers) # 加延迟,避免触发反爬 time.sleep(2) soup=BeautifulSoup(r.content, 'html.parser') tra=soup.find_all('div',class_='bottomV2') for links in tra: try: link=links.find('a',href=True) comp=link['href'] abs_url = f'https://www.redfin.com{comp}' productlinks.append(abs_url) except: continue for link in productlinks: try: r =requests.get(link,headers=headers) time.sleep(1) soup=BeautifulSoup(r.content, 'html.parser') price=soup.find('div',class_='statsValue').text p.append(price) except: # 单页爬取失败跳过,避免整体数据为空 continue df = pd.DataFrame({'price':p}) print(df)
额外说明
Redfin反爬机制比较严格,如果修改后还是拿不到数据,可以替换更新版本的User-Agent,或者改用Selenium、Playwright等无头浏览器工具模拟真实用户操作爬取。
内容的提问来源于stack exchange,提问作者GX Mentor
相关产品推荐
相关产品推荐

