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 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
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")
所有信号
五:配置文件介绍
DEPTH_LIMIT = 4
四:scrapy框架扩展,实现信号回调
五:配置文件介绍
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