scrapy学习笔记

本文介绍了Scrapy爬虫的实践技巧,包括创建项目、设置User-Agent、代理、Cookie、超时、并发数、下载延迟等配置,以及命令行工具、蜘蛛、选择器、ItemLoader、Pipeline的使用。还涵盖了错误处理、日志、邮件发送、telnet控制台、图片下载、断点续爬和信号处理等高级话题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

!@#789#1. 创建项目 scrapy startproject my_project
2.创建spider scrapy genspider my_spider
3.随机User-Agent:
ua 是一个请求头列表
可以放到settings
在下载中间件的process_request()函数里添加 request.headers.setdefault(‘User-Agent’, random.choice(ua_list))
同时把默认的请求头中间件禁掉
‘scrapy.downloadmiddlewares.useragent.UserAgentMiddleware’: None,
4.随机代理
中间件设置:
request.meta[‘proxy’] = proxies
5.随机cookie
中间节设置
request.headers.setdefault(‘Cookie’, cookies)
禁止自带的cookie中间节
‘scrapy.downloadermiddlewares.cookies.CookiesMiddleware’: None,
6. 设置下载超时
DOWNLOAD_TIMEOUT = 15
默认时间超时时间180 秒, 太长这里修改为15秒
可以捕获这个超时错误
from twisted.internet.error import TimeoutError
在 process_exception() 函数里用 isinstance() 判断是否是超时错误
7.设置并发数
CONCURRENT_REQUESTS = 16
默认是16个并发
8. 设置下载延迟
DOWNLOAD_DELAY = 0.5
9.手动处理错误代码
HTTPERROR_ALLOWED_CODES = [403]

一.命令行工具
1.scrapy 的全局命令
startproject # 创建项目
genspider # 创建蜘蛛
settings # 获取settings 的值
runspider # 运行一个蜘蛛文件
shell # 进入交互模式
fetch # 下载给定的url并将内容输出
view # 下载给定的url并保存
version # 查看scrapy 版本号
2. scrapy 仅限项目的命令
crawl # 运行蜘蛛
check # 检测蜘蛛
list # 列出所有蜘蛛
edit # 编辑蜘蛛
parse
bench # 基准测试
3. 创建项目 scrapy startproject myproject [project_dir]
4.创建蜘蛛 scrapy genspider mydomain mydomain.com
5. 查看所有可用命令 scrapy -h

二.蜘蛛
1.name属性
scrapy靠name属性定位和实例化蜘蛛
必须是惟一的
2. allowed_domains
允许爬行的域名

3.custom_settings
字典样式 ,将会覆盖settings里的设置
适用于多个爬虫在同一项目内

4.from_crawl(crawler,* args,** kwargs )
创建蜘蛛的类方法

5.close
类方法, 蜘蛛关闭时调用该方法 并调用spider的 closed()方法

  1. 在命令行可以通过 -a 来传递参数

三.选择器
1.css
2.xpath
3.re
4.re_first()
可以混合使用

四.itemloader
1.from scrapy.loader import ItemLoader
from myproject.item import Myitem
l = ItemLoader(item=Myitem(), response=response()) # 实例化一个itemloader对象
2.add_path()方法
l.add_xpath(‘name’, xpath1) # name是item字段名 ,xpath1是xpath表达式
3. add_css()方法
l.add_xpath(‘name’, css1) # name是item字段名 ,xpath1是css表达式
4. add_value()方法
l.add_xpath(‘name’, value) # name是item字段名 ,xpath1是具体的值
5.load_item()方法
return l.load_item() # 返回一个item对象
6.
使用add_xpath 或者 add_css 时通常会得到一个列表
要想得到单个数值,或者设置处理函数 要在item中设置
from scrapy.loader.processors import TakeFirst, MapCompose, Join
TakeFirst() 取第一个值
Join() 拼接 可以接受一个字符串
MapCompose() 可以接受一个处理函数
即input_processor参数的效果是在传值给item前进行预处理,并将结果分配给itemloader
output_processor 将itemlaoder中的值处理后分配给item中的字段

