使用Scrapy抓取瑞典booli.se:如何跟进房源链接提取房产信息
嘿,我来帮你搞定这个Booli.se的爬虫问题!看起来你已经能抓取列表页内容了,接下来要实现的「跟进房源链接提取详情」在Scrapy里是很常规的操作,用Request对象就能轻松搞定,我给你拆解下具体步骤和代码示例:
实现思路与代码示例
1. 从列表页提取房源详情链接
首先在你的爬虫的parse方法里,先抓取列表页上每个房源的详情URL,然后生成Request对象,把这些URL传进去,同时指定一个回调函数(比如parse_property)来处理详情页的数据。
import scrapy class BooliSpider(scrapy.Spider): name = 'booli' # 替换成你要爬取的目标列表页URL start_urls = ['https://www.booli.se/sok?locationIds=1770'] def parse(self, response): # 提取每个房源的详情链接(这里的CSS选择器需要根据页面实际结构调整) property_links = response.css('a.property-card__link::attr(href)').getall() for link in property_links: # 把相对路径转换成完整URL(如果提取的是相对路径的话) full_link = response.urljoin(link) # 生成Request,指定回调函数处理详情页 yield scrapy.Request(full_link, callback=self.parse_property) # 可选:添加翻页逻辑,爬取多页列表 next_page = response.css('a.pagination__next::attr(href)').get() if next_page: yield scrapy.Request(response.urljoin(next_page), callback=self.parse)
2. 编写详情页数据提取的回调函数
接下来写parse_property方法,这就是你要提取房价、房间数、房龄等属性的地方。注意你原来的代码里有个小笔误:item.ss应该是response.css(在回调函数里我们用详情页的response对象来提取数据)。
def parse_property(self, response): # 这里的CSS选择器需要你用浏览器开发者工具(F12)去Booli详情页实际核对 # 提取房价 price = response.css('.property-info__price::text').get() # 提取房间数 rooms = response.css('.property-info__rooms::text').get() # 提取房龄 year_built = response.css('.property-info__year-built::text').get() # 按照你的需求输出数据 yield { '房价': price.strip() if price else None, '房间数': rooms.strip() if rooms else None, '房龄': year_built.strip() if year_built else None # 可以继续添加其他你需要的属性 }
关键注意事项
- CSS选择器要准确:Booli的页面结构可能会更新,你一定要用浏览器开发者工具去检查详情页里各个元素的实际CSS路径,替换示例里的占位选择器。
- 处理相对路径:如果提取的房源链接是相对路径(比如
/bostad/123456),必须用response.urljoin(link)转换成完整URL,不然Scrapy无法正确请求。 - 数据清洗:提取到的文本可能带有多余空格、换行或特殊符号,用
strip()可以快速清理;如果需要更复杂的处理,比如提取纯数字房价,可以用正则表达式。 - 翻页逻辑:如果要爬取多页房源,别忘了添加示例里的翻页代码,让爬虫自动遍历所有列表页。
调试小技巧
你可以用scrapy shell快速测试选择器:在命令行输入scrapy shell https://www.booli.se/bostad/xxxxxx(替换成真实的详情页URL),然后在shell里输入response.css('你的选择器').get(),就能实时验证选择器是否能拿到正确数据。
这样就能实现你想要的逻辑:遍历列表页的所有房源链接,跟进后提取指定属性,最后输出结构化数据啦!
内容的提问来源于stack exchange,提问作者ghostfkrcb
相关产品推荐
相关产品推荐

