zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    android adb
    5 个免费的受欢迎的 SQLite 管理工具
    [Android]通过setImageURI设置网络上面的图片
    Android TextView实现长按复制文本功能的方法
    View工作原理(四)view的layout过程
    Anaroid WebView详解大全
    Android 如何在Eclipse中查看Android API源码以及support包源码
    关于Android的.so文件你所需要知道的
    AS问题解决系列3—iCCP: Not recognizing known sRGB profile(转)
    安卓App设计博文
  • 原文地址:https://www.cnblogs.com/yoyo1216/p/10131336.html
Copyright © 2011-2022 走看看