还可以通过继承itemloader类来重写itemloader

五.pipline

  1. process_item(self, item, spider)
    每个item都会调用此方法
    2.open_spider(self,crawl)
    打开蜘蛛时候调用次方法
    3.close_spider(self,crawl)
    关闭蜘蛛时会调用次方法
    4.from_crawler(cls,crawl)
    它必须返回管道的新实例。Crawler对象提供对所有Scrapy核心组件的访问

六.request和response
在request中的meta里可以使用 dont_merage_cookies 来不合并cookie
dont_filter 不对url进行去重

request.follow()可以接受相对url

七.
可以使用不同的机制填充设置,每个机制具有不同的优先级。以下是按优先顺序递减的列表:

1.命令行选项(最优先)
2.每蜘蛛的设置
3.项目设置模块
4.每个命令的默认设置
5.默认全局设置(优先级较低)

以下是所有可用Scrapy设置

  1. BOT_NAME
    默认: ‘scrapybot’

此Scrapy项目实现的bot的名称(也称为项目名称)。这将默认用于构建User-Agent,也用于日志记录。

使用该startproject命令创建项目时,它会自动填充项目名称。

  1. CONCURRENT_ITEMS
    默认: 100

在项目处理器(也称为项目管道)中并行处理的最大并发项目数(每个响应)。

  1. CONCURRENT_REQUESTS
    默认: 16

Scrapy下载程序将执行的最大并发(即同时)请求数。

  1. CONCURRENT_REQUESTS_PER_DOMAIN
    默认: 8

将对任何单个域(域名)执行的最大并发(即同时)请求数。

另请参阅:AutoThrottle扩展及其 AUTOTHROTTLE_TARGET_CONCURRENCY选项。

  1. CONCURRENT_REQUESTS_PER_IP
    默认: 0

将对任何单个IP执行的最大并发(即同时)请求数。如果非零,CONCURRENT_REQUESTS_PER_DOMAIN则忽略该 设置,而使用此设置。换句话说,并发限制将应用于每个IP,而不是每个域。

此设置还会影响DOWNLOAD_DELAY和 AutoThrottle扩展:如果CONCURRENT_REQUESTS_PER_IP 非零,则按 IP而不是每个域强制执行下载延迟。

  1. DEFAULT_ITEM_CLASS
    默认: ‘scrapy.item.Item’

将用于实例化Scrapy shell中的项的默认类。

  1. DEFAULT_REQUEST_HEADERS
    默认:

{
‘Accept’: ‘text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8’,
‘Accept-Language’: ‘en’,
}
用于Scrapy HTTP请求的默认标头。他们居住在这里 DefaultHeadersMiddleware。

  1. DEPTH_LIMIT
    默认: 0

范围: scrapy.spidermiddlewares.depth.DepthMiddleware

允许为任何站点爬网的最大深度。如果为零,则不会施加任何限制。

  1. DEPTH_PRIORITY
    默认: 0

范围: scrapy.spidermiddlewares.depth.DepthMiddleware

一个整数,用于根据深度调整请求优先级:

如果为零(默认),则不从深度进行优先级调整
正值将降低优先级,即稍后将处理更高深度的请求 ; 这在进行广度优先爬网(BFO)时常用
负值将增加优先级,即更快的深度请求将被更快地处理(DFO)
另请参阅:Scrapy是以广度优先还是深度优先顺序爬行?关于为BFO或DFO调整Scrapy。

注意

此设置调整优先级以相反的方式相对于其他优先级设置REDIRECT_PRIORITY_ADJUST 和RETRY_PRIORITY_ADJUST。

  1. DOWNLOADER_MIDDLEWARES
    默认:: {}

包含项目中启用的下载器中间件及其订单的dict。有关更多信息,请参阅激活下载中间件。

DOWNLOADER_MIDDLEWARES_BASE
默认:

