scrapy中需重写start_requests()创建request对象,url必须绝对,post请求有三种方式,推荐cb_kwargs传参,需配置errback处理异常,cookies可禁用或硬编码。

构造基础Request对象
在Scrapy爬虫中发起首次网络请求,必须显式创建Request实例,不能依赖start_urls自动触发回调时携带自定义参数。
第一步:在spider类中重写start_requests()方法,用yield返回scrapy.Request对象。
第二步:传入绝对URL(【相对URL会直接报错】),并指定callback参数指向解析函数,例如self.parse_list。
第三步:若需携带User-Agent等标识,通过headers参数传入字典,如{'User-Agent': 'Mozilla/5.0'};注意headers值必须是字符串或字符串列表,传入None会导致该头被完全忽略。
发送POST请求的三种方式
当目标接口要求提交表单、JSON或二进制数据时,必须使用POST方法,且body与headers配合错误将导致400或415状态码。
方法一:用scrapy.Request + method='POST' + body
直接传入序列化后的bytes数据,body=json.dumps(data).encode('utf-8'),同时设置headers={'Content-Type': 'application/json'};【body必须是bytes类型,传str会静默转为空】。
方法二:用scrapy.FormRequest提交键值对
适用于传统HTML表单,formdata={'username': 'admin', 'password': '123'}会自动url编码并设为Content-Type: application/x-www-form-urlencoded。
方法三:用FormRequest.from_response()模拟页面登录
先获取含
向回调函数安全传递数据
避免把临时变量塞进meta字典造成中间件污染或键名冲突,Scrapy 1.7+起应优先使用cb_kwargs机制。
① 在发出Request时,用cb_kwargs参数传入一个字典,例如cb_kwargs={'category': 'news', 'page': 2}。
② 回调函数签名必须匹配,def parse_item(self, response, category, page): —— 参数顺序无关,但名称必须与cb_kwargs键一致。
③ 这种方式绕过meta传递链,不参与去重、不被DownloaderMiddleware修改,适合传业务关键参数。
处理请求失败与异常
网络抖动、目标服务器宕机、DNS解析失败等都会中断请求流程,不配置errback将导致任务静默丢失。
在scrapy.Request中添加errback=self.handle_failure参数,指向一个接受Failure对象的函数。
handle_failure(self, failure)函数内可调用failure.check(HttpError)判断是否为HTTP错误,或failure.check(DNSLookupError)捕获域名解析失败;【failure.value未被try/except包裹,直接打印会崩溃】。
控制Cookie与会话行为
默认情况下Scrapy启用CookiesMiddleware,自动管理Set-Cookie与后续请求的Cookie头,但某些场景需主动干预。
若要禁用某次请求的Cookie合并(比如切换账号),在meta中加入{'dont_merge_cookies': True}。
若要为单次请求硬编码Cookie,用cookies参数传dict(如{'sessionid': 'abc123'})或cookie字典列表(支持domain/path等字段);注意此方式不会更新全局CookieJar。











