想想就不从scrapy流程图去写了毕竟是记录,详细可读文档scrapy0.24中文文档
从学习的角度我认为从setting配置开始你会了解其他组件的功能以及设置,当然不涉及源码
首先了所谓的配置并不是只是写在setting这个文件里,同时在配置方法有优先级顺序:
命令行选项(Command line Options)(最高优先级)#终端设定
##可以使用command line 选项 -s (或 --set) 来覆盖一个(或更多)选项
#scrapy crawl myspider -s LOG_FILE=scrapy.log#设置log
爬虫中设定
#使用属性custom_settings覆盖项目的
class DemoSpider(scrapy.Spider) :
name = 'demo'
custom_settings = {
'SOME_SETTING': 'some value',
}
项目设定模块(Project settings module)#就是setting文件
获取通过:项目名.settings
命令默认设定(Default settings per-command)#自定义配置
from scrapy.commands import ScrapyCommand
class Command(ScrapyCommand):
default_settings = {'LOG_ENABLED': False}
def run(self, args, opts):
print("hello")
默认全局设定(Default global settings)#导模块设置
scrapy.settings.default_settings
如何访问设定:
1.爬虫中通过爬虫基类的属性setting就可以、
class MySpider(scrapy.Spider):###基类
name = 'myspider'
start_urls = ['http://example.com']
def parse(self, response):
print("Existing settings: %s" % self.settings.attributes.keys())##访问setting的键,当然也可以访问值
2在还未开始爬虫的时候,也就是请求未到parse,当然这涉及scrapy请求到返回response的过程,此处不多说
class MyExtension(object):
def __init__(self, log_is_enabled=False):##这里在初始华中分配置了log是否开启
if log_is_enabled:
print("log is enabled!")
@classmethod #用来指定一个类的方法为类方法,没有此参数指定的类的方法为实例方法,大概就是在初始化之前进行一些操作,这个例子很透彻:[生动的讲解](https://blog.csdn.net/dyh4201/article/details/78336529)
def from_crawler(cls, crawler):###cls就是表示调用类名可以这么说吧
settings = crawler.settings
return cls(settings.getbool('LOG_ENABLED'))##getbool实在没资料不过有片Java文章里大概的意思:当且仅当以参数命名的系统属性存在,且等于 “true” 字符串时,才返回 true。这里应该是获取参数的值再加上cls就好解释了
3 设置对象可以像dict(例如, settings[‘LOG_ENABLED’])一样使用,但通常首选使用
SettingsAI 提供的方法之一,以您需要的格式提取设置,以避免类型错误。
设定名字的命名规则:
设定的名字以要配置的组件作为前缀。 例如,一个robots.txt插件的合适设定应该为 ROBOTSTXT_ENABLED, ROBOTSTXT_OBEY, ROBOTSTXT_CACHEDIR 等等。
好吧大菜来了
1:AWS_ACCESS_KEY_ID
默认: None
由需要访问Amazon Web服务的代码使用的AWS访问密钥(AWS access key),例如S3源存储后端###这个scrapy有专门的存储系统后面会专门说
2:AWS_SECRET_ACCESS_KEY
默认: None
由需要访问Amazon Web服务的代码使用的AWS密钥(AWS secret key),例如S3源存储后端。
3:BOT_NAME
默认: 'scrapybot'
Scrapy项目实现的bot的名字(项目名称)。 这将用来构造默认 User-Agent,同时也用来log。
使用 startproject 命令创建项目时其也被自动赋值
4:CONCURRENT_ITEMS##处理item的并发最大值
默认: 100
Item Processor(即 Item Pipeline) 同时处理(每个response的)item的最大值。
5:CONCURRENT_REQUESTS###也就是总的请求并发数
默认: 16
Scrapy downloader 并发请求(concurrent requests)的最大值
6:CONCURRENT_REQUESTS_PER_DOMAIN##单站默认8个请求并发线程
默认: 8
对单个网站进行并发请求的最大值
7:CONCURRENT_REQUESTS_PER_IP##从ip设置并发非0,并发数使用此设定数
默认: 0
对单个IP进行并发请求的最大值。如果非0,则忽略 CONCURRENT_REQUESTS_PER_DOMAIN 设定, 使用该设定。 也就是说,并发限制将针对IP,而不是网站。
该设定也影响 DOWNLOAD_DELAY: 如果 CONCURRENT_REQUESTS_PER_IP 非0,下载延迟应用在IP而不是网站上。
8:DEFAULT_ITEM_CLASS##默认最好
默认: 'scrapy.item.Item'
the Scrapy shell 中实例化item使用的默认类
9:DEFAULT_REQUEST_HEADERS##由DefaultHeadersMiddleware产生的默认header,可用setting配置头部覆盖,也可自己设置header,当然爬虫中也可以设置只是每次回调都要传参
默认:
{
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
}
Scrapy HTTP Request使用的默认header。由 DefaultHeadersMiddleware 产生
10:DEPTH_LIMIT##爬取深度,一般不会丢掉这个,也和你的爬取策略有关:深度优先,广度优先。这还有个关于去重策略的文章:策略
默认: 0
爬取网站最大允许的深度(depth)值。如果为0,则没有限制
11:DEPTH_PRIORITY##根据深度调整优先级
默认: 0
整数值。用于根据深度调整request优先级。
如果为0,则不根据深度进行优先级调整
12:DEPTH_STATS##请注意收集和爬取是两个概念,scrapy有自己的收集系统
默认: True
是否收集最大深度数据
13:DEPTH_STATS_VERBOSE##这个收集每个深度的详细数据说实话不太懂,难道不设置就不详细?线程并发问题?还是?以后在代码去解决这个疑惑
默认: False
是否收集详细的深度数据。如果启用,每个深度的请求数将会被收集在数据中
14:DNSCACHE_ENABLED##是否启用dns代理缓存
默认: True
是否启用DNS内存缓存(DNS in-memory cache)
加1:DNSCACHE_SIZE##dns缓存大小
Default: 10000
加2:DNS_TIMEOUT##dns查询超时
Default: 60
15:DOWNLOADER##这还是不要改为妙
默认: 'scrapy.core.downloader.Downloader'
用于crawl的downloader.
16:DOWNLOADER_MIDDLEWARES##这个是管理下载中间件的顺序,可以用none来改启不启用中间件
默认:: {}
保存项目中启用的下载中间件及其顺序的字典。
17:DOWNLOADER_MIDDLEWARES_BASE#默认的中间件,顺序也有,别在这改,如果不想用了在上面这个字典里配置为none就可以了。
默认:
{
'scrapy.contrib.downloadermiddleware.robotstxt.RobotsTxtMiddleware': 100,
'scrapy.contrib.downloadermiddleware.httpauth.HttpAuthMiddleware': 300,
'scrapy.contrib.downloadermiddleware.downloadtimeout.DownloadTimeoutMiddleware': 350,
'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware': 400,
'scrapy.contrib.downloadermiddleware.retry.RetryMiddleware': 500,
'scrapy.contrib.downloadermiddleware.defaultheaders.DefaultHeadersMiddleware': 550,
'scrapy.contrib.downloadermiddleware.redirect.MetaRefreshMiddleware': 580,
'scrapy.contrib.downloadermiddleware.httpcompression.HttpCompressionMiddleware': 590,
'scrapy.contrib.downloadermiddleware.redirect.RedirectMiddleware': 600,
'scrapy.contrib.downloadermiddleware.cookies.CookiesMiddleware': 700,
'scrapy.contrib.downloadermiddleware.httpproxy.HttpProxyMiddleware': 750,
'scrapy.contrib.downloadermiddleware.chunked.ChunkedTransferMiddleware': 830,
'scrapy.contrib.downloadermiddleware.stats.DownloaderStats': 850,
'scrapy.contrib.downloadermiddleware.httpcache.HttpCacheMiddleware': 900,
}
包含Scrapy默认启用的下载中间件的字典。 永远不要在项目中修改该设定,而是修改 DOWNLOADER_MIDDLEWARES 。
18:DOWNLOADER_STATS#收集器有些功能可以当log使用,比如统计哪一层爬了多少页
默认: True
是否收集下载器数据
19:DOWNLOAD_DELAY###网站下载页面的固定延迟,默认0.25,特殊的看下面
默认: 0
下载器在下载同一个网站下一个页面前需要等待的时间。该选项可以用来限制爬取速度, 减轻服务器压力。同时也支持小数:
DOWNLOAD_DELAY = 0.25 # 250 ms of delay
该设定影响(默认启用的) RANDOMIZE_DOWNLOAD_DELAY 设定。 默认情况下,Scrapy在两个请求间不等待一个固定的值, 而是使用0.5到1.5之间的一个随机值 * DOWNLOAD_DELAY 的结果作为等待间隔。
当 CONCURRENT_REQUESTS_PER_IP 非0时,延迟针对的是每个ip而不是网站。
另外您可以通过spider的 download_delay 属性为每个spider设置该设定。
20:DOWNLOAD_HANDLERS###启用何种下载器
默认: {}
保存项目中启用的下载处理器(request downloader handler)的字典。
21:DOWNLOAD_HANDLERS_BASE##默认的的几种下载器,全开,上面改
默认:
{
'file': 'scrapy.core.downloader.handlers.file.FileDownloadHandler',
'http': 'scrapy.core.downloader.handlers.http.HttpDownloadHandler',
'https': 'scrapy.core.downloader.handlers.http.HttpDownloadHandler',
's3': 'scrapy.core.downloader.handlers.s3.S3DownloadHandler',
}
保存项目中默认启用的下载处理器(request downloader handler)的字典。 永远不要在项目中修改该设定,而是修改 DOWNLOADER_HANDLERS 。
如果需要关闭上面的下载处理器,您必须在项目中的 DOWNLOAD_HANDLERS 设定中设置该处理器,并为其赋值为 None 。 例如,关闭文件下载处理器:
DOWNLOAD_HANDLERS = {
'file': None,
}
22:DOWNLOAD_TIMEOUT##下载超时默认180,秒
默认: 180
下载器超时时间(单位: 秒)
好了该睡觉了下一篇有空再补