Python Scrapy运行c21.py脚本无法填充item、无爬取数据返回问题排查
问题原因
rules属性类型错误。Scrapy的CrawlSpider要求rules必须为列表类型,你代码中错误使用了大括号{}定义为集合类型,导致规则完全未生效,爬虫爬完起始页后没有执行任何链接提取和跟进逻辑,直接结束运行。- 详情页匹配规则过严。你设置的
allow=r'/propiedad/4'仅能匹配路径中包含/propiedad/4的链接,绝大多数房源详情页不会命中该规则,即便规则生效也很难匹配到可爬取的详情页。 - 可选优化点:你在类中直接定义的
user_agent可能未生效,部分反爬站点会拦截Scrapy默认UA的请求,不过从你提供的日志看起始页返回200,所以这个不是本次的核心问题。
修复方案
第一步:修改代码核心错误
修正后的完整代码如下:
from scrapy.item import Field, Item from scrapy.spiders import CrawlSpider, Rule from scrapy.linkextractors import LinkExtractor from scrapy.loader import ItemLoader class inmueble(Item): link = Field() precio = Field() class QuotesSpider(CrawlSpider): name='century21' allowed_domains=['century21mexico.com'] start_urls=['https://century21mexico.com/busqueda/tipo_departamento-o-penthouse/operacion_venta/uso_habitacional/'] # 配置自定义UA确保不会被反爬拦截 custom_settings = { 'USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36', } # 1. 把大括号改为列表/元组格式 rules = ( Rule(LinkExtractor(allow=r'/pagina_'), follow=True), # 2. 修改详情页匹配规则,匹配所有/propiedad/开头的链接,callback规则不需要额外加follow=True Rule(LinkExtractor(allow=r'/propiedad/'), callback='parse_item'), ) def parse_item(self, response): item = ItemLoader(item=inmueble(), response=response) item.add_value('link', response.request.url) item.add_xpath('precio', '//*[@class="col-sm-12 h5"][2]/text()') yield item.load_item()
第二步:执行命令调整
运行时可以添加输出参数直接查看爬取结果:
scrapy runspider c21.py -o result.csv
执行后会在脚本同级目录生成result.csv文件,里面就是你需要的link和precio字段内容。
内容的提问来源于stack exchange,提问作者Ramiro Guzmán
相关产品推荐
相关产品推荐

