前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >爬虫课堂(二十八)|Spider和CrawlSpider的源码分析

爬虫课堂(二十八)|Spider和CrawlSpider的源码分析

作者头像
黄小怪
发布于 2018-05-21 09:52:17
发布于 2018-05-21 09:52:17
1.9K00
代码可运行
举报
文章被收录于专栏:小怪聊职场小怪聊职场
运行总次数:0
代码可运行

我在爬虫课堂(二十五)|使用CrawlSpider、LinkExtractors、Rule进行全站爬取章节中说将对CrawlSpider的源码进行一个讲解,这篇文章就是来还账的,你们如果觉得好请点个赞。

一、Spider源码分析

在对CrawlSpider进行源码分析之前,先对Spider源码进行一个分析。

1.1、Spider介绍及主要函数讲解

Spider类定义了如何爬取某个(或某些)网站。包括了爬取的动作(是否跟进链接)以及如何从网页的内容中提取结构化数据(提取Item)。 Spider就是定义爬取的动作以及分析某个(或某些)网页的地方。

Spider是最基本的类,所有爬虫必须继承这个类。

Spider类主要用到的函数及调用顺序为:

1)init()

初始化爬虫名字和start_urls列表。

重点:这里爬虫名称是必须的,而且必须是唯一的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    def __init__(self, name=None, **kwargs):
        if name is not None:
            self.name = name
        elif not getattr(self, 'name', None):
            raise ValueError("%s must have a name" % type(self).__name__)
        self.__dict__.update(kwargs)
        if not hasattr(self, 'start_urls'):
            self.start_urls = []

2)start_requests()调用make_requests_from_url()

生成Requests对象交给Scrapy下载并返回Response。

重点:该方法只会调用一次。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    def start_requests(self):
        cls = self.__class__
        if method_is_overridden(cls, Spider, 'make_requests_from_url'):
            warnings.warn(
                "Spider.make_requests_from_url method is deprecated; it "
                "won't be called in future Scrapy releases. Please "
                "override Spider.start_requests method instead (see %s.%s)." % (
                    cls.__module__, cls.__name__
                ),
            )
            for url in self.start_urls:
                yield self.make_requests_from_url(url)
        else:
            for url in self.start_urls:
                yield Request(url, dont_filter=True)

    def make_requests_from_url(self, url):
        """ This method is deprecated. """
        return Request(url, dont_filter=True)

3)parse()

解析response,并返回Item或Requests(需指定回调函数)。Item传给Item pipline持久化,Requests交由Scrapy下载,并由指定的回调函数处理,一直进行循环,直到处理完所有的数据为止。

重点:这个类需要我们自己去实现。并且是默认的Request对象回调函数,处理返回的response。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    def parse(self, response):
        raise NotImplementedError
1.2、Spider源码分析

因为Spider源码不是很多,我直接在它的源码加上注释的方式进行讲解,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"""
Base class for Scrapy spiders

See documentation in docs/topics/spiders.rst
"""
import logging
import warnings

from scrapy import signals
from scrapy.http import Request
from scrapy.utils.trackref import object_ref
from scrapy.utils.url import url_is_from_spider
from scrapy.utils.deprecate import create_deprecated_class
from scrapy.exceptions import ScrapyDeprecationWarning
from scrapy.utils.deprecate import method_is_overridden

