scrapy 中间件 middlewares.py

本文深入探讨了Scrapy框架中的中间件机制,包括Spider中间件和下载中间件的工作原理及核心方法。详细解释了如何使用CookiesMiddleware管理和更新cookie,以及如何创建随机代理中间件以提高爬虫的稳定性和效率。

目录

 

def process_spider_input(self, response, spider):

def process_spider_output(self, response, result, spider):

def process_spider_exception(self, response, exception, spider):

def process_start_requests(self, start_requests, spider):


def spider_opened():

程序运行记录,参数 spider 代表项目 spider 文件夹的 spider 程序

 

 

def from_crawler(cls, crawler):

访问 setting 和 signals 的入口函数,重写这个方法需要返回实例对象如果返回对象里带有参数,可在 __inti__ 你使用

# 重写__init__
# 参数 MySetting 来自 from_crawler 的返回参数
def __init__(self,MySetting=None)
    pass
# 重写 from_crawler
@classmethod
def from_crawler(cls,crawler):
    # 从配置文件读取 MySetting 内容
    MySetting = crawler.settings.get('MySetting')
    # 返回实例对象,并设置参数 MySetting
    return cls(MySetting)

 

 

 

def process_spider_input(self, response, spider):

当 response 通过 spider 中间件时,该方法被调用,处理该 response,它应该返回 None 或者抛出一个异常

  • 如果返回 None,则 scrapy 会继续处理该 response,调用所有其他中间件直到 spider 处理该 response
  • 如果抛出一个异常,则 scrapy 不会调用任何其他中间件的 process_spider_input() 方法,并调用 request 的 errback,

的输出会以另一个方向被重新输入中间件链中,使用 process_spider_output() 方法来处理,当其抛出异常时则调用                         process_spider_exception()

 

 

def process_spider_output(self, response, result, spider):

当 scrapy 处理 response 返回 result 时,该方法被调用,它必须返回包含 request 或 Item 对象的可迭代对象

  • result 参数:包含 request 或 Item 对象的可迭代对象,spider 返回的 result

 

 

def process_spider_exception(self, response, exception, spider):

当 spider 或 其他 spider 的中间件 的 process_spider_input() 抛出异常时,被调用,它要么返回 None,要么返回一个包含                 response 或 Item 对象的可迭代对象

  • 如果返回 None,则 scrapy 继续处理该异常,调用中间键链中的其它中间键的 process_spider_exception() 方法,直到所有中间间都被调用,该异常到达引擎(异常将被记录并忽略)
  • 如果返回一个可迭代对象,则中间件链的 process_spider_output() 方法将被调用。其它的 process_spider_exception() 不会被调用
  • exception 参数:被抛出的异常

 

 

def process_start_requests(self, start_requests, spider):

以 spider 启动的 request 为参数被调用,执行的过程类似于 process_spider_output(),只不过没有关联的 response,并且必须返回的 request(不是Item)

其接受一个可迭代对象,返回另一个包含 request 对象的可迭代对象

 

 

内置下载中间件 CookiesMiddleware

几个核心方法

from_crawler 

从配置文件中读取 COOKIES_ENABLED,决定是否启用该中间件,如果启用,调用构造器创建对象,否则抛出 NotConfigured 异常,scrapy 件忽略该中间件

__init__

为避免爬虫想同时登陆 cookie 冲突,会让每一个账号发送的 http 请求使用不同的 cookiejar如:

Request(url1,meta={'cookiejar':'account1'})

Request(url2,meta={'cookiejar':'account2'})

proceess_request

处理每一个待发送的 Request 对象,尝试从 request.meta['cookiejar'] 获取用户指定使用的 cookiejar,如果用户未指定,使用默认的 cookiejar(self.jars[None])。调用 self._get_request_cookies 方法发送请求 request 应携带的 cookie 信息,填写到 http 请求头部

process_reponse

处理每一个 Resonse 对象,依然通过 request.meta['cookiejar'] 获取 cookiejar 对象,调用 extract_cookies 方法将http 响应头部中的 cookiejar 信息保存到 cookiejar 对象中

 

