这是自己手动整理的一个Scrapy工作流程图和网络上找到的关于Scrapy的流程图,大家可以看看
Scrapy目录结构介绍:
下面介绍Scrapy五大核心组件
- DownloadMiddleware,下载中间件:它可以改写你发起的请求,也可以处理返回的数据(或者是当出现异常的时候进行一些处理)
-
官方文档位置:https://docs.scrapy.org/en/latest/topics/downloader-middleware.html
- 目前我接触到可以在中间件中添加IP代理池、UA池、对异常的返回结果(如对网站发起请求出现频繁后进行处理重新发起请求等)。
- 使用方法:
- 需要在Setting中开启中间件
- 在中间件中有3个方法可以调用
- process_request(request, spider)
- 返回None:不受影响(默认)
- 返回requests:Scrapy就会将这个request重新放回调度队列中
- 返回response:就会去调用process_response这个方法,处理相关的response
- Raise IgnoreRequest:就会去调用process_exception()这个方法,处理相应的异常
-
def process_response(self,request,response,spider): #改写response的状态码 response.status=201 return response
- process_response(request, response, spider):处理response的方法
- 返回response:没有什么影响,会继续执行其他中间件的process_response,可以在里面对response的信息进行一些改写。比如说这里就简单的将response的状态码进行改写
- 返回resquest:重新将这个request放回到队列中
- Raise IgnoreRequest:就会去调用process_exception()这个方法,处理相应的异常
- process_exception(request, exception, spider):处理异常的方法(比如超时异常,连接失败异常等,当出现这些异常的时候就会调用这个方法)
- 返回None:没有影响
- 返回response:就会执行其他中间件的process_response,并且不会再去执行相应的process_exception方法(返回response证明你已经成功得到结果了,不是异常)
- 返回resquest:将这个request请求重新加回到队列中,重新发起一次请求(这个比较常用)。这里的作用可以当做是一次失败的重试,可以在这个请求中加入一些代理,或者是其他的请求。
-
def process_exception(self,request,exception,spider): logger = logging.getLogger(__name__) self.logger.debug('GetException') request.meta['proxy']='http://120.41.224.226:8080' return request表示重新发起一次请求
-
也可以在下载中间件中设置不要对失败进行重新尝试的代码
- process_request(request, spider)
-
- Spider(爬虫):爬虫主要是来干活的,用于从返回的响应数据中解析出自己需要的数据信息,即所谓的实体(Item,用来返回给管道来处理)。用户也可以从中提取出其他的URL链接,让Scrapy进行抓取下一个页面。
- 它有以下几个属性
- name:启动Scrapy爬虫
- allowed_domains:允许爬取的网址(如只想爬取baidu.com下的baidu.com/xxx/xxx的内容,不需要如sogou.com/等其他网址时可以设置,目前我都是直接注释)
- start_urls:起始的URL(即发起请求的第一个URL地址,默认是调用到Scrapy已经默认写好的parse方法)
- custom_settings:该方法可以覆盖Settings.py文件中的配置)以字典的形式来书写,里面的键名就是settings.py里面的变量名
- start_requests:如果要设置一个只发起POST请求的爬虫,可以在里面设置,修改Method、回调函数等
- 进行如下配置后便不会再去使用默认的parse方法,而是使用你自己定义的parse_user方法
- 它有以下几个属性