You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 04:20:33