#所有爬虫的基类,用户定义的爬虫必须从这个类继承
class Spider(object_ref):
    """Base class for scrapy spiders. All spiders must inherit from this
    class.
    """

    #1、定义spider名字的字符串。spider的名字定义了Scrapy如何定位(并初始化)spider,所以其必须是唯一的。
    #2、name是spider最重要的属性,而且是必须的。一般做法是以该网站的域名来命名spider。例如我们在爬取豆瓣读书爬虫时使用‘name = "douban_book_spider"’  
    name = None
    custom_settings = None

    #初始化爬虫名字和start_urls列表。上面已经提到。
    def __init__(self, name=None, **kwargs):
        #初始化爬虫名字
        if name is not None:
            self.name = name
        elif not getattr(self, 'name', None):
            raise ValueError("%s must have a name" % type(self).__name__)
        self.__dict__.update(kwargs)

        #初始化start_urls列表,当没有指定的URL时,spider将从该列表中开始进行爬取。 因此,第一个被获取到的页面的URL将是该列表之一,后续的URL将会从获取到的数据中提取。  
        if not hasattr(self, 'start_urls'):
            self.start_urls = []

    @property
    def logger(self):
        logger = logging.getLogger(self.name)
        return logging.LoggerAdapter(logger, {'spider': self})

    def log(self, message, level=logging.DEBUG, **kw):
        """Log the given message at the given log level

        This helper wraps a log call to the logger within the spider, but you
        can use it directly (e.g. Spider.logger.info('msg')) or use any other
        Python logger too.
        """
        self.logger.log(level, message, **kw)

    @classmethod
    def from_crawler(cls, crawler, *args, **kwargs):
        spider = cls(*args, **kwargs)
        spider._set_crawler(crawler)
        return spider

    def set_crawler(self, crawler):
        warnings.warn("set_crawler is deprecated, instantiate and bound the "
                      "spider to this crawler with from_crawler method "
                      "instead.",
                      category=ScrapyDeprecationWarning, stacklevel=2)
        assert not hasattr(self, 'crawler'), "Spider already bounded to a " \
                                             "crawler"
        self._set_crawler(crawler)

    def _set_crawler(self, crawler):
        self.crawler = crawler
        self.settings = crawler.settings
        crawler.signals.connect(self.close, signals.spider_closed)

    #该方法将读取start_urls列表内的地址,为每一个地址生成一个Request对象,并返回这些对象的迭代器。
    #注意:该方法只会调用一次。
    def start_requests(self):
        cls = self.__class__
        if method_is_overridden(cls, Spider, 'make_requests_from_url'):
            warnings.warn(
                "Spider.make_requests_from_url method is deprecated; it "
                "won't be called in future Scrapy releases. Please "
                "override Spider.start_requests method instead (see %s.%s)." % (
                    cls.__module__, cls.__name__
                ),
            )
            for url in self.start_urls:
                yield self.make_requests_from_url(url)
        else:
            for url in self.start_urls:
                yield Request(url, dont_filter=True)

    #1、start_requests()中调用,实际生成Request的函数。
    #2、Request对象默认的回调函数为parse(),提交的方式为get。
    def make_requests_from_url(self, url):
        """ This method is deprecated. """
        return Request(url, dont_filter=True)

    #默认的Request对象回调函数,处理返回的response。  
    #生成Item或者Request对象。这个类需要我们自己去实现。
    def parse(self, response):
        raise NotImplementedError

    @classmethod
    def update_settings(cls, settings):
        settings.setdict(cls.custom_settings or {}, priority='spider')

    @classmethod
    def handles_request(cls, request):
        return url_is_from_spider(request.url, cls)

    @staticmethod
    def close(spider, reason):
        closed = getattr(spider, 'closed', None)
        if callable(closed):
            return closed(reason)

    def __str__(self):
        return "<%s %r at 0x%0x>" % (type(self).__name__, self.name, id(self))

    __repr__ = __str__


BaseSpider = create_deprecated_class('BaseSpider', Spider)


class ObsoleteClass(object):
    def __init__(self, message):
        self.message = message

    def __getattr__(self, name):
        raise AttributeError(self.message)

spiders = ObsoleteClass(
    '"from scrapy.spider import spiders" no longer works - use '
    '"from scrapy.spiderloader import SpiderLoader" and instantiate '
    'it with your project settings"'
)

# Top-level imports
from scrapy.spiders.crawl import CrawlSpider, Rule
from scrapy.spiders.feed import XMLFeedSpider, CSVFeedSpider
from scrapy.spiders.sitemap import SitemapSpider

二、CrawlSpider源码分析

讲解完Spider源码分析之后,我再来对CrawlSpider的源码进行一个分析。

2.1、CrawlSpider介绍及主要函数讲解

CrawlSpider是爬取一般网站常用的spider。它定义了一些规则(rule)来提供跟进link的方便的机制。也许这个spider并不是完全适合特定网站或项目,但它对很多情况都使用。

