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

Scrapy新手求助:从ng-href提取文本及无限滚动网站选择器编写

问题1:如何使用Scrapy从ng-href中提取文本?

ng-href是Angular框架的属性,Scrapy可直接通过选择器定位该属性并提取内容:

  • CSS选择器方式:用::attr(ng-href)获取属性值,示例代码:

    # 提取单个元素的ng-href值
    ng_href_value = response.css('a[ng-href]::attr(ng-href)').get()
    # 提取所有符合条件的ng-href值
    all_ng_href_values = response.css('a[ng-href]::attr(ng-href)').getall()
    
  • XPath选择器方式:通过@ng-href定位属性,示例代码:

    ng_href_value = response.xpath('//a/@ng-href').get()
    all_ng_href_values = response.xpath('//a/@ng-href').getall()
    

注意:如果ng-href是JS动态生成的,静态爬取无法获取,需结合Selenium/Playwright等工具渲染页面后再提取。


问题2:无限滚动房产网站的内容提取指导

针对无限滚动网站,结合Scrapy新手需求,分两步解决:

一、处理无限滚动加载

无限滚动通常通过AJAX请求加载后续数据,有两种处理思路:

  1. 直接爬取AJAX接口:
    • 打开浏览器开发者工具(F12),切换到「Network」面板,滚动页面找到XHR/Fetch类型请求;
    • 分析请求的URL参数(如页码、偏移量)和返回的JSON数据,直接用Scrapy发送请求解析JSON,效率更高。
  2. 模拟浏览器滚动渲染:
    • 用Scrapy结合Selenium或Playwright,模拟滚动动作加载所有内容后提取。示例(Selenium):
      from scrapy import Spider
      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
      
      class PropertySpider(Spider):
          name = 'property'
          start_urls = ['目标网址']
      
          def __init__(self):
              self.driver = webdriver.Chrome()
      
          def parse(self, response):
              self.driver.get(response.url)
              # 模拟滚动到底部,可循环多次直到无新内容
              self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
              # 等待新内容加载
              WebDriverWait(self.driver, 10).until(
                  EC.presence_of_element_located((By.CLASS_NAME, 'property-item'))
              )
              # 获取渲染后的页面源码
              rendered_html = self.driver.page_source
              # 用Scrapy Selector解析
              from scrapy.selector import Selector
              sel = Selector(text=rendered_html)
              # 提取数据
              for item in sel.css('div.property-item'):
                  yield {
                      'company_name': item.css('.company-name::text').get(default=''),
                      'details': item.css('.property-details p::text').getall()
                  }
              self.driver.quit()
      

二、选择器编写技巧

  1. 先定位父容器:找到包含单条房产信息的父元素(如div.property-item),再从父元素内提取子节点,避免全局匹配混乱。
  2. 用Scrapy Shell调试:命令行输入scrapy shell 目标网址,交互式测试CSS/XPath选择器,验证是否能正确获取内容,比如:
    scrapy shell https://example.com/properties
    # 测试公司名称选择器
    response.css('.property-item .company-name::text').get()
    
  3. 处理动态内容:如果选择器无法匹配,检查元素是否为JS动态生成,此时需用渲染工具获取完整页面后再解析。

内容的提问来源于stack exchange,提问作者Osama Abozaid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 00:24:31