Scrapy——Spider

import scrapy.Spider

Spider类定义了如何爬去某个网站,包括爬取的动作以及如何从网页内容中提取结构化的数据,总的来说spider就是定义爬取的动作以及分析某个网页。

 

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

 

工作流程:

  1. 以初始的URL初始化Request,并设置回调函数,当该request下载完毕并返回时,将生成response,并作为参数传给回调函数. spider中初始的request是通过父类列start_requests()方法调用make_requests_from_url()来获取的。start_requests()获取 start_urls中的URL,并以parse以回调函数生成Request 
  2. 在回调函数内分析返回的网页内容,可以返回Item对象,或者Dict,或者Request,以及是一个包含三者的可迭代的容器,返回的Request对象之后会经过Scrapy处理,下载相应的内容,并调用设置的callback函数
  3. 在回调函数内,可以通过lxml,bs4,xpath,css等方法获取我们想要的内容生成item
  4. 最后将item传递给Pipeline处理

 

spider一些常用属性:

 

我们所有自己写的爬虫都是继承于spider.Spider这个类

name

定义爬虫名字,我们通过命令启动的时候用的就是这个名字,这个名字必须是唯一的

allowed_domains

包含了spider允许爬取的域名列表。当offsiteMiddleware启用时,域名不在列表中URL不会被访问

所以在爬虫文件中,每次生成Request请求时都会进行和这里的域名进行判断

start_urls

起始的url列表

这里会通过spider.Spider方法中会调用start_request循环请求这个列表中每个地址。

custom_settings

自定义配置,可以覆盖settings的配置,主要用于当我们对爬虫有特定需求设置的时候

设置的是以字典的方式设置:custom_settings = {}

例:

 

custom_settings = {
        'LOG_LEVEL':'INFO',
        'DOWNLOAD_DELAY': 0,
        'COOKIES_ENABLED': False,  # enabled by default
        'DOWNLOADER_MIDDLEWARES': {
            # 代理中间件
            'mySpider.middlewares.ProxiesMiddleware': 400,
            # SeleniumMiddleware 中间件
            'mySpider.middlewares.SeleniumMiddleware': 543,
            # 将scrapy默认的user-agent中间件关闭
            'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
        }

 

from_crawler

在spider中使用会出现问题

这是一个类方法,我们定义这样一个类方法,可以通过crawler.settings.get()这种方式获取settings配置文件中的信息,同时这个也可以在pipeline中使用

例:

def __init__(self, mongo_uri, mongo_db):    #构造函数,并设置两个参数
    self.mongo_uri = mongo_uri
    self.mongo_db = mongo_db

@classmethod
def from_crawler(cls, crawler):     #在settings中获取两个变量,赋值到构造函数设置的两个参数中供使用
    return cls(
        mongo_uri=crawler.settings.get('MONGO_URI'),
        mongo_db=crawler.settings.get('MONGO_DATABASE')
    )

start_requests()

这个方法必须返回一个可迭代对象,该对象包含了spider用于爬取的第一个Request请求

这个方法是在被继承的父类中spider.Spider中写的,默认是通过get请求,如果我们需要修改最开始的这个请求,可以重写这个方法,如我们想通过post请求

make_requests_from_url(url)

这个也是在父类中start_requests调用的,当然这个方法我们也可以重写

parse(response)

这个其实默认的回调函数

负责处理response并返回处理的数据以及跟进的url

该方法以及其他的Request回调函数必须返回一个包含Request或Item的可迭代对象

 

 

posted @ 2019-11-20 00:53  lanston  阅读(216)  评论(0编辑  收藏  举报