因此我们可以在它的基础上,根据需求修改部分方法。当然我们也可以实现自己的spider。除了从Spider继承过来的(必须提供的)属性外,它还提供了一个新的属性:

1)rules

一个包含一个(或多个)Rule对象的集合(list)。 每个Rule对爬取网站的动作定义了特定表现。如果多个Rule匹配了相同的链接,则根据他们在本属性中被定义的顺序,第一个会被使用。

使用方式案例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
rules = (
    # 提取匹配 'category.php' (但不匹配 'subsection.php') 的链接并跟进链接(没有callback意味着follow默认为True)
    Rule(LinkExtractor(allow=('category\.php', ), deny=('subsection\.php', ))),

    # 提取匹配 'item.php' 的链接并使用spider的parse_item方法进行分析
    Rule(LinkExtractor(allow=('item\.php', )), callback='parse_item',  follow=True),
)

2)parse_start_url(response)

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

该spider方法需要用户自己重写。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def parse_start_url(self, response):  
    return []  

3)parse(),一定不要重写这个方法

通过上面的介绍,我们知道Spider中的parse()方法是需要我们重写的,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def parse(self, response):
        raise NotImplementedError

但是,CrawlSpider中的parse()方法在源码中已经实现了一些功能,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def parse(self, response):
        return self._parse_response(response, self.parse_start_url, cb_kwargs={}, follow=True)

所以我们在使用CrawlSpider时,一定一定不要去重写parse()函数(重点)。可以使用Rule(LinkExtractor(allow=('item\.php', )), callback='parse_item', follow=True)中的callback去指定需要跳转的parse。

例如我们在爬虫课堂(二十五)|使用CrawlSpider、LinkExtractors、Rule进行全站爬取中讲解简书全站爬取的时候使用方法,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class JianshuCrawl(CrawlSpider):
    name = "jianshu_spider_crawl"
    # 可选,加上会有一个爬取的范围
    allowed_domains = ["jianshu.com"]
    start_urls = ['https://www.jianshu.com/']

    # response中提取链接的匹配规则,得出符合条件的链接
    pattern = '.*jianshu.com/u/*.'
    pagelink = LinkExtractor(allow=pattern)

    # 可以写多个rule规则
    rules = [
        # 只要符合匹配规则,在rule中都会发送请求,同时调用回调函数处理响应。
        # rule就是批量处理请求。
        Rule(pagelink, callback='parse_item', follow=True),
    ]

    # 不能写parse方法,因为源码中已经有了,会覆盖导致程序不能跑
    def parse_item(self, response):
        for each in response.xpath("//div[@class='main-top']"):
    ......

callback='parse_item'(这里的parse_item是字符串)指定了跳转的函数def parse_item(self, response)

2.2、CrawlSpider源码分析