使用浏览器 cookie 的中间件

from scrapy.downloadermiddlewares.cookies import CookiesMiddleware
import browsercookie


class BrowserCookiesMiddleware(CookiesMiddleware):
    """
    使用浏览器中的 cookie
    """
    def __init__(self,debug=False):
        super().__init__(debug)
        self.load_browser_cookies()
        
    def load_browser_cookies(self):
        #加载 Chrome 浏览器中的 cookie
        jar = self.jars['chrome']
        chrome_cookiejar = browsercookie.chrome()
        for cookie in chrome_cookiejar:
            jar.set_cookie(cookie)
  • 继承 cookiesmiddleware 并实现构造器方法,在构造器方法中先调用基类的构造器方法,然后调用 self.load_browser_cookies 方法加载浏览器 cookie
  • 在 load_browser_cookies 方法中,使用 self.jars['chrome'] 和 self.jars['firefox'] 从默认字典中获得两个 cookiejar 对象,然后调用 browsercookie 的 chrome 和 firefox 方法,分别获取两个浏览器中的 cookie,将他们填入各自的 cookiejar 对象中

 

 

从 json 文件中获取随机代理中间件

from scrapy.downloadermiddlewares.httpproxy import HttpProxyMiddleware
from collections import defaultdict
import json
import  random


class RandomHttpProxyMiddleware(HttpProxyMiddleware):
    """
    随机代理中间件
    """
    def __init__(self,auth_encoding='latin-1',proxy_list_file=None):
        if not proxy_list_file:
            raise NotConfigured

        self.auth_encoding = auth_encoding
        # 分别用两个列表维护 HTTP 和 HTTPS 的代理,
        self.proxies = defaultdict(list)

        # 从 json 文件中读取代理服务器信息,填入 self.proxies
        with open(proxy_list_file) as f:
            proxy_list = json.load(f)
            for proxy in proxy_list:
                scheme = proxy['proxy_scheme']
                url = proxy['proxy']
                self.proxies[scheme].append(self._get_proxy(url,scheme))

    @classmethod
    def from_crawler(cls, crawler):
        # 从配置文件中读取用户验证信息的编码
        auth_encoding = crawler.settings.get('HTTPPROXY_AUTH_ENCODING','latain-1')

        # 从配置文件中读取代理服务器列表文件(json)的路径
        proxy_list_file = crawler.settings.get('HTTPPROXY_PROXY_LIST_FILE')

        return cls(auth_encoding,proxy_list_file)

    def _set_proxy(self, request, scheme):
        # 随机选取一个代理
        creds,proxy = random.choice(self.proxies[scheme])
        request.meta['proxy'] = proxy
        if creds:
            request.headers['Proxy-Authorization'] = b'Basic' + creds

 

