Scrapy源码分析-Spiders爬虫中文文档(一)

2023-11-02

Spider类定义了如何爬取某个(或某些)网站。包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取item)。 换句话说,Spider就是您定义爬取的动作及分析某个网页(或者是有些网页)的地方。

对spider来说,爬取的循环类似下文:以初始的URL初始化Request,并设置回调函数。 当该request下载完毕并返回时,将生成response,并作为参数传给该回调函数。

1、spider中初始的request是通过调用 start_requests() 来获取的。 start_requests() 读取start_urls 中的URL, 并以 parse 为回调函数生成 Request 

2、在回调函数内分析返回的(网页)内容,返回 Item 对象或者 Request 或者一个包括二者的可迭代容器。 

      如果返回的是Request对象,会经过Scrapy处理,下载相应的内容,并调用设置的callback函数(函数可相同)。

3、在回调函数内,您可以使用 选择器(Selectors) (您也可以使用BeautifulSoup, lxml 或者您想用的任何解析器) 来分析网页内容,并根据分析的数据生成item。

4、最后,由spider返回的item将被存到数据库(由某些  Item Pipeline  处理)或使用  Feed exports  存入到文件中。

虽然该循环对任何类型的spider都(多少)适用,但Scrapy仍然为了不同的需求提供了多种默认spider。 之后将讨论这些spider。

Spider参数

Spider可以通过接受参数来修改其功能。 spider参数一般用来定义初始URL或者指定限制爬取网站的部分。 您也可以使用其来配置spider的任何功能。

在运行 crawl 时添加 -a 可以传递Spider参数:

scrapy crawl myspider -a category=electronics

Spider在构造器(constructor)中获取参数:

import scrapy

class MySpider(Spider):
    name = 'myspider'

    def __init__(self, category=None, *args, **kwargs):
        super(MySpider, self).__init__(*args, **kwargs)
        self.start_urls = ['http://www.example.com/categories/%s' % category]
        # ...

Spider参数也可以通过Scrapyd的 schedule.json API来传递。

内置Spider参考手册

Scrapy提供多种方便的通用spider供您继承使用。 这些spider为一些常用的爬取情况提供方便的特性, 例如根据某些规则跟进某个网站的所有链接、根据 Sitemaps 来进行爬取,或者分析XML/CSV源。

下面spider的示例中,我们假定您有个项目在 myproject.items 模块中声明了 TestItem:

import scrapy

class TestItem(scrapy.Item):
    id = scrapy.Field()
    name = scrapy.Field()
    description = scrapy.Field()

Spider

class scrapy.spider. Spider

Spider是最简单的spider。每个其他的spider必须继承自该类(包括Scrapy自带的其他spider以及您自己编写的spider)。 Spider并没有提供什么特殊的功能。 其仅仅请求给定的start_urls/start_requests ,并根据返回的结果(resulting responses)调用spider的 parse 方法。

name

定义spider名字的字符串(string)。spider的名字定义了Scrapy如何定位(并初始化)spider,所以其必须是唯一的。 不过您可以生成多个相同的spider实例(instance),这没有任何限制。 name是spider最重要的属性,而且是必须的。

如果该spider爬取单个网站(single domain),一个常见的做法是以该网站(domain)(加或不加后缀 )来命名spider。 例如,如果spider爬取 mywebsite.com ,该spider通常会被命名为mywebsite 。

allowed_domains

可选。包含了spider允许爬取的域名(domain)列表(list)。 当 OffsiteMiddleware 启用时, 域名不在列表中的URL不会被跟进。

start_urls

URL列表。当没有制定特定的URL时,spider将从该列表中开始进行爬取。 因此,第一个被获取到的页面的URL将是该列表之一。 后续的URL将会从获取到的数据中提取。

start_requests ( )

该方法必须返回一个可迭代对象(iterable)。该对象包含了spider用于爬取的第一个Request。

当spider启动爬取并且未制定URL时,该方法被调用。 当指定了URL时,make_requests_from_url() 将被调用来创建Request对象。 该方法仅仅会被Scrapy调用一次,因此您可以将其实现为生成器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scrapy源码分析-Spiders爬虫中文文档(一) 的相关文章