同样的,因为CrawlSpider源码不是很多,我直接在它的源码加上注释的方式进行讲解,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class CrawlSpider(Spider):

    rules = ()

    def __init__(self, *a, **kw):
        super(CrawlSpider, self).__init__(*a, **kw)
        self._compile_rules()

    #1、首先调用parse()方法来处理start_urls中返回的response对象。
    #2、parse()将这些response对象传递给了_parse_response()函数处理,并设置回调函数为parse_start_url()。
    #3、设置了跟进标志位True,即follow=True。
    #4、返回response。
    def parse(self, response):
        return self._parse_response(response, self.parse_start_url, cb_kwargs={}, follow=True)

    #处理start_url中返回的response,需要重写。
    def parse_start_url(self, response):
        return []

    def process_results(self, response, results):
        return results

    def _build_request(self, rule, link):
         #构造Request对象,并将Rule规则中定义的回调函数作为这个Request对象的回调函数。这个‘_build_request’函数在下面调用。
        r = Request(url=link.url, callback=self._response_downloaded)
        r.meta.update(rule=rule, link_text=link.text)
        return r

    #从response中抽取符合任一用户定义'规则'的链接,并构造成Resquest对象返回。
    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)
            #将链接加入seen集合,为每个链接生成Request对象,并设置回调函数为_repsonse_downloaded()for link in links:
                seen.add(link)
                #构造Request对象,并将Rule规则中定义的回调函数作为这个Request对象的回调函数。这个‘_build_request’函数在上面定义。
                r = self._build_request(n, link)
                #对每个Request调用process_request()函数。该函数默认为indentify,即不做任何处理,直接返回该Request。
                yield rule.process_request(r)

    #处理通过rule提取出的连接,并返回item以及request。
    def _response_downloaded(self, response):
        rule = self._rules[response.meta['rule']]
        return self._parse_response(response, rule.callback, rule.cb_kwargs, rule.follow)

    #解析response对象,使用callback解析处理他,并返回request或Item对象。
    def _parse_response(self, response, callback, cb_kwargs, follow=True):
        #1、首先判断是否设置了回调函数。(该回调函数可能是rule中的解析函数,也可能是 parse_start_url函数)  
        #2、如果设置了回调函数(parse_start_url()),那么首先用parse_start_url()处理response对象,  
        #3、然后再交给process_results处理。返回cb_res的一个列表。  
        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

        #如果需要跟进,那么使用定义的Rule规则提取并返回这些Request对象。
        if follow and self._follow_links:
            #返回每个Request对象。
            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)

参考资料:scrapy官网(官方对这块讲的不多,但是其他我这边没有讲的内容还有很多,真的需要好好看看官网),CSDN上的两篇Scrapy源码分析的文章。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.04.22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
python爬虫入门(八)Scrapy框架之CrawlSpider类
CrawlSpider类 通过下面的命令可以快速创建 CrawlSpider模板 的代码: scrapy genspider -t crawl tencent tencent.com CrawSpider是Spider的派生类,Spider类的设计原则是只爬取start_url列表中的网页,而CrawlSpider类定义了一些规则(rule)来提供跟进link的方便的机制,从爬取的网页中获取link并继续爬取的工作更适合。 CrawSpider源码详细解析 class CrawlSpider(Spider)
zhang_derek
2018/04/11
2.3K0
python爬虫入门(八)Scrapy框架之CrawlSpider类
Python之CrawlSpider
CrawlSpider可以定义规则,再解析html内容的时候,可以根据链接规则提取出指定的链接,然后再向这些链接发送请求所以,如果有需要跟进链接的需求,意思就是爬取了网页之后,需要提取链接再次爬取,使用CrawlSpider是非常合适的
鱼找水需要时间
2023/02/16
4000
Python之CrawlSpider
Python Scrapy框架之CrawlSpider爬虫
一般写爬虫是自己在解析完整个页面后获取下一页的url,然后重新发送一个请求。有时候我们想要这样做,只要满足某个条件的url,都给我进行爬取。那么这时候我们就可以通过CrawlSpider来帮我们完成了。CrawlSpider继承自Spider,只不过是在之前的基础之上增加了新的功能,可以定义爬取的url的规则,以后scrapy碰到满足条件的url都进行爬取,而不用手动的yield Request。
Python知识大全
2020/02/13
5830
Python Scrapy框架之CrawlSpider爬虫
Python:CrawlSpiders
上一个案例中,我们通过正则表达式,制作了新的url作为Request请求参数,现在我们可以换个花样...
Lansonli
2021/10/09
3500
普通爬虫有啥意思,我写了个通用Scrapy爬虫
除了钱,大家还比较喜欢什么?当然是全能、万能和通用的人或事物啦,例如:全能、什么都会的员工、万能钥匙、通用爬虫等等。今天我们学习Scrapy通用爬虫,利用Scrapy通用爬虫来获取美食杰网站[1]。
Python进击者
2022/01/11
1.1K0
普通爬虫有啥意思,我写了个通用Scrapy爬虫
外行学 Python 爬虫 第十篇 爬虫框架Scrapy
前面几个章节利用 python 的基础库实现网络数据的获取、解构以及存储,同时也完成了简单的数据读取操作。在这个过程中使用了其他人完成的功能库来加快我们的爬虫实现过程,对于爬虫也有相应的 python 框架供我们使用「不重复造轮子是程序员的一大特点」,当我们了解爬虫的实现过程以后就可以尝试使用框架来完成自己的爬虫,加快开发速度。
keinYe
2019/08/15
1.2K0
Scrapy框架-CrawlSpider
它是Spider的派生类,Spider类的设计原则是只爬取start_url列表中的网页,而CrawlSpider类定义了一些规则(rule)来提供跟进link的方便的机制,从爬取的网页中获取link并继续爬取的工作更适合
py3study
2020/01/17
6280
Python网络爬虫(七)- 深度爬虫CrawlSpider1.深度爬虫CrawlSpider2.链接提取:LinkExtractor3.爬取规则:rules4.如何在pycharm中直接运行爬虫5.
目录: Python网络爬虫(一)- 入门基础 Python网络爬虫(二)- urllib爬虫案例 Python网络爬虫(三)- 爬虫进阶 Python网络爬虫(四)- XPath Python网络爬虫(五)- Requests和Beautiful Soup Python网络爬虫(六)- Scrapy框架 Python网络爬虫(七)- 深度爬虫CrawlSpider Python网络爬虫(八) - 利用有道词典实现一个简单翻译程序 深度爬虫之前推荐一个简单实用的库fake-useragent,可以伪装
Python攻城狮
2018/08/23
1.9K0
Python网络爬虫(七)- 深度爬虫CrawlSpider1.深度爬虫CrawlSpider2.链接提取:LinkExtractor3.爬取规则:rules4.如何在pycharm中直接运行爬虫5.
python爬虫----(4. scrapy框架,官方文档以及例子)
官方文档: http://doc.scrapy.org/en/latest/ github例子: https://github.com/search?utf8=%E2%9C%93&q=sc
lpe234
2020/07/27
7260
二、Item Pipeline和Spider-----基于scrapy取校花网的信息 编写item pipeline
Item Pipeline 当Item在Spider中被收集之后,它将会被传递到Item Pipeline,这些Item Pipeline组件按定义的顺序处理Item。 每个Item Pipeline都是实现了简单方法的Python类,比如决定此Item是丢弃而存储。以下是item pipeline的一些典型应用: 验证爬取的数据(检查item包含某些字段,比如说name字段) 查重(并丢弃) 将爬取结果保存到文件或者数据库中 编写item pipeline 编写item pipeline很简单,item
酱紫安
2018/04/16
1.3K0
二、Item Pipeline和Spider-----基于scrapy取校花网的信息
		编写item pipeline