{
‘scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware’: 100,
‘scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware’: 300,
‘scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware’: 350,
‘scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware’: 400,
‘scrapy.downloadermiddlewares.useragent.UserAgentMiddleware’: 500,
‘scrapy.downloadermiddlewares.retry.RetryMiddleware’: 550,
‘scrapy.downloadermiddlewares.ajaxcrawl.AjaxCrawlMiddleware’: 560,
‘scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware’: 580,
‘scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware’: 590,
‘scrapy.downloadermiddlewares.redirect.RedirectMiddleware’: 600,
‘scrapy.downloadermiddlewares.cookies.CookiesMiddleware’: 700,
‘scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware’: 750,
‘scrapy.downloadermiddlewares.stats.DownloaderStats’: 850,
‘scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware’: 900,
}
包含Scrapy中默认启用的下载器中间件的dict。低订单更接近引擎,高订单更接近下载。您永远不应该在项目中修改此设置,DOWNLOADER_MIDDLEWARES而是修改 。有关更多信息,请参阅 激活下载中间件。

  1. DOWNLOADER_STATS
    默认: True

是否启用下载统计信息收集。

  1. DOWNLOAD_DELAY
    默认: 0

下载器从同一网站下载连续页面之前应等待的时间(以秒为单位)。这可以用来限制爬行速度,以避免过于严重地击中服务器。支持十进制数。例:

DOWNLOAD_DELAY = 0.25 # 250 ms of delay
此设置也受RANDOMIZE_DOWNLOAD_DELAY 设置(默认情况下启用)的影响。默认情况下,Scrapy不会在请求之间等待一段固定的时间,而是使用0.5 * DOWNLOAD_DELAY和1.5 * 之间的随机间隔DOWNLOAD_DELAY。

当CONCURRENT_REQUESTS_PER_IP非零时,每个IP地址而不是每个域强制执行延迟。

您还可以通过设置download_delay spider属性来更改每个蜘蛛的此设置。

  1. DOWNLOAD_TIMEOUT
    默认: 180

下载器在超时之前等待的时间(以秒为单位)。

注意

可以使用download_timeout spider属性为每个蜘蛛设置此超时,使用download_timeout Request.meta键为每个请求设置此超时。

  1. DOWNLOAD_MAXSIZE
    默认值:1073741824(1024MB)

下载程序将下载的最大响应大小(以字节为单位)。

如果要禁用它,请将其设置为0。

注意

可以使用download_maxsize spider属性为每个蜘蛛设置此大小,使用download_maxsize Request.meta键为每个请求设置此大小。

此功能需要Twisted> = 11.1。

  1. DUPEFILTER_CLASS
    默认: ‘scrapy.dupefilters.RFPDupeFilter’

用于检测和过滤重复请求的类。

默认(RFPDupeFilter)过滤器使用该scrapy.utils.request.request_fingerprint功能基于请求指纹。为了更改检查重复项的方式,您可以继承RFPDupeFilter并覆盖其request_fingerprint方法。此方法应接受scrapy Request对象并返回其指纹(字符串)。

您可以通过设置DUPEFILTER_CLASS为禁用对重复请求的过滤 ‘scrapy.dupefilters.BaseDupeFilter’。但是要非常小心,因为你可以进入爬行循环。通常最好将dont_filter参数设置为不应过滤True的特定参数 Request。

  1. DUPEFILTER_DEBUG
    默认: False

默认情况下,RFPDupeFilter仅记录第一个重复请求。设置DUPEFILTER_DEBUG为True将使其记录所有重复的请求。

编辑
默认值:( vi在Unix系统上)或IDLE编辑器(在Windows上)

用于使用edit命令编辑蜘蛛的编辑器。此外,如果EDITOR设置了环境变量,则edit 命令将优先于默认设置。

扩展
默认:: {}

包含项目中启用的扩展名及其订单的dict。

EXTENSIONS_BASE
默认:

