Python使用CSS选择器爬取商品标题返回NoneType问题求助
问题原因
- 你爬取的Weedmaps平台属于前端动态渲染站点,你用
requests发起请求拿到的仅为未执行JS的初始静态HTML源码,所有商品相关的DOM元素都是后续JS异步请求数据后渲染生成的,自然找不到对应元素返回None。 - 你所使用的CSS选择器中包含了前端框架自动生成的带随机哈希后缀的类名(比如
styles__NameRatingWrap-j5iyiv-15、content-wrapper__ContentWrapper-ljfebg-0中的随机串),这类类名会随站点版本更新随时变动,完全不适合作为定位元素的依据。 - Weedmaps配置了Cloudflare反爬机制,普通
requests请求大概率会被拦截返回验证页面,响应内容本身就不是正常的页面源码。
可行解决方案
方案1:直接调用站点公开API(最推荐)
你可以在浏览器开发者工具的「网络」面板筛选XHR/Fetch请求,就能找到官方的搜索、商品详情接口,返回结构是标准JSON,不需要解析DOM,开发效率和稳定性都高很多:
- 搜索商品接口返回的数据直接包含商品标题、链接、价格等所有你需要的字段,无需二次请求详情页
- 接口请求只需要补充必要的请求头、参数即可,不用处理页面渲染逻辑
方案2:使用无头浏览器渲染页面
如果你必须通过解析HTML获取数据,可以使用Selenium、Playwright这类支持JS渲染的工具,等待页面元素加载完成后再提取内容:
示例参考(Playwright):
from playwright.sync_api import sync_playwright def product_data(url): with sync_playwright() as p: browser = p.chromium.launch(headless=True) page = browser.new_page() page.goto(url) # 等待h1元素加载完成再提取,定位优先用语义化标签、固定属性,不要用带哈希的类名 title = page.locator("h1").first.inner_text() product = {'Title': title} browser.close() return product
内容的提问来源于stack exchange,提问作者SomeWhiteGuy
相关产品推荐
相关产品推荐

