spider和python的关系_Spider和python分布式爬虫的CrawlSpider是什么关系?

一般的爬虫,比如我们上篇所说的scrapy.Spider都算是简单的爬取数据的方法。那么,有没有稍微有难度的爬虫获取给小伙伴们练练手呢?小编想说当然有啦,一般爬虫对应的就是深度爬虫,这个名词想必大家能猜出来但是不知道如何去使用。同时小编再给大家提出一个疑问,CrawlSpider和我们之后学的Spider又是什么关系呢?接下来我们往下进行学习。

CrawlSpider

深度爬虫,根据连接提取规则,会自动抓取页面中满足规则的连接,然后再请求解析,再抓取从而一直深入。

源码"""

This modules implements the CrawlSpider which is the recommended spider to use

for scraping typical web sites that requires crawling pages.

See documentation in docs/topics/spiders.rst

"""

import copy

import six

from scrapy.http import Request, HtmlResponse

from scrapy.utils.spider import iterate_spider_output

from scrapy.spiders import Spider

def identity(x):

return x

class Rule(object):

def __init__(self, link_extractor, callback=None, cb_kwargs=None, follow=None, process_links=None, process_request=identity):

self.link_extractor = link_extractor

self.callback = callback

self.cb_kwargs = cb_kwargs or {}

self.process_links = process_links

self.process_request = process_request

if follow is None:

self.follow = False if callback else True

else:

self.follow = follow

class CrawlSpider(Spider):

rules = ()

def __init__(self, *a, **kw):

super(CrawlSpider, self).__init__(*a, **kw)

self._compile_rules()

def parse(self, response):

return self._parse_response(response, self.parse_start_url, cb_kwargs={}, follow=True)

def parse_start_url(self, response):

return []

def process_results(self, response, results):

return results

def _build_request(self, rule, link):

r = Request(url=link.url, callback=self._response_downloaded)

r.meta.update(rule=rule, link_text=link.text)

return r

def _requests_to_follow(self, response):

if not isinstance(response, HtmlResponse):

return

seen = set()

for n, rule in enumerate(self._rules):

links = [lnk for lnk in rule.link_extractor.extract_links(response)

if lnk not in seen]

if links and rule.process_links:

links = rule.process_links(links)

for link in links:

seen.add(link)

r = self._build_request(n, link)

yield rule.process_request(r)

def _response_downloaded(self, response):

rule = self._rules[response.meta['rule']]

return self._parse_response(response, rule.callback, rule.cb_kwargs, rule.follow)

def _parse_response(self, response, callback, cb_kwargs, follow=True):

if callback:

cb_res = callback(response, **cb_kwargs) or ()

cb_res = self.process_results(response, cb_res)

for requests_or_item in iterate_spider_output(cb_res):

yield requests_or_item

if follow and self._follow_links:

for request_or_item in self._requests_to_follow(response):

yield request_or_item

def _compile_rules(self):

def get_method(method):

if callable(method):

return method

elif isinstance(method, six.string_types):

return getattr(self, method, None)

self._rules = [copy.copy(r) for r in self.rules]

for rule in self._rules:

rule.callback = get_method(rule.callback)

rule.process_links = get_method(rule.process_links)

rule.process_request = get_method(rule.process_request)

@classmethod

def from_crawler(cls, crawler, *args, **kwargs):

spider = super(CrawlSpider, cls).from_crawler(crawler, *args, **kwargs)

spider._follow_links = crawler.settings.getbool(

'CRAWLSPIDER_FOLLOW_LINKS', True)

return spider

def set_crawler(self, crawler):

super(CrawlSpider, self).set_crawler(crawler)

self._follow_links = crawler.settings.getbool('CRAWLSPIDER_FOLLOW_LINKS', True)

CrawlSpider是继承于Spider,也实现了其中的常用属性和方法,新增了一个rules属性(连接提取规则集合),但是不同的是Crawl内部实现了parse解析方法,不能在Crawl中使用该关键词。def parse(self, response):

return self._parse_response(response, self.parse_start_url, cb_kwargs={}, follow=True)

也提供了一个可复写(overrideable)的方法:parse_start_url(response)

当start_url的请求返回时,该方法被调用。 该方法分析最初的返回值并必须返回一个 Item对象或者 一个 Request 对象或者 一个可迭代的包含二者对象。

看完文章的小伙伴可以明确,CrawlSpider是从Spider那里衍生出来的,在使用方法和功能上比较相似,相信对于今天的CrawlSpider学习大家都能轻松掌握。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值