Scrapy爬取LeadHome网站仅爬取无数据返回问题求助
排查Scrapy爬虫无条目返回的问题
我来帮你拆解下这个问题——这种在Scrapy Shell里能正常拿到数据,但正式爬虫跑起来却没有任何条目返回的情况,通常是由以下几个常见原因导致的:
请求头差异触发反爬
Scrapy Shell默认的请求头和爬虫默认的请求头可能存在细微差异,部分网站会通过校验User-Agent等字段来拦截爬虫请求。你可以试试在项目的settings.py里添加浏览器风格的请求头:DEFAULT_REQUEST_HEADERS = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'en-US,en;q=0.5', }加完之后再运行爬虫,看看是否能拿到数据。
动态类名导致选择器失效
你用的CSS选择器div.search__PropertyCardWrapper-sc-1j5dndx-0.bsqBpI里包含了类似sc-1j5dndx-0、bsqBpI这种动态生成的哈希类名,这类类名是React、Vue等前端框架自动生成的,很可能会随着网站更新而变化。你在Shell测试时类名是有效的,但爬虫运行时可能已经被替换了。
解决办法是换用更稳定的选择器,比如基于页面的固定属性(比如data-testid)或者结构特征:# 示例:假设卡片有固定的data-testid属性 for prop in response.css('div[data-testid="property-card"]'): link = 'https://www.leadhome.co.za' + prop.css('a::attr(href)').get() # 后续逻辑...或者用XPath保留不变的类名前缀,去掉动态哈希部分:
for prop in response.xpath('//div[contains(@class, "search__PropertyCardWrapper")]'): # 后续逻辑...分页逻辑存在漏洞
你获取下一页页码的XPath可能不符合页面实际结构,导致无法正确触发分页爬取,或者拼接的URL格式有误。建议直接抓取下一页的完整链接,而不是手动拼接:# 示例:直接定位下一页按钮的href属性 next_page_link = response.xpath('//a[contains(text(), "Next")]/@href').get() if next_page_link: # 用response.follow自动处理域名拼接 yield response.follow(next_page_link, callback=self.parse)另外,你拼接URL时用了
&,虽然Scrapy的urljoin会自动转义,但最好直接写&page=更稳妥。快速调试技巧
为了精准定位问题,你可以在parse方法里加一些调试代码:- 打印响应状态码,确认请求是否成功:
print(f"Response status: {response.status}") - 打印匹配到的卡片数量:
print(f"Found {len(response.css('div.search__PropertyCardWrapper-sc-1j5dndx-0.bsqBpI'))} properties") - 保存响应内容到本地文件,对比Shell里的页面:
打开这个HTML文件,看看是否包含你要找的房产卡片,就能快速判断是请求问题还是选择器问题了。with open('crawled_page.html', 'wb') as f: f.write(response.body)
- 打印响应状态码,确认请求是否成功:
内容的提问来源于stack exchange,提问作者saraherceg
相关产品推荐
相关产品推荐

