必须准确访问scrapy response对象内容:1.用response.body获原始字节,response.text获解码文本;2.检查response.encoding是否正确;3.用response.url和status确认来源与状态;4.通过xpath/css方法提取数据,优先用.get()/.getall();5.用response.urljoin()构造下一页绝对url。

要快速提取网页数据,必须准确访问Scrapy Response对象中封装的响应内容,否则xpath或css选择器会因找不到文本而返回空列表。
获取响应原始字节和解码后文本
第一步:用 response.body 获取原始二进制内容,这是未经解码的 bytes 类型数据,直接打印会出现乱码或 b'...' 前缀;
第二步:用 response.text 获取已解码的字符串,它等价于 response.body.decode(response.encoding);
第三步:检查 response.encoding 的值,若为 【None】 或明显错误(如 'utf-8' 但页面实际是 'gbk'),后续所有 .text 和选择器提取都可能出错;
这一步操作起来很简单,直接在 parse 函数里打印 response.encoding 就能验证。
定位响应来源与状态
用 response.url 确认当前处理的是哪个地址的响应——重定向后该值会更新为最终跳转地址,不是你最初 request 的 url;
response.status 返回 int 类型状态码,200 表示成功,404/500 等需在回调中主动判断并跳过解析;
注意:若未显式处理非 200 状态,parse 函数仍会被调用,可能导致 xpath 提取报错或写入脏数据。
提取结构化数据的核心入口
方法一:调用 response.selector 获取 Selector 对象,再使用 .xpath() 或 .css() 方法;
方法二:直接在 response 上调用 response.xpath(),Scrapy 会自动代理到 selector;
方法三:用 response.css() 快速按 CSS 选择器提取,例如 response.css('title::text').get() 取标题文本;
【.get() 和 .getall() 替代了旧版 .extract_first() 和 .extract()】,新项目请统一使用前者,避免兼容性问题。
构造下一页绝对 URL
当页面中分页链接是相对路径(如 href="/page/2" 或 href="next.html")时,不能直接拼接域名;
调用 response.urljoin("next.html"),Scrapy 会基于当前 response.url 自动补全协议、域名和路径前缀;
这比手动用 urllib.parse.urljoin 更可靠,因为它已内置对 base 标签、响应 headers 中 Location 字段的兼容逻辑。











