spider作用
在scrapy中,网页的链接的配置,抓取逻辑,解析逻辑都是在spider中完成的,简单的说spider完成了两件事:
- 定义网页爬取的动作
- 解析爬取下来的网页
spider运行流程
- 初始化url,初始化request,并设置回调方法callback
- 当reques成功请求并返回,将返回的respons作为参数传给回调方法
- 在callback回调方法中处理数据,返回的结果有两种,一种是直接解析,返回字典或者item对象,进行保存,或者是返回一个链接,并用此链接构造request,并设置新的回调方法,返回request
- 如果返回的是request,请求成功之后得到的response又会作为参数传给新的回调方法,进行解析,最后保存
spider类的分析
spider类默认了start_request方法实现,读取并请求start_urls属性,并将返回的结果调用parse方法解析结果
基础属性
属性 | 描述 |
---|---|
name | 爬虫名称 |
allowed_domains | 允许爬取的域名 |
start_uels | URL列表 |
常用方法
方法 | 描述 |
---|---|
start_requests | 生成初始请求 |
parse | 没有response回调方法时候,自动被调用 ,负责处理response |
closed | 当spider关闭时,被调用,定义释放资源的一些操作,或其他收尾操作 |
重写start_requests方法
spider会自动读取start_requests,然后生成request,并没有为request指定callback,然后会自动调用sparse方法。
因此,如果我们想要自定义初始请求,就可以在spider中重写start_requests。
spider发起post请求
当然除了发起get请求,还可以发送post请求,
post请求一般分为两种,一种是以FormData形式提交表单,一种是发送JSON数据
二者分别可以用,FormRequest和JsonRequest类实现。
request和response参数
在scrapy中,request对象实际上是指的scrapy.http.Request的一个实例,他包含了http请求的基本信息 ,
用这个request类可以构造request对象发送http请求,它会被engine交给Downloader进行处理,返回一个response对象
属性 | 描述 |
---|---|
url | 网页的链接 |
callback | reque回调方法,定义在spider类里面,并且需要一个response参数,如果不被指定,默认使用spider类里面的parse方法 |
method | request方法,默认为get还可以设置为post,put,delete等 |
meta | request请求携带的额外参数 |
body | request内容,即request body,往往request body 是post请求,我们可以使用Formrequest和Jesonrequest实现post请求 |
headers | Request headers,字典形式 |
cookies | request携带的cookie,字典和列表形式 |
prority | Request优先级,默认为0,这个优先级是给scheduler做request调度使用的,数值越大,优先级越高 |
dont_filter | request不去重 |
值得注意的是,meta参数是一个十分有用而且容易扩展的参数,它可以用字典的形式传递,包含的信息不受限制,所以scrapy的·插件·会·基于·meta参数做一些特殊的处理 |
在默认情况下,scrapy就预留了一些特殊的key作为特殊处理
比如request.meta[‘proxy’]可以用来设置请求时候的代理
request被downloader执行之后,就得到了一个downloader结果,它代表的是http响应之后的结果
属性 | 描述 |
---|---|
url | request url |
status | response状态码,如果请求成功就是200 |
headers | response headers,是一个字典 |
body | response body,结果是bytes类型 |
request | response对应的request对象 |
certificate | 代表SSL证书对象 |
ip_address | 代表服务器的ip地址 |
urljoin | 是一个url的处理方法,可以传入当前页面的url,该方法处理后返回的就是一个绝对的url |
follow/follow_all | 是一个根据url来生成后续request的方法,和直接构造request不同的是,该方法可以相对的url |