{
‘scrapy.extensions.corestats.CoreStats’: 0,
‘scrapy.extensions.telnet.TelnetConsole’: 0,
‘scrapy.extensions.memusage.MemoryUsage’: 0,
‘scrapy.extensions.memdebug.MemoryDebugger’: 0,
‘scrapy.extensions.closespider.CloseSpider’: 0,
‘scrapy.extensions.feedexport.FeedExporter’: 0,
‘scrapy.extensions.logstats.LogStats’: 0,
‘scrapy.extensions.spiderstate.SpiderState’: 0,
‘scrapy.extensions.throttle.AutoThrottle’: 0,
}
包含Scrapy中默认可用扩展名的dict及其订单。此设置包含所有稳定的内置扩展。请记住,其中一些需要通过设置启用。

有关详细信息,请参阅扩展程序用户指南 和可用扩展程序列表。

  1. ITEM_PIPELINES
    默认: {}

包含要使用的项目管道的dict及其订单。订单值是任意的,但通常在0-1000范围内定义它们。在更高订单之前降低订单处理。

例:

ITEM_PIPELINES = {
‘mybot.pipelines.validate.ValidateMyItem’: 300,
‘mybot.pipelines.validate.StoreMyItem’: 800,
}
ITEM_PIPELINES_BASE
默认: {}

包含Scrapy中默认启用的管道的dict。您永远不应该在项目中修改此设置,ITEM_PIPELINES而是修改。

  1. LOG_ENABLED
    默认: True

是否启用日志记录。

  1. LOG_ENCODING
    默认: ‘utf-8’

用于记录的编码。

  1. LOG_FILE
    默认: None

用于记录输出的文件名。如果None,将使用标准错误。

  1. LOG_FORMAT
    默认: ‘%(asctime)s [%(name)s] %(levelname)s: %(message)s’

用于格式化日志消息的字符串。有关可用占位符的完整列表,请参阅Python日志记录文档。

  1. LOG_DATEFORMAT
    默认: ‘%Y-%m-%d %H:%M:%S’

用于格式化日期/时间的字符串,用于扩展%(asctime)s占位符LOG_FORMAT。有关可用指令的完整列表,请参阅Python datetime文档。

  1. LOG_LEVEL
    默认: ‘DEBUG’

记录的最低级别。可用级别为:CRITICAL,ERROR,WARNING,INFO,DEBUG。有关更多信息,请参阅记录。

  1. LOG_STDOUT
    默认: False

如果True,您的进程的所有标准输出(和错误)将被重定向到日志。例如,如果它将出现在Scrapy日志中。print ‘hello’

  1. LOG_SHORT_NAMES
    默认: False

如果True,日志将只包含根路径。如果设置为False 则显示负责日志输出的组件

  1. NEWSPIDER_MODULE
    默认: ‘’

使用该genspider命令模块在哪里创建新的蜘蛛。

例:

NEWSPIDER_MODULE = ‘mybot.spiders_dev’

  1. RANDOMIZE_DOWNLOAD_DELAY
    默认: True

如果启用,Scrapy将在从同一网站获取请求时等待一段随机时间(介于0.5 * DOWNLOAD_DELAY和1.5 *之间DOWNLOAD_DELAY)。

这种随机化降低了分析请求在其请求之间寻找统计上显着相似性的请求被检测(并随后被阻止)的机会。

随机化策略与wget --random-wait选项使用的相同。

如果DOWNLOAD_DELAY为零(默认),则此选项无效。

  1. REACTOR_THREADPOOL_MAXSIZE
    默认: 10

Twisted Reactor线程池大小的最大限制。这是各种Scrapy组件使用的常见多用途线程池。螺纹DNS解析器,BlockingFeedStorage,S3FilesStore仅举几例。如果遇到阻塞IO不足的问题,请增加此值。

  1. REDIRECT_MAX_TIMES
    默认: 20

定义可以重定向请求的最大次数。在此最大值之后,请求的响应将按原样返回。我们使用Firefox默认值来执行相同的任务。

  1. REDIRECT_PRIORITY_ADJUST
    默认: +2

范围: scrapy.downloadermiddlewares.redirect.RedirectMiddleware

相对于原始请求调整重定向请求优先级:

