蜘蛛:

一,前言:

在scrapy中蜘蛛定义了爬取方法(请求&解析)以及爬取某个(或某些)网页(URL)的一些操作。

生成一个蜘蛛项目的方法,执行cmd命令:scrapy genspider lagou www.lagou.com(scrapy genspider项目名域名)

温馨提示:在生成的蜘蛛时,其实有4中模版,如如果不特指就默认为基本,就像上面的genspider一样没有指定则默认使用基本的,它还有三个模版为:crawlspider,csvfeedspider和xmlfeedspider。

其中蜘蛛为最基本的类,所有蜘蛛模版都要继承它(基本就是直接继承蜘蛛类)

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

二,分析:

一个蜘蛛类主要用到的函数方法和调用顺序为:

1)初始化():初始化爬虫名字和start_urls列表。

def __init__(self, name=None, **kwargs):if name is not None:self.name = nameelif 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(),生成请求对象交给Scrapy下载并返回响应给具体的处理函数处理

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(),具体处理响应响应的处理函数(即分析页面),其中在start_request()中,如果不知道callback则默认调用parse()。同时该函数可以自行定义,调用时使用callback回调即可,记得回调参数使用的是函数地址和不是函数方法,即只需要给函数方法名,不要带()。

提示:这个方法要根据我们自己的爬取需求自己设计,解析响应完成之后,并返回项目或请求(需指定回调函数).Item传给项目和管道处理,请求交由Scrapy下载,并由指定的回调函数处理,一直进行循环,直到处理完所有的数据为止。

蜘蛛源码:

"""
Base class for Scrapy spidersSee documentation in docs/topics/spiders.rst
"""
import logging
import warningsfrom 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 thisclass."""#1、定义spider名字的字符串。spider的名字定义了Scrapy如何定位(并初始化)spider,所以其必须是唯一的。#2、name是spider最重要的属性,而且是必须的。一般做法是以该网站的域名来命名spider。例如我们在爬取豆瓣读书爬虫时使用‘name = "douban_book_spider"’  name = Nonecustom_settings = None#初始化爬虫名字和start_urls列表。上面已经提到。def __init__(self, name=None, **kwargs):#初始化爬虫名字if name is not None:self.name = nameelif 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 = []@propertydef 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 levelThis helper wraps a log call to the logger within the spider, but youcan use it directly (e.g. Spider.logger.info('msg')) or use any otherPython logger too."""self.logger.log(level, message, **kw)@classmethoddef from_crawler(cls, crawler, *args, **kwargs):spider = cls(*args, **kwargs)spider._set_crawler(crawler)return spiderdef 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 = crawlerself.settings = crawler.settingscrawler.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@classmethoddef update_settings(cls, settings):settings.setdict(cls.custom_settings or {}, priority='spider')@classmethoddef handles_request(cls, request):return url_is_from_spider(request.url, cls)@staticmethoddef 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 = messagedef __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作者:小怪聊职场
链接:https://www.jianshu.com/p/d492adf17312
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

实战项目: scrapy爬取知名问答网站(解决登录+保存cookies值+爬取问答数据) - 完整版完美解决登录问题

菜鸟写Python-Scrapy:Spider源码分析相关推荐

  1. 【python】Dpark源码分析

    关于Dpark的PDF: http://velocity.oreilly.com.cn/2011/ppts/dpark.pdf 源码分析: Dpark/Spark中最重要的核心就是RDD(弹性分布式数 ...

  2. Python Requests库源码分析

    1. Requests库简介 书籍是人类进步的阶梯,源码是程序员进步的阶梯.为了进步,我们就要不断地阅读源码,提升自己的技术水平.今天我们来剖析一下Python的Requests库. Requests ...

  3. Python之socketserver源码分析

    一.socketserver简介 socketserver是一个创建服务器的框架,封装了许多功能用来处理来自客户端的请求,简化了自己写服务端代码.比如说对于基本的套接字服务器(socket-based ...

  4. GCN的Python实现与源码分析

    目录 一.GCN基本介绍 二.GCN的Keras实现 Cora 数据集预处理 1. 将Cora节点的类别标签进行one-hot编码 2. 将Cora.cite文件转化为邻接矩阵形式 3. 将数据集划分 ...

  5. Python字典部分源码分析,字典是无序的

    1 def clear(self): # real signature unknown; restored from __doc__ 2 """ D.clear() -& ...

  6. Spring IOC 容器源码分析 - 获取单例 bean

    1. 简介 为了写 Spring IOC 容器源码分析系列的文章,我特地写了一篇 Spring IOC 容器的导读文章.在导读一文中,我介绍了 Spring 的一些特性以及阅读 Spring 源码的一 ...

  7. java channel源码_Netty 4.0 源码分析(三):Channel和ChannelPipeline

    Client和server通过Channel连接,然后通过ByteBuf进行传输.每个Channel有自己的Pipeline,Pipeline上面可以添加和定义Handler和Event. Chann ...

  8. Spring Core Container 源码分析七:注册 Bean Definitions

    前言 原本以为,Spring 通过解析 bean 的配置,生成并注册 bean defintions 的过程不太复杂,比较简单,不用单独开辟一篇博文来讲述:但是当在分析前面两个章节有关 @Autowi ...

  9. 一文给你解决linux内存源码分析- SLUB分配器概述(超详细)

    SLUB和SLAB的区别 首先为什么要说slub分配器,内核里小内存分配一共有三种,SLAB/SLUB/SLOB,slub分配器是slab分配器的进化版,而slob是一种精简的小内存分配算法,主要用于 ...

  10. 云客Drupal源码分析之数据库系统及其使用

    在开始本主题前请允许一点点题外话: 在我写这个博客的时候(2016年10月28日),<Begining Drupal 8>这本书已经翻译完成并做成了PDF格式供给大家免费下载,这是一本引导 ...

最新文章

  1. aio 爬虫,去重,入库
  2. Crazepony的理念
  3. css position left 50%
  4. 模拟传输和数字传输的优缺点
  5. vue confirm确认
  6. 中国救生浮标市场趋势报告、技术动态创新及市场预测
  7. Pig安装及简单使用(pig0.12.0 hadoop2.2.0)
  8. sha1原型 c语言,SHA1算法实现(C语言)
  9. linux unip命令
  10. es进行curl请求时报错:missing authentication token for REST request
  11. figma安装包_Figma软件下载|UI界面设计软件(Figma)下载 v3.0.4 官方版 - 比克尔下载...
  12. linux单网卡多拨Adsl,ADSL多拨
  13. React的非受控组件和受控组件
  14. PDF工具Adobe Arcrobat Pro DC下载安装教程
  15. Hive秒数转成时分秒
  16. String 去掉空格回车等符号
  17. win10+docker+laradock最新安装
  18. python代码桌面壁纸_python设置windows桌面壁纸的实现代码
  19. 阿里云服务器域名解析,详细步骤
  20. Jenkins+Fastlane+蒲公英+钉钉

热门文章

  1. PEM文件格式详细解析
  2. 走进小作坊(二十)----商道:胡雪岩叱咤商场的经营智慧
  3. Java:class6 继承
  4. 创业工场如何为创业推波助澜?
  5. 如何在windows上下载安装zeplin
  6. PyTorch基础:Tensor的组合与分块
  7. 电子厂里撂了挑子,我默默自学起了Android|2021年中总结
  8. 使用python3+pyqt5实现图片识别文字工具
  9. html 鼠标划过 ie导致白屏,win7系统IE浏览器网页出现白屏的解决方法
  10. 抖音小程序怎么注册?一文看懂抖音小程序注册开发流程