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