正优先级调整(默认)意味着更高的优先级。
负优先级调整意味着较低的优先级。
RETRY_PRIORITY_ADJUST
默认: -1

范围: scrapy.downloadermiddlewares.retry.RetryMiddleware

相对于原始请求调整重试请求优先级:

正优先级调整意味着更高的优先级。
负优先级调整(默认)表示优先级较低。

  1. ROBOTSTXT_OBEY
    默认: False

范围: scrapy.downloadermiddlewares.robotstxt

如果启用,Scrapy将尊重robots.txt政策。有关更多信息,请参阅 RobotsTxtMiddleware。

注意

虽然默认值是False出于历史原因,但默认情况下会在命令生成的settings.py文件中启用此选项。scrapy startproject

调度器
默认: ‘scrapy.core.scheduler.Scheduler’

用于爬网的调度程序。

  1. SCHEDULER_DEBUG
    默认: False

设置为True将记录有关请求调度程序的调试信息。如果请求无法序列化到磁盘,则此当前日志(仅一次)。Stats counter(scheduler/unserializable)跟踪发生这种情况的次数。

日志中的示例条目:

1956-01-31 00:00:00+0800 [scrapy.core.scheduler] ERROR: Unable to serialize request:
<GET http://example.com> - reason: cannot serialize <Request at 0x9a7c7ec>
(type Request)> - no more unserializable requests will be logged
(see ‘scheduler/unserializable’ stats counter)

  1. SCHEDULER_DISK_QUEUE
    默认: ‘scrapy.squeues.PickleLifoDiskQueue’

调度程序将使用的磁盘队列类型。其他可用的类型有 scrapy.squeues.PickleFifoDiskQueue,scrapy.squeues.MarshalFifoDiskQueue, scrapy.squeues.MarshalLifoDiskQueue。

SCHEDULER_MEMORY_QUEUE
默认: ‘scrapy.squeues.LifoMemoryQueue’

调度程序使用的内存中队列的类型。其他可用的类型是: scrapy.squeues.FifoMemoryQueue。

SCHEDULER_PRIORITY_QUEUE
默认: ‘queuelib.PriorityQueue’

调度程序使用的优先级队列的类型。

  1. SPIDER_MIDDLEWARES
    默认:: {}

包含项目中启用的蜘蛛中间件及其订单的字典。有关更多信息,请参阅激活蜘蛛中间件。

SPIDER_MIDDLEWARES_BASE
默认:

{
‘scrapy.spidermiddlewares.httperror.HttpErrorMiddleware’: 50,
‘scrapy.spidermiddlewares.offsite.OffsiteMiddleware’: 500,
‘scrapy.spidermiddlewares.referer.RefererMiddleware’: 700,
‘scrapy.spidermiddlewares.urllength.UrlLengthMiddleware’: 800,
‘scrapy.spidermiddlewares.depth.DepthMiddleware’: 900,
}
包含Scrapy中默认启用的蜘蛛中间件的dict及其命令。低订单更接近引擎,高订单更接近蜘蛛。有关更多信息,请参阅激活蜘蛛中间件。

  1. SPIDER_MODULES
    默认: []

Scrapy将寻找蜘蛛的模块列表。

例:

SPIDER_MODULES = [‘mybot.spiders_prod’, ‘mybot.spiders_dev’]
STATS_CLASS
默认: ‘scrapy.statscollectors.MemoryStatsCollector’

用于收集统计信息的类,必须实现 Stats Collector API。

  1. STATS_DUMP
    默认: True

蜘蛛完成后,将Scrapy统计数据(转到Scrapy日志)转储。

有关详细信息,请参阅:统计数据集。

  1. STATSMAILER_RCPTS
    默认值:( []空列表)

在蜘蛛完成刮擦后发送Scrapy统计数据。有关详情StatsMailer,请参阅 。

  1. TELNETCONSOLE_ENABLED
    默认: True

一个布尔值,指定是否 启用telnet控制台(如果其扩展名也已启用)。

  1. TELNETCONSOLE_PORT
    默认: [6023, 6073]

