Spider

Spider

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

class scrapy.Spider是最基本的类,所有编写的爬虫必须继承这个类。

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

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

start_requests() 调用make_requests_from url():生成Requests对象交给Scrapy下载并返回response

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

response.body将输出response的包体,输出 response.headers 可以看到response的包头

源码参考

# 所有爬虫的基类,用户定义的爬虫必须从这个类继承
class Spider(object_ref):

    # name是spider名称,而且是必须的和唯一的。
    name = None

    # 初始化,提取爬虫名字,start_ruls
    # **kwargs作用是把传入key=value格式转成字典格式给后面的函数调用(可以接收可变长度参数)
    def __init__(self, name=None, **kwargs):
        # 判断爬虫名字是否存在
        if name is not None:
            self.name = name
        # 如果爬虫没有名字,中断后续操作则报错
        elif not getattr(self, 'name', None):
            # raise 主动抛出异常 并关闭程序
            raise ValueError("%s must have a name" % type(self).__name__)

        # 判断爬虫是否写start_urls
        if not hasattr(self, 'start_urls'):
            self.start_urls = []

    # 打印Scrapy执行后的log信息
    def logger(self):
        # 创建logging对象,把爬虫名字传入当成logging日志的文件名称,可以在重写这个方法自己定义logging日志文件名称
        logger = logging.getLogger(self.name)
        # 把创建的logging对象和爬虫实例化对象返回
        return logging.LoggerAdapter(logger, {'spider': self})

    # log是logging模块的方法
    # message 爬虫运行信息
    # level logging等级
    # **kw 传入key=value格式转成字典格式给后面的函数调用(可以接收可变长度参数)
    def log(self, message, level=logging.DEBUG, **kw):
        # 调用logger.log方法,生成logging信息
        self.logger.log(level, message, **kw)

    # 该方法将读取start_urls内的地址
    # 该方法仅调用一次
    # start_requests()中调用,实际生成Request的函数。
    # Request对象默认的回调函数为self.parse(),提交的方式为get
    def start_requests(self):
        # 在start_urls列表中循环取出url
        for url in self.start_urls:
            # 调用self.make_requests_from_url方法
            yield self.make_requests_from_url(url)

    def make_requests_from_url(self, url):
        # 根据url发get请求 默认的回调函数是self.parse()
        # request是spider内部的方法,里面封装了urllib.request()和urllib.parse()
        # urllib.parse.urlencode()  产生转换成url编码格式(字符串)
        # urllib.request.Request()构造并返回一个Request对象 这里可以加请求参数
        # urllib2.request.urlopen()   发起请求并得到返回数据
        # Requests 自称 “HTTP for Humans” 就是在urllib基础行进一步封装的
        return Request(url, dont_filter=True)

    # make_requests_from_url这个方法默认的回调函数
    # response make_requests_from_url返回的数据
    def parse(self, response):
        # raise NotImplementedError() 在调用parse函数函数时候使用了没有在parse里面定义的子类 raise就会自动抛出异常并接收函数
        raise NotImplementedError('{}.parse callback is not defined'.format(self.__class__.__name__))
    # 下一个请求从response里面获取url,或者自己拼接url 自己构建scrapy.Request(self, url, callback=None, method='GET', headers=None, body=None, cookies=None, meta=None, encoding='utf-8', priority=0, dont_filter=False, errback=None, flags=None)
    # self 实例化对象 类自己换传递,不需我们穿
    # url 同一资源定位符号
    # callback 响应成功的回调函数
    # method 请求方式
    # headers 请求头信息
    # body 请求体
    # cookies cookies信息
    # meta 传递给回调函数的产生
    # encoding 指定编码
    # priority 请求的优先级
    # dont_filter 请求是否去重
    # errback 异常时候的回调函数
    # flags 标记请求

主要属性和方法

  • name

    定义spider名字的字符串。

    例如,如果spider爬取 mywebsite.com ,该spider通常会被命名为 mywebsite

  • allowed_domains

    包含了spider允许爬取的域名(domain)的列表,可选。

  • start_urls

    初始URL元祖/列表。当没有制定特定的URL时,spider将从该列表中开始进行爬取。

  • start_requests(self)

    该方法必须返回一个可迭代对象(iterable)。该对象包含了spider用于爬取(默认实现是使用 start_urls 的url)的第一个Request。

    当spider启动爬取并且未指定start_urls时,该方法被调用。

  • parse(self, response)

    当请求url返回网页没有指定回调函数时,默认的Request对象回调函数。用来处理网页返回的response,以及生成Item或者Request对象。

  • log(self, message[, level, component])

    使用 scrapy.log.msg() 方法记录(log)message。 更多数据请参见 logging

原文地址:https://www.cnblogs.com/yoyo1216/p/10131336.html