随机推荐

  • Simulink搭建三相PWM整流器过程

    三相PWM整流器的基本构成 过年期间闲来无事 对PWM整流器进行了一点了解 然后用Simulink搭建了一个PWM整流器的模型 现在对这个过程进行归纳 希望对大家有帮助 首先贴出三相PWM整流器的电路简图如下图 其中V1 V2 V3是三相电
  • 左手坐标系和右手坐标系以及Unity中的世界坐标系和本地坐标系

    一 左手坐标系和右手坐标系 左手坐标系 伸开我们的左手 掌心向外 大拇指与食指成90度 中指 无名指和小指弯曲 大拇指指向的方向就是X轴正方向 食指指向的方向就是Y轴正方向 中指 无名指和小指指向的方向就是Z轴正方向 右手坐标系 伸开我们的
  • 快速突破面试算法之双指针篇

    前言 什么是双指针 砸门用大白话来说 就是两个定位装置 那么这两个定位装置有什么用呢 那肯定去定位撒 而且更高级的是这装置上面还有摄像头 可以看见当前所在位置的情况 现在我们给两个装置各自赋予动力 先赋予相同的动力 及移动速度一样 现在这两
  • 实现 vue2 中使用 vue-i18n 实现中英文切换功能

    1 下载包 版本要对应 2的版本8可以 vue3要用到9 npm install vue i18n 8 S 2 创建i18n js文件 import Vue from vue import Element from element ui i
  • 使用dd命令制作U盘启动盘

    1 插入U盘 df h查看U盘文件系统挂载情况 然后使用umount dev sdb 卸载U盘文件系统 2 执行命令 sudo mkfs vfat I dev sdb格式化U盘为FAT格式 3 dd if iso of dev sdb bs
  • vmware ubuntu与windows共享文件夹目录不显示的一种解决方法

    问题 mnt文件夹中没有共享的文件夹目录 甚至hgfs文件夹也没有 解决方法 1 我自己摸索出来的 在上图的界面 文件夹共享 下的选项选择 已禁用 点击最下方 确认 图中没有显示 被遮住了 再打开这个虚拟机设置界面 vmware界面上方工具
  • MAC强制卸载软件 如遇“不能修改或删除“*”,因为macOS需要它”

    连上小飞机后不知道怎么就下了个 流氓软件 疯狂卸载也卸载不掉 找了一个小时的攻略终于解决了 就是下面这个 很多人推荐用AppDelete这个应用卸载 尝试了一下并没有成功 用命令 sudo rm rf 应用名称 也没有卸载掉 尝试了一下解除
  • UE4 回合游戏项目 13- 生成敌人

    在上一篇 UE4 回合游戏项目 12 添加敌人受到攻击的动画 的基础上继续完成生成敌人的功能 效果 步骤 1 打开battleScenario 战斗场景 2 创建从类生成AI这个节点 现在我们需要获取到敌人的引用 以及敌人的数量 3 创建一
  • python内装饰器

    一 内置装饰器 内置装饰器 含义 classmethod 类方法 staticmethod 静态方法 二 普通方法 回顾 定义 第一个参数为self 代表 实例本身 调用 要有实例化的过程 通过 实例对象 方法名 调用 1 定义类 clas
  • 跳跃表原理

    跳跃表原理 最近看了一种数据结构叫做skipList redis和levelDB都是用了它 Skip List是在有序链表的基础上进行了扩展 解决了有序链表结构查找特定值困难的问题 查找特定值的时间复杂度为O logn 他是一种可以代替平衡
  • MySQL sku 数据批量导入_求node.js中mysql商品sku批量更新解决方案

    前提 不使用循环 1 sku具备添加 删除 修改功能 绑定数据sku sku goods id 1MJlrjS17jQ id 103 inventory 10 price 588 sku id 15617774918 sku name 黑色
  • Vue 富文本编辑器:vue-quill-editor粘贴图片上传服务器

    Vue 富文本编辑器 vue quill editor粘贴图片上传服务器 粘贴图片 vue quill editor复制图片实际上会以 base64 形式的进行一个上传 写进数据库后会导致数据一些加载问题 解决方法 将复制的图片先上传到服务
  • matlab产生随机数或随机矩阵

    Matlab中随机数生成器主要有 betarnd 贝塔分布的随机数生成器 binornd 二项分布的随机数生成器 chi2rnd 卡方分布的随机数生成器 exprnd 指数分布的随机数生成器 frnd f分布的随机数生成器 gamrnd 伽
  • Oracle中自动生成id的函数以及注意事项

    Oracle中自动生成id的函数 sys guid SELECT sys guid FROM aTable a 注意 上面这个是可以自动生成id 但是很多时候自动生成的id会出现乱码 原因 SYS GUID 以16位RAW类型值形式返回一个
  • arcgis中显示的图元根据投影坐标系确定单位

    这个迷糊了 如果是地理坐标系 则图元为经纬度 如果是投影坐标系 则图元为米
  • ESP8266使用邮件客户端 Arduino 库发送邮件(兼容ESP32)

    使用 ESP8266 发送邮件可以方便地处理各种事情 可以让 ESP8266 直接访问您的邮件服务器 例如 Gmail Hotmail Outlook 并通过它发送邮件 但许多邮件服务器会拒绝从不同于邮件服务器的域 您的 ip 发送的邮件
  • JS中Set去重

    Set类似于数组 但成员均是唯一的 没有重复值 Set本身是一个构造函数 用来生成Set数据结构 数组去重 const arr 2 2 3 4 4 const uniqe new Set arr 2 3 4 Array from方法可以将S
  • java实现姓名、手机号和银行卡中间用*号代替

    package com util date Description 模拟各大网站充值时的数据显示 author ShengLiu date 2018 7 4 public class TestUtil 定义所有常量 public stati
  • 关于Java中ArrayList最大容量Integer.MAX_VALUE-8中的8所代表的意义

    关于为何要减8这个问题 可以从出现何种错误的角度去看 你可以在程序中试图直接分配Integer MAX VALUE大小的ArrayList ArrayList
  • Scrapy源码分析-Spiders爬虫中文文档(一)

    Spider类定义了如何爬取某个 或某些 网站 包括了爬取的动作 例如 是否跟进链接 以及如何从网页的内容中提取结构化数据 爬取item 换句话说 Spider就是您定义爬取的动作及分析某个网页 或者是有些网页 的地方 对spider来说