使用Requests+BeautifulSoup爬取Blocket网站无法获取完整商品数据问题
解决Blocket.se商品数据爬取失败问题
问题根源
- Blocket.se的商品列表是JavaScript动态渲染的,
requests仅能获取页面初始静态HTML,无法加载JS生成的商品数据区块,导致你找不到目标元素。 - 你代码中使用的类名(如
MediumLayout__BodyWrapper-sc-q6qal1-2 gYhFaY)是React框架生成的动态类名,这类名称会随网站更新频繁变化,完全依赖它们爬取数据稳定性极差。
可行解决方案
方案1:用Selenium模拟浏览器渲染
Selenium可以模拟真实浏览器的加载流程,获取完整渲染后的页面内容:
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 from bs4 import BeautifulSoup search_term = input("请输入搜索关键词: ") url = f"https://www.blocket.se/annonser/hela_sverige?q={search_term}" # 初始化Chrome浏览器(需提前安装对应版本的ChromeDriver) driver = webdriver.Chrome() driver.get(url) # 等待商品价格元素加载完成,最多等待10秒 try: WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, "Price__StyledPrice-sc-1v2maoc-1")) ) finally: page_source = driver.page_source driver.quit() # 解析渲染后的页面 soup = BeautifulSoup(page_source, "html.parser") price_elements = soup.find_all("div", class_="Price__StyledPrice-sc-1v2maoc-1") for price in price_elements: print(price.text.strip())
方案2:直接调用商品数据API(更高效)
通过浏览器开发者工具(F12)抓包,找到网站加载商品数据的API接口(通常是带有search关键词的接口,返回JSON格式数据),直接用requests请求该接口获取数据:
- 打开Network标签页,刷新页面,筛选XHR/fetch请求,找到包含商品列表的接口
- 复制接口URL和请求参数,用
requests发送请求,直接解析返回的JSON即可提取价格等信息,无需处理HTML
代码优化提示
- 避免使用动态生成的类名,优先选择网站提供的稳定标识(如
data-testid属性,很多站点会为核心元素添加测试ID) - 若坚持使用静态请求,检查页面的
<script>标签,部分网站会将初始商品数据内嵌在脚本中,可直接提取解析
内容的提问来源于stack exchange,提问作者D Danne
相关产品推荐
相关产品推荐