爬虫系列(13)Scrapy 框架-CrawlSpider、图片管道以及下载中间件Middleware。
首先在说下Spider,它是所有爬虫的基类,而CrawSpiders就是Spider的派生类。对于设计原则是只爬取start_url列表中的网页,而从爬取的网页中获取link并继续爬取的工作CrawlSpider类更适合。
野原测试开发
2019/07/10
1.4K0
Scrapy基础——CrawlSpider详解
專 欄 ❈hotpot,Python中文社区专栏作者 博客: http://www.jianshu.com/u/9ea40b5f607a ❈ CrawlSpider基于Spider,但是可以说是为全站爬取而生。 简要说明 CrawlSpider是爬取那些具有一定规则网站的常用的爬虫,它基于Spider并有一些独特属性 1、rules: 是Rule对象的集合,用于匹配目标网站并排除干扰 2、parse_start_url: 用于爬取起始响应,必须要返回Item,Request中的一个。 因为rules是R
Python中文社区
2018/01/31
1.3K0
Scrapy基础——CrawlSpider详解
爬虫课堂(二十五)|使用CrawlSpider、LinkExtractors、Rule进行全站爬取
在爬虫课堂(二十二)|使用LinkExtractor提取链接中讲解了LinkExtractor的使用,本章节来讲解使用CrawlSpider+LinkExtractor+Rule进行全站爬取。 一、CrawlSpider介绍 Scrapy框架中分两类爬虫,Spider类和CrawlSpider类。Spider类的使用已经讲解了很多,但是如果想爬取某个网站的全站信息的话,CrawlSpider类是个非常不错的选择。CrawlSpider继承于Spider类,CrawlSpider是爬取那些具有一定规则网站
黄小怪
2018/05/21
1.4K0
python crawlspider详解
scrapy genspider -t crawl spider名称 www.xxxx.com LinkExtractors: allow:必须要匹配这个正则表达式的URL才会被提取,如果没有给出,或为空,匹配所有。(str or list) deny:allow的反面,如果没有给出或空,不排除所有。优先级高于allow。(str or list) allow_domains :(str or list) deny_domains :(str or list) deny_extensions:(list):提取链接时,忽略的扩展名列表。 restrict_xpaths :从哪些XPATH提取 tags:(str or list):默认为('a','area') attrs :(list):默认为('href') unique :boolean 重复过滤 Rule: callback:从link_extractor中每获取到链接时,参数所指定的值作为回调函数,该回调函数接受一个response作为其第一个参数。 注意:当编写爬虫规则时,避免使用parse作为回调函数。由于CrawlSpider使用parse方法来实现其逻辑,如果覆盖了 parse方法,crawl spider将会运行失败。 follow:是否跟进。如果callback为None,follow 默认设置为True ,否则默认为False。 process_links:指定该spider中哪个的函数将会被调用,从link_extractor中获取到链接列表时将会调用该函数。该方法主要用来过滤。 process_request:指定该spider中哪个的函数将会被调用, 该规则提取到每个request时都会调用该函数。 (用来过滤request)
用户5760343
2022/01/10
3410
Python爬虫之crawlspider类的使用
对应的crawlspider就可以实现上述需求,能够匹配满足条件的url地址,组装成Reuqest对象后自动发送给引擎,同时能够指定callback函数
海仔
2020/09/28
7140
Scrapy框架的使用之Scrapy通用爬虫
通过Scrapy,我们可以轻松地完成一个站点爬虫的编写。但如果抓取的站点量非常大,比如爬取各大媒体的新闻信息,多个Spider则可能包含很多重复代码。 如果我们将各个站点的Spider的公共部分保留下来,不同的部分提取出来作为单独的配置,如爬取规则、页面解析方式等抽离出来做成一个配置文件,那么我们在新增一个爬虫的时候,只需要实现这些网站的爬取规则和提取规则即可。 本节我们就来探究一下Scrapy通用爬虫的实现方法。 一、CrawlSpider 在实现通用爬虫之前,我们需要先了解一下CrawlSpider
崔庆才
2018/06/25
2.6K0
scrapy0700:深度爬虫scrapy深度爬虫
爬虫程序,主要是用与数据采集处理的一种网络程序,在操作过程中针对指定的url地址进行数据请求并根据需要采集数据,但是在实际项目开发过程中,经常会遇到目标url地址数量不明确的情况,如之前的章节中提到的智联招聘项目,不同的岗位搜索到的岗位数量不一定一致,也就意味着每个工作搜索到的工作岗位列表页面的数量不一定一致,爬虫工程师工作可能搜索到了10页,Django工作有可能都索到了25页数据,那么针对这样的数据要全部进行爬取,应该怎么处理呢?答案就是:深度爬虫
大牧莫邪
2018/08/27
1.9K0
Scrapy框架中crawlSpider的使用——爬取内容写进MySQL和拉勾网案例
Scrapy框架中分两类爬虫,Spider类和CrawlSpider类。该案例采用的是CrawlSpider类实现爬虫进行全站抓取。
菲宇
2019/06/13
1.3K0
Scrapy Crawlspider的详解与项目实战
回顾上一篇文章,我们大多时间都是在寻找下一页的url地址或者是内容的url地址上面,我们的大体思路是这样的:
咸鱼学Python
2019/10/09
2K0
Scrapy框架-Spider和Craw
目录 1.目标 2.方法1:通过Spider爬取 3. 通过CrawlSpider爬取 1.目标 http://wz.sun0769.com/index.php/question/questionTy
py3study
2020/01/17
3860
推荐阅读
相关推荐
python爬虫入门(八)Scrapy框架之CrawlSpider类
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验