python--Scrapy模块的使用二


python--Scrapy模块的使用二

一:去除重复URL

DUPEFILTER_CLASS = 'scrapy.dupefilter.RFPDupeFilter'
DUPEFILTER_DEBUG = False
JOBDIR = "保存范文记录的日志路径,如:/root/"  # 最终路径为 /root/requests.seen

下面自定义ULR去重操作:(将原来在spider中的操作分解开来)

class RepeatDupeFilter(object):

    def __init__(self):
        self.visited_url = set()

    @classmethod
    def from_settings(cls, settings):
        """
        初始化时,调用,
        :param settings: 
        :return: 
        """
        return cls()

    def request_seen(self, request):
        """
        检测当前请求是否已经被访问过
        :param request: 
        :return: True表示已经访问过;False表示未访问过
        """
print('.......')
if request.url in self.visited_url: return True self.visited_url.add(request.url) return False def open(self): """ 开始爬去请求时,调用 :return: """ print('open') def close(self, reason): """ 结束爬虫爬取时,调用 :param reason: :return: """ print('close') def log(self, request, spider): """ 记录日志 :param request: :param spider: :return: """ print('repeat', request.url)

settings.py


二:pipeline补充

pipelines.py

ITEM_PIPELINES = {   #每一个spider都会经过下面所有的pipeline,我们可以根据参数spider对象对其进行处理,也可以设置是否返回item,来设置是否继续向下执行
'scrapyPro.pipelines.ScrapyproPipeline': 300,
   'scrapyPro.pipelines.XiaohuaPipeline': 100,  #后面小的优先
}

 执行时机:会在上面的url去重后,获取完数据后,对数据进行持久化操作

我们可以在from_crawler的参数crawler中获取配置文件信息
使用crawler.settings.get("DB")
注意:我们在配置文件中键值设置中键必须是大写的

三:cookies获取,CookieJar

from scrapy.http.cookies import CookieJar

    def parse(self, response):
        #获取cookies
        cookie_obj = CookieJar()
        cookie_obj.extract_cookies(response,response.request)  #从响应体中提取出cookies
        self.cookie_dict = cookie_obj._cookies    #注意cookies保存在cookiejar对象中的_cookies中

cookies实例:登录抽屉,实现点赞

DEPTH_LIMIT = 4

 四:scrapy框架扩展,实现信号回调

在settings.py文件中设置扩展

from scrapy import signals

class MyExtend:

    def __init__(self, crawler):
        self.crawler = crawler
        #在指定信号上注册操作
        crawler.signals.connect(self.start,signals.engine_started)  #在引擎前端时调用我们定义的方法


    @classmethod
    def from_crawler(cls, crawler):
        return cls(crawler)

    def start(self):
        print("extensions start")

所有信号

五:配置文件介绍

class SpiderMiddleware(object):

    def process_spider_input(self,response, spider):
        """
        下载完成,执行,然后交给parse处理
        :param response: 
        :param spider: 
        :return: 
        """
        pass

    def process_spider_output(self,response, result, spider):
        """
        spider处理完成,返回时调用
        :param response:
        :param result:
        :param spider:
        :return: 必须返回包含 Request 或 Item 对象的可迭代对象(iterable)
        """
        return result

    def process_spider_exception(self,response, exception, spider):
        """
        异常调用
        :param response:
        :param exception:
        :param spider:
        :return: None,继续交给后续中间件处理异常;含 Response 或 Item 的可迭代对象(iterable),交给调度器或pipeline
        """
        return None


    def process_start_requests(self,start_requests, spider):
        """
        爬虫启动时调用
        :param start_requests:
        :param spider:
        :return: 包含 Request 对象的可迭代对象
        """
        return start_requests
爬虫中间件需要在settings中配置SPIDER_MIDDLEWARES
class DownMiddleware1(object):
    def process_request(self, request, spider):
        """
        请求需要被下载时,经过所有下载器中间件的process_request调用
        :param request: 
        :param spider: 
        :return:  
            None,继续后续中间件去下载;
            Response对象,停止process_request的执行,开始执行process_response
            Request对象,停止中间件的执行,将Request重新调度器
            raise IgnoreRequest异常,停止process_request的执行,开始执行process_exception
        """
        pass



    def process_response(self, request, response, spider):
        """
        spider处理完成,返回时调用
        :param response:
        :param result:
        :param spider:
        :return: 
            Response 对象:转交给其他中间件process_response
            Request 对象:停止中间件,request会被重新调度下载
            raise IgnoreRequest 异常:调用Request.errback
        """
        print('response1')
        return response

    def process_exception(self, request, exception, spider):
        """
        当下载处理器(download handler)或 process_request() (下载中间件)抛出异常
        :param response:
        :param exception:
        :param spider:
        :return: 
            None:继续交给后续中间件处理异常;
            Response对象:停止后续process_exception方法
            Request对象:停止中间件,request将会被重新调用下载
        """
        return None
下载中间件需要在settings中配置DOWNLOADER_MIDDLEWARES

七:自定义命令