在爬虫的世界里,遇到失败是常有的事。可能是网络问题、服务器维护,或者是数据结构的变化。当这些意外发生时,如何从失败中恢复,继续完成你的爬虫任务,就显得尤为重要。Scrapy 断点传输功能正是为了解决这一问题而设计的。下面,我将详细讲解如何使用 Scrapy 断点传输,让你高效重拾你的爬虫之旅。
一、什么是Scrapy断点传输?
Scrapy断点传输(Distributed Crawl Control)是一种机制,允许你暂停和恢复爬虫的下载过程。当你暂停爬虫时,Scrapy会保存当前的状态,包括已经下载的URL、已经解析的数据等。当你重新启动爬虫时,Scrapy会从上次暂停的地方继续下载,而不是从头开始。
二、如何启用Scrapy断点传输?
要启用Scrapy断点传输,你需要在Scrapy项目的设置文件中添加以下配置:
”`python
settings.py
DUPEFILTER_CLASS = ‘scrapy.dupefilters.RFPDupeFilter’ DOWNLOADER_MIDDLEWARES = {
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': 400,
'scrapy.middleware.UserAgentMiddleware': 400,
'scrapy.middleware.RetryMiddleware': 90,
'scrapy.middleware.SpiderMiddleware': 820,
'scrapy.middleware.RedirectMiddleware': 830,
'scrapy.middleware.CrawlErrorMiddleware': 840,
'scrapy.middleware.LogEnableMiddleware': 850,
'scrapy.middleware.LogMiddleware': 860,
'scrapy.middleware.CrawlTimeoutMiddleware': 870,
'scrapy.middleware.CrawlDepthMiddleware': 880,
'scrapy.middleware.SpiderMiddleware': 890,
'scrapy.middleware.ProcessRequestMiddleware': 900,
'scrapy.middleware.ProcessResponseMiddleware': 910,
'scrapy.middleware.ProcessItemMiddleware': 920,
'scrapy.middleware.ProcessExitMiddleware': 930,
'scrapy.middleware.ProcessSignalMiddleware': 940,
'scrapy.middleware.ProcessExceptionMiddleware': 950,
'scrapy.middleware.ProcessCloseMiddleware': 960,
'scrapy.middleware.ProcessStatsMiddleware': 970,
'scrapy.middleware.ProcessPipelineMiddleware': 980,
'scrapy.middleware.ProcessSchedulerMiddleware': 990,
'scrapy.middleware.ProcessSchedulerSignalMiddleware': 1000,
'scrapy.middleware.ProcessSchedulerExceptionMiddleware': 1010,
'scrapy.middleware.ProcessSchedulerCloseMiddleware': 1020,
'scrapy.middleware.ProcessSchedulerStatsMiddleware': 1030,
'scrapy.middleware.ProcessSchedulerPipelineMiddleware': 1040,
'scrapy.middleware.ProcessSchedulerRequestMiddleware': 1050,
'scrapy.middleware.ProcessSchedulerResponseMiddleware': 1060,
'scrapy.middleware.ProcessSchedulerItemMiddleware': 1070,
'scrapy.middleware.ProcessSchedulerExitMiddleware': 1080,
'scrapy.middleware.ProcessSchedulerSignalMiddleware': 1090,
'scrapy.middleware.ProcessSchedulerExceptionMiddleware': 1100,
'scrapy.middleware.ProcessSchedulerCloseMiddleware': 1110,
'scrapy.middleware.ProcessSchedulerStatsMiddleware': 1120,
'scrapy.middleware.ProcessSchedulerPipelineMiddleware': 1130,
'scrapy.middleware.ProcessSchedulerRequestMiddleware': 1140,
'scrapy.middleware.ProcessSchedulerResponseMiddleware': 1150,
'scrapy.middleware.ProcessSchedulerItemMiddleware': 1160,
'scrapy.middleware.ProcessSchedulerExitMiddleware': 1170,
'scrapy.middleware.ProcessSchedulerSignalMiddleware': 1180,
'scrapy.middleware.ProcessSchedulerExceptionMiddleware': 1190,
'scrapy.middleware.ProcessSchedulerCloseMiddleware': 1200,
'scrapy.middleware.ProcessSchedulerStatsMiddleware': 1210,
'scrapy.middleware.ProcessSchedulerPipelineMiddleware': 1220,
'scrapy.middleware.ProcessSchedulerRequestMiddleware': 1230,
'scrapy.middleware.ProcessSchedulerResponseMiddleware': 1240,
'scrapy.middleware.ProcessSchedulerItemMiddleware': 1250,
'scrapy.middleware.ProcessSchedulerExitMiddleware': 1260,
'scrapy.middleware.ProcessSchedulerSignalMiddleware': 1270,
'scrapy.middleware.ProcessSchedulerExceptionMiddleware': 1280,
'scrapy.middleware.ProcessSchedulerCloseMiddleware': 1290,
'scrapy.middleware.ProcessSchedulerStatsMiddleware': 1300,
'scrapy.middleware.ProcessSchedulerPipelineMiddleware': 1310,
'scrapy.middleware.ProcessSchedulerRequestMiddleware': 1320,
'scrapy.middleware.ProcessSchedulerResponseMiddleware': 1330,
'scrapy.middleware.ProcessSchedulerItemMiddleware': 1340,
'scrapy.middleware.ProcessSchedulerExitMiddleware': 1350,
'scrapy.middleware.ProcessSchedulerSignalMiddleware': 1360,
'scrapy.middleware.ProcessSchedulerExceptionMiddleware': 1370,
'scrapy.middleware.ProcessSchedulerCloseMiddleware': 1380,
'scrapy.middleware.ProcessSchedulerStatsMiddleware': 1390,
'scrapy.middleware.ProcessSchedulerPipelineMiddleware': 1400,
'scrapy.middleware.ProcessSchedulerRequestMiddleware': 1410,
'scrapy.middleware.ProcessSchedulerResponseMiddleware': 1420,
'scrapy.middleware.ProcessSchedulerItemMiddleware': 1430,
'scrapy.middleware.ProcessSchedulerExitMiddleware': 1440,
'scrapy.middleware.ProcessSchedulerSignalMiddleware': 1450,
'scrapy.middleware.ProcessSchedulerExceptionMiddleware': 1460,
'scrapy.middleware.ProcessSchedulerCloseMiddleware': 1470,
'scrapy.middleware.ProcessSchedulerStatsMiddleware': 1480,
'scrapy.middleware.ProcessSchedulerPipelineMiddleware': 1490,
'scrapy.middleware.ProcessSchedulerRequestMiddleware': 1500,
'scrapy.middleware.ProcessSchedulerResponseMiddleware': 1510,
'scrapy.middleware.ProcessSchedulerItemMiddleware': 1520,
'scrapy.middleware.ProcessSchedulerExitMiddleware': 1530,
'scrapy.middleware.ProcessSchedulerSignalMiddleware': 1540,
'scrapy.middleware.ProcessSchedulerExceptionMiddleware': 1550,
'scrapy.middleware.ProcessSchedulerCloseMiddleware': 1560,
'scrapy.middleware.ProcessSchedulerStatsMiddleware': 1570,
'scrapy.middleware.ProcessSchedulerPipelineMiddleware': 1580,
'scrapy.middleware.ProcessSchedulerRequestMiddleware': 1590,
'scrapy.middleware.ProcessSchedulerResponseMiddleware': 1600,
'scrapy.middleware.ProcessSchedulerItemMiddleware': 1610,
'scrapy.middleware.ProcessSchedulerExitMiddleware': 1620,
'scrapy.middleware.ProcessSchedulerSignalMiddleware': 1630,
'scrapy.middleware.ProcessSchedulerExceptionMiddleware': 1640,
'scrapy.middleware.ProcessSchedulerCloseMiddleware': 1650,
'scrapy.middleware.ProcessSchedulerStatsMiddleware': 1660,
'scrapy.middleware.ProcessSchedulerPipelineMiddleware': 1670,
'scrapy.middleware.ProcessSchedulerRequestMiddleware': 1680,
'scrapy.middleware.ProcessSchedulerResponseMiddleware': 1690,
'scrapy.middleware.ProcessSchedulerItemMiddleware': 1700,
'scrapy.middleware.ProcessSchedulerExitMiddleware': 1710,
'scrapy.middleware.ProcessSchedulerSignalMiddleware': 1720,
'scrapy.middleware.ProcessSchedulerExceptionMiddleware': 1730,
'scrapy.middleware.ProcessSchedulerCloseMiddleware': 1740,
'scrapy.middleware.ProcessSchedulerStatsMiddleware': 1750,
'scrapy.middleware.ProcessSchedulerPipelineMiddleware': 1760,
'scrapy.middleware.ProcessSchedulerRequestMiddleware': 1770,
'scrapy.middleware.ProcessSchedulerResponseMiddleware': 1780,
'scrapy.middleware.ProcessSchedulerItemMiddleware': 1790,
'scrapy.middleware.ProcessSchedulerExitMiddleware': 1800,
'scrapy.middleware.ProcessSchedulerSignalMiddleware': 1810,
'scrapy.middleware.ProcessSchedulerExceptionMiddleware': 1820,
'scrapy.middleware.ProcessSchedulerCloseMiddleware': 1830,
'scrapy.middleware.ProcessSchedulerStatsMiddleware': 1840,
'scrapy.middleware.ProcessSchedulerPipelineMiddleware': 1850,
'scrapy.middleware.ProcessSchedulerRequestMiddleware': 1860,
'scrapy.middleware.ProcessSchedulerResponseMiddleware': 1870,
'scrapy.middleware.ProcessSchedulerItemMiddleware': 1880,
'scrapy.middleware.ProcessSchedulerExitMiddleware': 1890,
'scrapy.middleware.ProcessSchedulerSignalMiddleware': 1900,
'scrapy.middleware.ProcessSchedulerExceptionMiddleware': 1910,
'scrapy.middleware.ProcessSchedulerCloseMiddleware': 1920,
'scrapy.middleware.ProcessSchedulerStatsMiddleware': 1930,
'scrapy.middleware.ProcessSchedulerPipelineMiddleware': 1940,
'scrapy.middleware.ProcessSchedulerRequestMiddleware': 1950,
'scrapy.middleware.ProcessSchedulerResponseMiddleware': 1960,
'scrapy.middleware.ProcessSchedulerItemMiddleware': 1970,
'scrapy.middleware.ProcessSchedulerExitMiddleware': 1980,
'scrapy.middleware.ProcessSchedulerSignalMiddleware': 1990,
'scrapy.middleware.ProcessSchedulerExceptionMiddleware': 2000,
'scrapy.middleware.ProcessSchedulerCloseMiddleware': 2010,
'scrapy.middleware.ProcessSchedulerStatsMiddleware': 2020,
'scrapy.middleware.ProcessSchedulerPipelineMiddleware': 2030,
'scrapy.middleware.ProcessSchedulerRequestMiddleware': 2040,
'scrapy.middleware.ProcessSchedulerResponseMiddleware': 2050,
'scrapy.middleware.ProcessSchedulerItemMiddleware': 2060,
'scrapy.middleware.ProcessSchedulerExitMiddleware': 2070,
'scrapy.middleware.ProcessSchedulerSignalMiddleware': 2080,
'scrapy.middleware.ProcessSchedulerExceptionMiddleware': 2090,
'scrapy.middleware.ProcessSchedulerCloseMiddleware': 2100,
'scrapy.middleware.ProcessSchedulerStatsMiddleware': 2110,
'scrapy.middleware.ProcessSchedulerPipelineMiddleware': 2120,
'scrapy.middleware.ProcessSchedulerRequestMiddleware': 2130,
'scrapy.middleware.ProcessSchedulerResponseMiddleware': 2140,
'scrapy.middleware.ProcessSchedulerItemMiddleware': 2150,
'scrapy.middleware.ProcessSchedulerExitMiddleware': 2160,
'scrapy.middleware.ProcessSchedulerSignalMiddleware': 2170,
'scrapy.middleware.ProcessSchedulerExceptionMiddleware': 2180,
'scrapy.middleware.ProcessSchedulerCloseMiddleware': 2190,
'scrapy.middleware.ProcessSchedulerStatsMiddleware': 2200,
'scrapy.middleware.ProcessSchedulerPipelineMiddleware': 2210,
'scrapy.middleware.ProcessSchedulerRequestMiddleware': 2220,
'scrapy.middleware.ProcessSchedulerResponseMiddleware': 2230,
'scrapy.middleware.ProcessSchedulerItemMiddleware': 2240,
'scrapy.middleware.ProcessSchedulerExitMiddleware': 2250,
'scrapy.middleware.ProcessSchedulerSignalMiddleware': 2260,
'scrapy.middleware.ProcessSchedulerExceptionMiddleware': 2270,
'scrapy.middleware.ProcessSchedulerCloseMiddleware': 2280,
'scrapy.middleware.ProcessSchedulerStatsMiddleware': 2290,
'scrapy.middleware.ProcessSchedulerPipelineMiddleware': 2300,
'scrapy.middleware.ProcessSchedulerRequestMiddleware': 2310,
'scrapy.middleware.ProcessSchedulerResponseMiddleware': 2320,
'scrapy.middleware.ProcessSchedulerItemMiddleware': 2330,
'scrapy.middleware.ProcessSchedulerExitMiddleware': 2340,
'scrapy.middleware.ProcessSchedulerSignalMiddleware': 2350,
'scrapy.middleware.ProcessSchedulerExceptionMiddleware': 2360,
'scrapy.middleware.ProcessSchedulerCloseMiddleware': 2370,
'scrapy.middleware.ProcessSchedulerStatsMiddleware': 2380,
'scrapy.middleware.ProcessSchedulerPipelineMiddleware': 2390,
'scrapy.middleware.ProcessSchedulerRequestMiddleware': 2400,
'scrapy.middleware.ProcessSchedulerResponseMiddleware': 2410,
'scrapy.middleware.ProcessSchedulerItemMiddleware': 2420,
'scrapy.middleware.ProcessSchedulerExitMiddleware': 2430,
'scrapy.middleware.ProcessSchedulerSignalMiddleware': 2440,
'scrapy.middleware.ProcessSchedulerExceptionMiddleware': 2450,
'scrapy.middleware.ProcessSchedulerCloseMiddleware': 2460,
'scrapy.middleware.ProcessSchedulerStatsMiddleware': 2470,
'scrapy.middleware.ProcessSchedulerPipelineMiddleware': 2480,
'scrapy.middleware.ProcessSchedulerRequestMiddleware': 2490,
'scrapy.middleware.ProcessSchedulerResponseMiddleware': 2500,
'scrapy.middleware.ProcessSchedulerItemMiddleware': 2510,
'scrapy.middleware.ProcessSchedulerExitMiddleware': 2520,
'scrapy.middleware.ProcessSchedulerSignalMiddleware': 2530,
'scrapy.middleware.ProcessSchedulerExceptionMiddleware': 2540,
'scrapy.middleware.ProcessSchedulerCloseMiddleware': 2550,
'scrapy.middleware.ProcessSchedulerStatsMiddleware': 2560,
'scrapy.middleware.ProcessSchedulerPipelineMiddleware': 2570,
'scrapy.middleware.ProcessSchedulerRequestMiddleware': 2580,
'scrapy.middleware.ProcessSchedulerResponseMiddleware': 2590,
'scrapy.middleware.ProcessSchedulerItemMiddleware': 2600,
'scrapy.middleware.ProcessSchedulerExitMiddleware': 2610,
'scrapy.middleware.ProcessSchedulerSignalMiddleware': 2620,
'scrapy.middleware.ProcessSchedulerExceptionMiddleware': 2630,
'scrapy.middleware.ProcessSchedulerCloseMiddleware': 2640,
'scrapy.middleware.ProcessSchedulerStatsMiddleware': 2650,
'scrapy.middleware.ProcessSchedulerPipelineMiddleware': 2660,
'scrapy.middleware.ProcessSchedulerRequestMiddleware': 2670,
'scrapy.middleware.ProcessSchedulerResponseMiddleware': 2680,
'scrapy.middleware.ProcessSchedulerItemMiddleware': 2690,
'scrapy.middleware.ProcessSchedulerExitMiddleware': 2700,
'scrapy.middleware.ProcessSchedulerSignalMiddleware': 2710,
'scrapy.middleware.ProcessSchedulerExceptionMiddleware': 2720,
'scrapy.middleware.ProcessSchedulerCloseMiddleware': 2730,
'scrapy.middleware.ProcessSchedulerStatsMiddleware': 2740,
'scrapy.middleware.ProcessSchedulerPipelineMiddleware': 2750,
'scrapy.middleware.ProcessSchedulerRequestMiddleware': 2760,
'scrapy.middleware.ProcessSchedulerResponseMiddleware': 2770,
'scrapy.middleware.ProcessSchedulerItemMiddleware': 2780,
'scrapy.middleware.ProcessSchedulerExitMiddleware': 2790,
'scrapy.middleware.ProcessSchedulerSignalMiddleware': 2800,
'scrapy.middleware.ProcessSchedulerExceptionMiddleware': 2810,
'scrapy.middleware.ProcessSchedulerCloseMiddleware': 2820,
'scrapy.middleware.ProcessSchedulerStatsMiddleware': 2830,
'scrapy.middleware.ProcessSchedulerPipelineMiddleware': 2840,
'scrapy.middleware.ProcessSchedulerRequestMiddleware': 2850,
'scrapy.middleware.ProcessSchedulerResponseMiddleware': 2860,
'scrapy.middleware.ProcessSchedulerItemMiddleware': 2870,
'scrapy.middleware.ProcessSchedulerExitMiddleware': 2880,
'scrapy.middleware.ProcessSchedulerSignalMiddleware': 2890,
'scrapy.middleware.ProcessSchedulerExceptionMiddleware': 2900,
'scrapy.middleware.ProcessSchedulerCloseMiddleware': 2910,
'scrapy.middleware.ProcessSchedulerStatsMiddleware': 2920,
'scrapy.middleware.ProcessSchedulerPipelineMiddleware': 2930,
'scrapy.middleware.ProcessSchedulerRequestMiddleware': 2940,
'scrapy.middleware.ProcessSchedulerResponseMiddleware': 2950,
'scrapy.middleware.ProcessSchedulerItemMiddleware': 2960,
'scrapy.middleware.ProcessSchedulerExitMiddleware': 2970,
'scrapy.middleware.ProcessSchedulerSignalMiddleware': 2980,
'scrapy.middleware.ProcessSchedulerExceptionMiddleware': 2990,
'scrapy.middleware.ProcessSchedulerCloseMiddleware': 3000,
'scrapy.middleware.ProcessSchedulerStatsMiddleware': 3010,
'scrapy.middleware.ProcessSchedulerPipelineMiddleware': 3020,
'scrapy.middleware.ProcessSchedulerRequestMiddleware': 3030,
'scrapy.middleware.ProcessSchedulerResponseMiddleware': 3040,
'scrapy.middleware.ProcessSchedulerItemMiddleware': 3050,
'scrapy.middleware.ProcessSchedulerExitMiddleware': 3060,
'scrapy.middleware.ProcessSchedulerSignalMiddleware': 3070,
'scrapy.middleware.ProcessSchedulerExceptionMiddleware': 3080,
'scrapy.middleware.ProcessSchedulerCloseMiddleware': 3090,
'scrapy.middleware.ProcessSchedulerStatsMiddleware': 3100,
'scrapy.middleware.ProcessSchedulerPipelineMiddleware': 3110,
'scrapy.middleware.ProcessSchedulerRequestMiddleware': 3120,
'scrapy.middleware.ProcessSchedulerResponseMiddleware': 3130,
'scrapy.middleware.ProcessSchedulerItemMiddleware': 3140,
'scrapy.middleware.ProcessSchedulerExitMiddleware': 3150,
'scrapy.middleware.ProcessSchedulerSignalMiddleware': 3160,
'scrapy.middleware.ProcessSchedulerExceptionMiddleware': 3170,
'scrapy.middleware.ProcessSchedulerCloseMiddleware': 3180,
'scrapy.middleware.ProcessSchedulerStatsMiddleware': 3190,
'scrapy.middleware.ProcessSchedulerPipelineMiddleware': 3200,
'scrapy.middleware.ProcessSchedulerRequestMiddleware': 3210,
'scrapy.middleware.ProcessSchedulerResponseMiddleware': 3220,
'scrapy.middleware.ProcessSchedulerItemMiddleware': 3230,
'scrapy.middleware.ProcessSchedulerExitMiddleware': 3240,
'scrapy.middleware.ProcessSchedulerSignalMiddleware': 3250,
'scrapy.middleware.ProcessSchedulerExceptionMiddleware': 3260,
'scrapy.middleware.ProcessSchedulerCloseMiddleware': 3270,
'scrapy.middleware.ProcessSchedulerStatsMiddleware': 3280,
'scrapy.middleware.ProcessSchedulerPipelineMiddleware': 3290,
'scrapy.middleware.ProcessSchedulerRequestMiddleware': 3300,
'scrapy.middleware.ProcessSchedulerResponseMiddleware': 3310,
'scrapy.middleware.ProcessSchedulerItemMiddleware': 3320,
'scrapy.middleware.ProcessSchedulerExitMiddleware': 3330,
'scrapy.middleware.ProcessSchedulerSignalMiddleware': 3340,
'scrapy.middleware.ProcessSchedulerExceptionMiddleware': 3350,
'scrapy.middleware.ProcessSchedulerCloseMiddleware': 3360,
'scrapy.middleware.ProcessSchedulerStatsMiddleware': 3370,
'scrapy.middleware.ProcessSchedulerPipelineMiddleware': 3380,
'scrapy.middleware.ProcessSchedulerRequestMiddleware': 3390,
'scrapy.middleware.ProcessSchedulerResponseMiddleware': 3400,
'scrapy.middleware.ProcessSchedulerItemMiddleware': 3410,
'scrapy.middleware.ProcessSchedulerExitMiddleware': 3420,
'scrapy.middleware.ProcessSchedulerSignalMiddleware': 3430,
'scrapy.middleware.ProcessSchedulerExceptionMiddleware': 3440,
'scrapy.middleware.ProcessSchedulerCloseMiddleware': 3450,
'scrapy.middleware.ProcessSchedulerStatsMiddleware': 3460,
'scrapy.middleware.ProcessSchedulerPipelineMiddleware': 3470,
'sc