用于telnet控制台的端口范围。如果设置为None或0,则使用动态分配的端口。有关详细信息,请参阅 Telnet控制台。

  1. TEMPLATES_DIR
    默认值:templatesdir在scrapy模块中

使用startproject命令创建新项目时使用命令查找模板的目录以及使用命令创建 新蜘蛛的目录genspider 。

项目名称不得与project子目录中的自定义文件或目录的名称冲突。

  1. URLLENGTH_LIMIT
    默认: 2083

范围: spidermiddlewares.urllength

允许抓取的网址的最大网址长度。有关此设置的默认值的详细信息,请参阅:https://boutell.com/newfaq/misc/urllength.html

  1. USER_AGENT
    默认: “Scrapy/VERSION (+https://scrapy.org)”

爬网时使用的默认User-Agent,除非被覆盖。

其他地方记录的设置:
其他地方记录了以下设置,请检查每个特定情况以了解如何启用和使用它们。

八.常见异常
1.scrapy.exceptions.DropItem
引发此异常来停止处理item

2.scrapy.exceptions.CloseSpider
引发此异常来请求关闭或停止蜘蛛

3.scrapy.exceptions.DontCloseSpider
引发此异常来阻止关闭蜘蛛

4.scrapy.exceptions.IgnoreRequest
调度程序或任何下载程序中间件可以引发此异常,以指示应忽略该请求(request对象)。

5.scrapy.exceptions.NotConfigured
某些组件可能会引发此异常,以指示它们将保持禁用状态。这些组件包括:

扩展
物品管道
下载中间件
蜘蛛中间件
必须在组件的__init__方法中引发异常。


1.通过crawl的stats属性访问信息收集器
@classmethod
def from_crawler(cls, crawler):
return cls(crawler.stats)
stats.get_value() # 获得统计值
stats.get_stats() # 获得所有统计数据

十.发送电子邮件
from scrapy.mail import MailSender
mailer = MailSender()

mailer.send()来发送邮件
参数:
to(str 或str of list) - 电子邮件收件人
subject(str) - 电子邮件的主题
cc(str 或str的列表) - CC的电子邮件
body(str) - 电子邮件正文
attachs(iterable) - 一个可迭代的元组,其中 是一个字符串,其名称将出现在电子邮件的附件上,是附件的mimetype,是一个可读的文件对象,带有附件的内容(attach_name, mimetype, file_object)attach_namemimetypefile_object
mimetype(str) - 电子邮件的MIME类型
charset(str) - 用于电子邮件内容的字符编码
from scrapy.mail import MailSender
mail = MailSender(
smtphost=‘smtp.163.com’, # 使用邮箱账号的服务器地址
mailfrom=‘xyz18872921369@163.com’, # 邮箱账号
smtpuser=‘xyz18872921369@163.com’, # 邮箱账号
smtppass=‘xuyuzhen123’, # 邮箱授权码
smtpport=25 # 服务器端口 默认25
)
mail.send(
to=‘925150722@qq.com’, # 要发送的邮箱
subject=‘测试爬虫’, # 邮件标题
body=‘爬虫关闭’, # 邮件内容
)

十一.telnet控制台
1.开启电脑telnet服务
2.telnet lcoalhost 6023 # 连接scrapy telnet控制台
3.常用变量
crawler Scrapy Crawler(scrapy.crawler.Crawler对象)
engine Crawler.engine属性
stats 统计信息收集器(Crawler.stats属性)
est 打印发动机状态报告
您可以使用est()Scrapy引擎的方法使用telnet控制台快速显示其状态:

telnet localhost 6023

est()
Execution engine status

time()-engine.start_time : 8.62972998619
engine.has_capacity() : False
len(engine.downloader.active) : 16
engine.scraper.is_idle() : False
engine.spider.name : followall
engine.spider_is_idle(engine.spider) : False
engine.slot.closing : False
len(engine.slot.inprogress) : 16
len(engine.slot.scheduler.dqs or []) : 0
len(engine.slot.scheduler.mqs) : 92
len(engine.scraper.slot.queue) : 0
len(engine.scraper.slot.active) : 0
engine.scraper.slot.active_size : 0
engine.scraper.slot.itemproc_size : 0
engine.scraper.slot.needs_backout() : False

十二.图片下载
1.from scrapy.pipelines.images import ImagesPipeline
导入图片pipeline
继承并重写该类
class SaveImagePipeline(ImagesPipeline):

def get_media_requests(self, item, info):
    # 下载图片,如果传过来的是集合需要循环下载
    # meta里面的数据是从spider获取,然后通过meta传递给下面方法:file_path
    yield Request(url=item['url'],meta={'name':item['title']})

def item_completed(self, results, item, info):
    # 是一个元组,第一个元素是布尔值表示是否成功
    if not results[0][0]:
        raise DropItem('下载失败')
    return item

# 重命名,若不重写这函数,图片名为哈希,就是一串乱七八糟的名字
def file_path(self, request, response=None, info=None):
    # 接收上面meta传递过来的图片名称
    name = request.meta['name']
    # 提取url前面名称作为图片名
    image_name = request.url.split('/')[-1]
    # 清洗Windows系统的文件夹非法字符,避免无法创建目录
    folder_strip = re.sub(r'[?\\*|“<>:/]', '', str(name))
    # 分文件夹存储的关键:{0}对应着name;{1}对应着image_guid
    filename = u'{0}/{1}'.format(folder_strip, image_name)
    return filename

其中get_media_requests,item_completed,file_path函数名都是固定的
分别表示下载图片,是否下载成功,和图片存放

  1. 存放路径
    在settings 里写入
    IMAGES_STORE = ‘./meizi’ # 图片保存在当前目录下的meizi文件夹里

  2. 打开图片pipeline
    ITEM_PIPELINES = {
    ‘Image360.pipelines.SaveImagePipeline’: 300,
    }

十三.暂停和恢复爬虫

  1. 开启 断点续爬模式
    scrapy crawl somespider -s JOBDIR=crawls/somespider-1
    程序终止后再次执行
    scrapy crawl somespider -s JOBDIR=crawls/somespider-1
    可以继续爬取

十四.信号
1.scrapy.signals.engine_started()
scrapy 引擎开始时发送

2.scrapy.signals.engine_stoppend()
scrapy 引擎停止时发送

3.scrapy.signals.item_scraped(item,response,spider)
item 通过所有的pipeline 后发送

4.scrapy.signals.item_dropped(item,exception,spider)
丢弃某个item是 发送

5.scrapy.signals.spider_closed(spider,reason)
关闭蜘蛛时发送

6.scrapy.signals.spider_opened(spider)
打开蜘蛛后发送

7.scrapy.signals.spdier_idle(spider)
蜘蛛闲置时发送

8.scrapy.signals.spider_error(failure,response,spider)
蜘蛛回调引发 异常时发送

9.scrapy.signals.request_scheduled(request,spider)
当引擎调度一个request 对象用于下载时发送该信号

10.scrapy.signals.request_dropped()
当一个request对象被调度程序拒绝时发送

11.scrapy.signals.response_received(response,request,spider)
当引擎从downloader获取一个新的response时发送该信号

12.scrapy.siganls.response_downloaded(response,request,spider)

当一个HttpResponse被下载时,由downloader发送该信号,该信号不支持返回deferreds

信号的使用
from scrapy import signals

@classmethod
def from_crawler(cls, crawler):
# This method is used by Scrapy to create your spiders.
s = cls()
crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)
# 建立信号槽 给信号绑定回调函数
crawler.signals.connect(s.item_scraped, signal=signals.item_scraped)
crawler.signals.connect(s.spider_closed, signal=signals.spider_closed)
crawler.signals.connect(s.spider_error, signal=signals.spider_error)
crawler.signals.connect(s.spider_idle, signal=signals.spider_idle)
return s

十五
scrapy 去重优化之布隆过滤器

十六
scrapy 异步渲染js 之scrapy-splash

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值