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请求加载后续数据,有两种处理思路:
- 直接爬取AJAX接口:
- 打开浏览器开发者工具(F12),切换到「Network」面板,滚动页面找到XHR/Fetch类型请求;
- 分析请求的URL参数(如页码、偏移量)和返回的JSON数据,直接用Scrapy发送请求解析JSON,效率更高。
- 模拟浏览器滚动渲染:
- 用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()
- 用Scrapy结合Selenium或Playwright,模拟滚动动作加载所有内容后提取。示例(Selenium):
二、选择器编写技巧
- 先定位父容器:找到包含单条房产信息的父元素(如
div.property-item),再从父元素内提取子节点,避免全局匹配混乱。 - 用Scrapy Shell调试:命令行输入
scrapy shell 目标网址,交互式测试CSS/XPath选择器,验证是否能正确获取内容,比如:scrapy shell https://example.com/properties # 测试公司名称选择器 response.css('.property-item .company-name::text').get() - 处理动态内容:如果选择器无法匹配,检查元素是否为JS动态生成,此时需用渲染工具获取完整页面后再解析。
内容的提问来源于stack exchange,提问作者Osama Abozaid
相关产品推荐
相关产品推荐