2025-07-08 15:43:37 [scrapy.utils.log] INFO: Scrapy 2.13.3 started (bot: scrapybot) 2025-07-08 15:43:37 [scrapy.utils.log] INFO: Versions: {'lxml': '6.0.0', 'libxml2': '2.11.9', 'cssselect': '1.3.0', 'parsel': '1.10.0', 'w3lib': '2.3.1', 'Twisted': '25.5.0', 'Python': '3.11.5 (tags/v3.11.5:cce6ba9, Aug 24 2023, 14:38:34) [MSC v.1936 ' '64 bit (AMD64)]', 'pyOpenSSL': '25.1.0 (OpenSSL 3.5.1 1 Jul 2025)', 'cryptography': '45.0.5', 'Platform': 'Windows-10-10.0.22631-SP0'} 2025-07-08 15:43:37 [scrapy.addons] INFO: Enabled addons: [] 2025-07-08 15:43:37 [asyncio] DEBUG: Using selector: SelectSelector 2025-07-08 15:43:37 [scrapy.utils.log] DEBUG: Using reactor: twisted.internet.asyncioreactor.AsyncioSelectorReactor 2025-07-08 15:43:37 [scrapy.utils.log] DEBUG: Using asyncio event loop: asyncio.windows_events._WindowsSelectorEventLoop 2025-07-08 15:43:37 [scrapy.extensions.telnet] INFO: Telnet Password: 8a6ca1391bfb9949 2025-07-08 15:43:37 [scrapy.middleware] INFO: Enabled extensions: ['scrapy.extensions.corestats.CoreStats', 'scrapy.extensions.telnet.TelnetConsole', 'scrapy.extensions.logstats.LogStats'] 2025-07-08 15:43:37 [scrapy.crawler] INFO: Overridden settings: {'DOWNLOAD_DELAY': 1, 'NEWSPIDER_MODULE': 'nepu_spider.spiders', 'SPIDER_MODULES': ['nepu_spider.spiders'], 'USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' '(KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'} 2025-07-08 15:43:37 [scrapy.middleware] INFO: Enabled downloader middlewares: ['scrapy.downloadermiddlewares.offsite.OffsiteMiddleware', 'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware', 'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware', 'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware', 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware', 'scrapy.downloadermiddlewares.retry.RetryMiddleware', 'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware', 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware', 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware', 'scrapy.downloadermiddlewares.cookies.CookiesMiddleware', 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware', 'scrapy.downloadermiddlewares.stats.DownloaderStats'] 2025-07-08 15:43:37 [scrapy.middleware] INFO: Enabled spider middlewares: ['scrapy.spidermiddlewares.start.StartSpiderMiddleware', 'scrapy.spidermiddlewares.httperror.HttpErrorMiddleware', 'scrapy.spidermiddlewares.referer.RefererMiddleware', 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware', 'scrapy.spidermiddlewares.depth.DepthMiddleware'] 2025-07-08 15:43:37 [scrapy.middleware] INFO: Enabled item pipelines: ['nepu_spider.pipelines.MultiJsonPipeline'] 2025-07-08 15:43:37 [scrapy.addons] INFO: Enabled addons: [] 2025-07-08 15:43:37 [scrapy.utils.log] DEBUG: Using reactor: twisted.internet.asyncioreactor.AsyncioSelectorReactor 2025-07-08 15:43:37 [scrapy.utils.log] DEBUG: Using asyncio event loop: asyncio.windows_events._WindowsSelectorEventLoop 2025-07-08 15:43:37 [scrapy.extensions.telnet] INFO: Telnet Password: 671a36aa7bc330e0 2025-07-08 15:43:37 [scrapy.middleware] INFO: Enabled extensions: ['scrapy.extensions.corestats.CoreStats', 'scrapy.extensions.telnet.TelnetConsole', 'scrapy.extensions.logstats.LogStats'] 2025-07-08 15:43:37 [scrapy.crawler] INFO: Overridden settings: {'DOWNLOAD_DELAY': 1, 'NEWSPIDER_MODULE': 'nepu_spider.spiders', 'SPIDER_MODULES': ['nepu_spider.spiders'], 'USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' '(KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'} 2025-07-08 15:43:37 [scrapy.middleware] INFO: Enabled downloader middlewares: ['scrapy.downloadermiddlewares.offsite.OffsiteMiddleware', 'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware', 'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware', 'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware', 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware', 'scrapy.downloadermiddlewares.retry.RetryMiddleware', 'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware', 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware', 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware', 'scrapy.downloadermiddlewares.cookies.CookiesMiddleware', 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware', 'scrapy.downloadermiddlewares.stats.DownloaderStats'] 2025-07-08 15:43:37 [scrapy.middleware] INFO: Enabled spider middlewares: ['scrapy.spidermiddlewares.start.StartSpiderMiddleware', 'scrapy.spidermiddlewares.httperror.HttpErrorMiddleware', 'scrapy.spidermiddlewares.referer.RefererMiddleware', 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware', 'scrapy.spidermiddlewares.depth.DepthMiddleware'] 2025-07-08 15:43:37 [scrapy.middleware] INFO: Enabled item pipelines: ['nepu_spider.pipelines.MultiJsonPipeline'] 2025-07-08 15:43:37 [scrapy.addons] INFO: Enabled addons: [] 2025-07-08 15:43:37 [scrapy.utils.log] DEBUG: Using reactor: twisted.internet.asyncioreactor.AsyncioSelectorReactor 2025-07-08 15:43:37 [scrapy.utils.log] DEBUG: Using asyncio event loop: asyncio.windows_events._WindowsSelectorEventLoop 2025-07-08 15:43:37 [scrapy.extensions.telnet] INFO: Telnet Password: 76f044bac415a70c 2025-07-08 15:43:37 [scrapy.middleware] INFO: Enabled extensions: ['scrapy.extensions.corestats.CoreStats', 'scrapy.extensions.telnet.TelnetConsole', 'scrapy.extensions.logstats.LogStats'] 2025-07-08 15:43:37 [scrapy.crawler] INFO: Overridden settings: {'DOWNLOAD_DELAY': 1, 'NEWSPIDER_MODULE': 'nepu_spider.spiders', 'SPIDER_MODULES': ['nepu_spider.spiders'], 'USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' '(KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'} 2025-07-08 15:43:37 [scrapy.middleware] INFO: Enabled downloader middlewares: ['scrapy.downloadermiddlewares.offsite.OffsiteMiddleware', 'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware', 'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware', 'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware', 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware', 'scrapy.downloadermiddlewares.retry.RetryMiddleware', 'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware', 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware', 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware', 'scrapy.downloadermiddlewares.cookies.CookiesMiddleware', 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware', 'scrapy.downloadermiddlewares.stats.DownloaderStats'] 2025-07-08 15:43:37 [scrapy.middleware] INFO: Enabled spider middlewares: ['scrapy.spidermiddlewares.start.StartSpiderMiddleware', 'scrapy.spidermiddlewares.httperror.HttpErrorMiddleware', 'scrapy.spidermiddlewares.referer.RefererMiddleware', 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware', 'scrapy.spidermiddlewares.depth.DepthMiddleware'] 2025-07-08 15:43:37 [scrapy.middleware] INFO: Enabled item pipelines: ['nepu_spider.pipelines.MultiJsonPipeline'] 2025-07-08 15:43:37 [scrapy.addons] INFO: Enabled addons: [] 2025-07-08 15:43:37 [scrapy.utils.log] DEBUG: Using reactor: twisted.internet.asyncioreactor.AsyncioSelectorReactor 2025-07-08 15:43:37 [scrapy.utils.log] DEBUG: Using asyncio event loop: asyncio.windows_events._WindowsSelectorEventLoop 2025-07-08 15:43:37 [scrapy.extensions.telnet] INFO: Telnet Password: fc500ad4454da624 2025-07-08 15:43:37 [scrapy.middleware] INFO: Enabled extensions: ['scrapy.extensions.corestats.CoreStats', 'scrapy.extensions.telnet.TelnetConsole', 'scrapy.extensions.logstats.LogStats'] 2025-07-08 15:43:37 [scrapy.crawler] INFO: Overridden settings: {'DOWNLOAD_DELAY': 1, 'NEWSPIDER_MODULE': 'nepu_spider.spiders', 'SPIDER_MODULES': ['nepu_spider.spiders'], 'USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' '(KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'} 2025-07-08 15:43:37 [scrapy.middleware] INFO: Enabled downloader middlewares: ['scrapy.downloadermiddlewares.offsite.OffsiteMiddleware', 'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware', 'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware', 'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware', 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware', 'scrapy.downloadermiddlewares.retry.RetryMiddleware', 'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware', 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware', 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware', 'scrapy.downloadermiddlewares.cookies.CookiesMiddleware', 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware', 'scrapy.downloadermiddlewares.stats.DownloaderStats'] 2025-07-08 15:43:37 [scrapy.middleware] INFO: Enabled spider middlewares: ['scrapy.spidermiddlewares.start.StartSpiderMiddleware', 'scrapy.spidermiddlewares.httperror.HttpErrorMiddleware', 'scrapy.spidermiddlewares.referer.RefererMiddleware', 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware', 'scrapy.spidermiddlewares.depth.DepthMiddleware'] 2025-07-08 15:43:37 [scrapy.middleware] INFO: Enabled item pipelines: ['nepu_spider.pipelines.MultiJsonPipeline'] 2025-07-08 15:43:37 [scrapy.core.engine] INFO: Spider opened 2025-07-08 15:43:37 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 2025-07-08 15:43:37 [scrapy.core.engine] INFO: Spider opened 2025-07-08 15:43:37 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 2025-07-08 15:43:37 [scrapy.core.engine] INFO: Spider opened 2025-07-08 15:43:37 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 2025-07-08 15:43:37 [scrapy.core.engine] INFO: Spider opened 2025-07-08 15:43:37 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 2025-07-08 15:43:37 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6023 2025-07-08 15:43:37 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6024 2025-07-08 15:43:37 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6025 2025-07-08 15:43:37 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6026 2025-07-08 15:43:37 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://xxgk.nepu.edu.cn/xxgklm/xxgk.htm> (referer: None) 2025-07-08 15:43:37 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.nepu.edu.cn/jgsz/jxdw.htm> (referer: None) 2025-07-08 15:43:37 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://zsxxw.nepu.edu.cn/> (referer: None) 2025-07-08 15:43:37 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.nepu.edu.cn/xxgk/xxjj.htm> (referer: None) 2025-07-08 15:43:38 [scrapy.core.engine] INFO: Closing spider (finished) 2025-07-08 15:43:38 [scrapy.statscollectors] INFO: Dumping Scrapy stats: {'downloader/request_bytes': 314, 'downloader/request_count': 1, 'downloader/request_method_count/GET': 1, 'downloader/response_bytes': 4815, 'downloader/response_count': 1, 'downloader/response_status_count/200': 1, 'elapsed_time_seconds': 0.265455, 'finish_reason': 'finished', 'finish_time': datetime.datetime(2025, 7, 8, 7, 43, 38, 4643, tzinfo=datetime.timezone.utc), 'httpcompression/response_bytes': 18235, 'httpcompression/response_count': 1, 'items_per_minute': None, 'log_count/DEBUG': 8, 'log_count/INFO': 26, 'response_received_count': 1, 'responses_per_minute': None, 'scheduler/dequeued': 1, 'scheduler/dequeued/memory': 1, 'scheduler/enqueued': 1, 'scheduler/enqueued/memory': 1, 'start_time': datetime.datetime(2025, 7, 8, 7, 43, 37, 739188, tzinfo=datetime.timezone.utc)} 2025-07-08 15:43:38 [scrapy.core.engine] INFO: Spider closed (finished) 2025-07-08 15:43:38 [scrapy.core.engine] INFO: Closing spider (finished) 2025-07-08 15:43:38 [scrapy.statscollectors] INFO: Dumping Scrapy stats: {'downloader/request_bytes': 311, 'downloader/request_count': 1, 'downloader/request_method_count/GET': 1, 'downloader/response_bytes': 5880, 'downloader/response_count': 1, 'downloader/response_status_count/200': 1, 'elapsed_time_seconds': 0.282532, 'finish_reason': 'finished', 'finish_time': datetime.datetime(2025, 7, 8, 7, 43, 38, 21720, tzinfo=datetime.timezone.utc), 'httpcompression/response_bytes': 18387, 'httpcompression/response_count': 1, 'items_per_minute': None, 'log_count/DEBUG': 6, 'log_count/INFO': 22, 'response_received_count': 1, 'responses_per_minute': None, 'scheduler/dequeued': 1, 'scheduler/dequeued/memory': 1, 'scheduler/enqueued': 1, 'scheduler/enqueued/memory': 1, 'start_time': datetime.datetime(2025, 7, 8, 7, 43, 37, 739188, tzinfo=datetime.timezone.utc)} 2025-07-08 15:43:38 [scrapy.core.engine] INFO: Spider closed (finished) 2025-07-08 15:43:38 [scrapy.core.engine] INFO: Closing spider (finished) 2025-07-08 15:43:38 [scrapy.statscollectors] INFO: Dumping Scrapy stats: {'downloader/request_bytes': 300, 'downloader/request_count': 1, 'downloader/request_method_count/GET': 1, 'downloader/response_bytes': 9026, 'downloader/response_count': 1, 'downloader/response_status_count/200': 1, 'elapsed_time_seconds': 0.284539, 'finish_reason': 'finished', 'finish_time': datetime.datetime(2025, 7, 8, 7, 43, 38, 22730, tzinfo=datetime.timezone.utc), 'httpcompression/response_bytes': 32943, 'httpcompression/response_count': 1, 'items_per_minute': None, 'log_count/DEBUG': 10, 'log_count/INFO': 39, 'response_received_count': 1, 'responses_per_minute': None, 'scheduler/dequeued': 1, 'scheduler/dequeued/memory': 1, 'scheduler/enqueued': 1, 'scheduler/enqueued/memory': 1, 'start_time': datetime.datetime(2025, 7, 8, 7, 43, 37, 738191, tzinfo=datetime.timezone.utc)} 2025-07-08 15:43:38 [scrapy.core.engine] INFO: Spider closed (finished) 2025-07-08 15:43:38 [scrapy.core.engine] INFO: Closing spider (finished) 2025-07-08 15:43:38 [scrapy.statscollectors] INFO: Dumping Scrapy stats: {'downloader/request_bytes': 311, 'downloader/request_count': 1, 'downloader/request_method_count/GET': 1, 'downloader/response_bytes': 9736, 'downloader/response_count': 1, 'downloader/response_status_count/200': 1, 'elapsed_time_seconds': 0.285536, 'finish_reason': 'finished', 'finish_time': datetime.datetime(2025, 7, 8, 7, 43, 38, 22730, tzinfo=datetime.timezone.utc), 'httpcompression/response_bytes': 25723, 'httpcompression/response_count': 1, 'items_per_minute': None, 'log_count/DEBUG': 13, 'log_count/INFO': 49, 'response_received_count': 1, 'responses_per_minute': None, 'scheduler/dequeued': 1, 'scheduler/dequeued/memory': 1, 'scheduler/enqueued': 1, 'scheduler/enqueued/memory': 1, 'start_time': datetime.datetime(2025, 7, 8, 7, 43, 37, 737194, tzinfo=datetime.timezone.utc)} 2025-07-08 15:43:38 [scrapy.core.engine] INFO: Spider closed (finished)
最新发布
07-09
PS D:\test\autohome> scrapy crawl car_spider 2025-06-06 15:52:53 [scrapy.utils.log] INFO: Scrapy 2.13.0 started (bot: autohome) 2025-06-06 15:52:53 [scrapy.utils.log] INFO: Versions: {'lxml': '5.4.0', 'libxml2': '2.11.9', 'cssselect': '1.3.0', 'parsel': '1.10.0', 'w3lib': '2.3.1', 'Twisted': '24.11.0', 'Python': '3.9.12 (tags/v3.9.12:b28265d, Mar 23 2022, 23:52:46) [MSC v.1929 ' '64 bit (AMD64)]', 'pyOpenSSL': '25.1.0 (OpenSSL 3.5.0 8 Apr 2025)', 'cryptography': '45.0.3', 'Platform': 'Windows-10-10.0.26100-SP0'} 2025-06-06 15:52:53 [scrapy.addons] INFO: Enabled addons: [] 2025-06-06 15:52:53 [asyncio] DEBUG: Using selector: SelectSelector 2025-06-06 15:52:53 [scrapy.utils.log] DEBUG: Using reactor: twisted.internet.asyncioreactor.AsyncioSelectorReactor 2025-06-06 15:52:53 [scrapy.utils.log] DEBUG: Using asyncio event loop: asyncio.windows_events._WindowsSelectorEventLoop 2025-06-06 15:52:53 [scrapy.extensions.telnet] INFO: Telnet Password: 81e14a917b757f8e 2025-06-06 15:52:53 [scrapy.middleware] INFO: Enabled extensions: ['scrapy.extensions.corestats.CoreStats', 'scrapy.extensions.telnet.TelnetConsole', 'scrapy.extensions.feedexport.FeedExporter', 'scrapy.extensions.logstats.LogStats'] 2025-06-06 15:52:53 [scrapy.crawler] INFO: Overridden settings: {'BOT_NAME': 'autohome', 'DOWNLOAD_DELAY': 0.5, 'FEED_EXPORT_ENCODING': 'utf-8', 'NEWSPIDER_MODULE': 'autohome.spiders', 'SPIDER_MODULES': ['autohome.spiders'], 'USER_AGENT': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' '(KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36'} 2025-06-06 15:52:53 [scrapy.middleware] INFO: Enabled downloader middlewares: ['scrapy.downloadermiddlewares.offsite.OffsiteMiddleware', 'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware', 'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware', 'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware', 'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware', 'scrapy.downloadermiddlewares.retry.RetryMiddleware', 'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware', 'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware', 'scrapy.downloadermiddlewares.redirect.RedirectMiddleware', 'scrapy.downloadermiddlewares.cookies.CookiesMiddleware', 'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware', 'scrapy.downloadermiddlewares.stats.DownloaderStats'] 2025-06-06 15:52:53 [scrapy.middleware] INFO: Enabled spider middlewares: ['scrapy.spidermiddlewares.start.StartSpiderMiddleware', 'scrapy.spidermiddlewares.httperror.HttpErrorMiddleware', 'scrapy.spidermiddlewares.referer.RefererMiddleware', 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware', 'scrapy.spidermiddlewares.depth.DepthMiddleware'] 2025-06-06 15:52:53 [scrapy.middleware] INFO: Enabled item pipelines: ['scrapy.pipelines.images.ImagesPipeline'] 2025-06-06 15:52:53 [scrapy.core.engine] INFO: Spider opened 2025-06-06 15:52:53 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min) 2025-06-06 15:52:53 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6023 2025-06-06 15:52:54 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (302) to <GET https://car.autohome.com.cn/price/series-3179-0-3-0-0-0-0-1.html> from <GET https://car.autohome.com.cn/price/series-3179.html> 2025-06-06 15:52:55 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://car.autohome.com.cn/price/series-3179-0-3-0-0-0-0-1.html> (referer: None) 2025-06-06 15:52:55 [scrapy.downloadermiddlewares.offsite] DEBUG: Filtered offsite request to 'car.autohome.com.cn': <GET https://car.autohome.com.cn/price/series-3179.html> 2025-06-06 15:52:55 [scrapy.core.engine] INFO: Closing spider (finished) 2025-06-06 15:52:55 [scrapy.extensions.feedexport] INFO: Stored csv feed (0 items) in: cars.csv 2025-06-06 15:52:55 [scrapy.statscollectors] INFO: Dumping Scrapy stats: {'downloader/request_bytes': 658, 'downloader/request_count': 2, 'downloader/request_method_count/GET': 2, 'downloader/response_bytes': 56623, 'downloader/response_count': 2, 'downloader/response_status_count/200': 1, 'downloader/response_status_count/302': 1, 'elapsed_time_seconds': 1.399357, 'feedexport/success_count/FileFeedStorage': 1, 'finish_reason': 'finished', 'finish_time': datetime.datetime(2025, 6, 6, 7, 52, 55, 233288, tzinfo=datetime.timezone.utc), 'httpcompression/response_bytes': 301944, 'httpcompression/response_count': 1, 'items_per_minute': 0.0, 'log_count/DEBUG': 6, 'log_count/INFO': 11, 'offsite/domains': 1, 'offsite/filtered': 6, 'request_depth_max': 1, 'response_received_count': 1, 'responses_per_minute': 60.0, 'scheduler/dequeued': 2, 'scheduler/dequeued/memory': 2, 'scheduler/enqueued': 2, 'scheduler/enqueued/memory': 2, 'start_time': datetime.datetime(2025, 6, 6, 7, 52, 53, 833931, tzinfo=datetime.timezone.utc)} 2025-06-06 15:52:55 [scrapy.core.engine] INFO: Spider closed (finished) 运行之后出现这个问题
06-07
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值