python爬虫之Scrapy框架--日志信息--数据提取

目录

Scrapy日志信息

了解日志信息

关于日志信息的重要性

利用日志信息进行调试和优化

Scrapy数据的提取

选择器(Selector)的基本使用

Item的定义与使用 

数据处理与管道(Pipeline) 


Scrapy日志信息

python爬虫之Scrapy框架--日志信息--数据提取_第1张图片

在开发和调试过程中,了解和利用Scrapy框架中的控制台日志信息,可以帮助我们更好地理解程序运行状态,优化爬取过程,提高爬虫的效率和稳定性。

了解日志信息

参考日志:

2030-07-13 16:45:19 [scrapy.utils.log] INFO: Scrapy 2.6.1 started (bot: scrapy02)
2030-07-13 16:45:19 [scrapy.utils.log] INFO: Versions: lxml 4.8.0.0, libxml2 2.9.12, cssselect 1.1.0, parsel 1.6.0, w3lib 1.22.0, Twisted 22.4.0, Python 3.10.2 (tags/v3.10.2:a58ebcc, Jan 17 2022, 14:12:15) [MSC v.1929 64 bit (AMD64)], pyOpenSSL 22.0.0 (OpenSSL 3.0.4 21 Jun 2022), cryptography 37.0.3, Platform Windows-10-10.0.22000-SP0
2030-07-13 16:45:19 [scrapy.crawler] INFO: Overridden settings:
{'BOT_NAME': 'scrapy02',
 'NEWSPIDER_MODULE': 'scrapy02.spiders',
 'SPIDER_MODULES': ['scrapy02.spiders']}
2030-07-13 16:45:19 [scrapy.utils.log] DEBUG: Using reactor: twisted.internet.selectreactor.SelectReactor
2030-07-13 16:45:19 [scrapy.extensions.telnet] INFO: Telnet Password: a7b76850d59e14d0
2030-07-13 16:45:20 [scrapy.middleware] INFO: Enabled extensions:
['scrapy.extensions.corestats.CoreStats',
 'scrapy.extensions.telnet.TelnetConsole',
 'scrapy.extensions.logstats.LogStats']
2030-07-13 16:45:20 [scrapy.middleware] INFO: Enabled downloader middlewares:
['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']
2030-07-13 16:45:20 [scrapy.middleware] INFO: Enabled spider middlewares:
['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware',
 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware',
 'scrapy.spidermiddlewares.referer.RefererMiddleware',
 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware',
 'scrapy.spidermiddlewares.depth.DepthMiddleware']
2030-07-13 16:45:20 [scrapy.middleware] INFO: Enabled item pipelines:
[]
2030-07-13 16:45:20 [scrapy.core.engine] INFO: Spider opened
2030-07-13 16:45:20 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2030-07-13 16:45:20 [scrapy.extensions.telnet] INFO: Telnet console listening on 127.0.0.1:6023
2030-07-13 16:45:24 [filelock] DEBUG: Attempting to acquire lock 1733280163264 on D:\python_env\spider2_env\lib\site-packages\tldextract\.suffix_cache/publicsuffix.org-tlds\de84b5ca2167d4c83e38fb162f2e8738.tldextract.json.lock
2030-07-13 16:45:24 [filelock] DEBUG: Lock 1733280163264 acquired on D:\python_env\spider2_env\lib\site-packages\tldextract\.suffix_cache/publicsuffix.org-tlds\de84b5ca2167d4c83e38fb162f2e8738.tldextract.json.lock
2030-07-13 16:45:24 [filelock] DEBUG: Attempting to release lock 1733280163264 on D:\python_env\spider2_env\lib\site-packages\tldextract\.suffix_cache/publicsuffix.org-tlds\de84b5ca2167d4c83e38fb162f2e8738.tldextract.json.lock
2030-07-13 16:45:24 [filelock] DEBUG: Lock 1733280163264 released on D:\python_env\spider2_env\lib\site-packages\tldextract\.suffix_cache/publicsuffix.org-tlds\de84b5ca2167d4c83e38fb162f2e8738.tldextract.json.lock
2030-07-13 16:45:24 [scrapy.core.engine] DEBUG: Crawled (200)  (referer: None) 
1111111111111111111111111111111111111111111111
2030-07-13 16:45:24 [scrapy.core.engine] INFO: Closing spider (finished)
2030-07-13 16:45:24 [scrapy.statscollectors] INFO: Dumping Scrapy stats:
{'downloader/request_bytes': 213,
 'downloader/request_count': 1,
 'downloader/request_method_count/GET': 1,
 'downloader/response_bytes': 1476,
 'downloader/response_count': 1,
 'downloader/response_status_count/200': 1,
 'elapsed_time_seconds': 4.716963,
 'finish_reason': 'finished',
 'finish_time': datetime.datetime(2030, 7, 13, 8, 45, 24, 923094),
 'httpcompression/response_bytes': 2381,
 'httpcompression/response_count': 1,
 'log_count/DEBUG': 6,
 'log_count/INFO': 10,
 'response_received_count': 1,
 'scheduler/dequeued': 1,
 'scheduler/dequeued/memory': 1,
 'scheduler/enqueued': 1,
 'scheduler/enqueued/memory': 1,
 'start_time': datetime.datetime(2030, 7, 13, 8, 45, 20, 206131)}
2030-07-13 16:45:24 [scrapy.core.engine] INFO: Spider closed (finished)

我们可以看到大体的日志信息如下: 

  • 启动爬虫

  • 使用的模块与版本

  • 加载配置文件

  • 打开下载中间件

  • 打开中间件

  • 打开管道

  • 爬虫开启

  • 打印统计

 详细的信息介绍:

  1. 日志级别控制:Scrapy框架通过设置日志级别来控制控制台输出的详细程度。默认情况下,日志级别设置为DEBUG,输出最详细的信息。我们可以根据需要将日志级别调整为其他级别,如INFO、WARNING、ERROR等,以减少冗余信息。

  2. 请求与响应信息:在控制台日志中,Scrapy会显示每个请求的URL、HTTP方法、请求头信息等内容,方便我们追踪和调试网络请求。同时,对于每个请求的响应,日志中会显示响应的状态码、大小以及响应时间等信息,帮助我们评估爬虫的性能和网络状况。

  3. 解析过程日志:当Scrapy框架解析网页并提取数据时,会在控制台中显示解析过程的详细日志信息,包括解析的XPath或CSS选择器表达式、提取的字段内容以及数据处理的结果。通过观察这些日志信息,我们可以及时发现解析错误和异常,优化数据提取的方法,确保数据的准确性和完整性。

  4. 中间件日志:Scrapy框架中的中间件用于处理请求和响应,在控制台日志中,我们可以查看中间件的调用顺序和结果,从而了解中间件在爬虫过程中的作用和效果。中间件日志信息可以帮助我们定位中间件的问题,如处理请求时出现的错误或异常。

关于日志信息的重要性

  1. 爬虫状态跟踪:通过控制台日志信息,我们可以实时监控爬虫的状态,包括请求的发送和响应的接收情况,从而了解爬虫的运行情况。当爬虫出现异常或错误时,控制台日志信息可以帮助我们快速定位问题所在,加快故障排查的速度。

  2. 数据提取与处理:控制台日志信息中会显示爬虫解析网页的过程,包括提取的字段、抓取的链接以及数据处理的结果。通过查看这些信息,我们可以验证数据提取的准确性,及时发现和解决解析过程中的问题,并根据日志信息对数据进行预处理和清洗。

  3. 请求优化与反爬虫策略:通过观察控制台日志信息,我们可以分析请求的发送频率、响应时间以及可能的异常情况,进而优化请求策略,降低被反爬虫策略拦截的概率。此外,当网站对爬虫进行反爬虫限制时,通过观察日志信息可以及时发现相关反爬虫机制,并针对性地调整爬虫的行为,提高爬取效率。

利用日志信息进行调试和优化

  1. 定位错误和异常:当爬虫运行出现错误或异常时,可以通过查看控制台日志信息来定位问题所在。根据日志中的报错信息和堆栈调用,我们可以追踪错误的源头,修复代码中的bug,并确保爬虫的正常运行。

  2. 优化数据提取:通过观察控制台日志中的解析过程日志,我们可以检查数据提取的结果,判断是否存在解析错误或缺失数据的情况。对于复杂的网页结构,可以根据日志信息调整解析规则,优化数据提取的准确性和效率。

  3. 网络请求优化:通过观察控制台日志中的请求和响应信息,我们可以评估爬虫的性能,发现潜在的网络瓶颈和延迟问题。根据日志中的响应时间和状态码,我们可以调整请求频率、使用异步请求等方式,优化爬虫的网络请求效率。

Scrapy数据的提取

在Web爬虫的开发中,数据提取是至关重要的一步。Scrapy框架作为一个高效、灵活的爬虫框架,提供了强大的数据提取和处理功能。

选择器(Selector)的基本使用

Scrapy提供了内置的选择器(Selector)类,它基于XPath和CSS选择器,用于从HTML或XML文档中提取数据。

我们创建一个选择器对象selector,并传入响应对象response。然后,我们使用XPath和CSS选择器提取了标题和内容,并通过get()getall()方法获取结果。最后,我们打印了提取的数据。

import scrapy

class MySpider(scrapy.Spider):
    name = 'example_spider'
    start_urls = ['http://example.com']

    def parse(self, response):
        # 创建选择器对象
        selector = scrapy.Selector(response=response)
        
        # 使用XPath提取数据
        title = selector.xpath('//h1/text()').get()
        
        # 使用CSS选择器提取数据
        content = selector.css('div.content p::text').getall()
        
        # 打印提取的数据
        print("Title:", title)
        print("Content:", content)

Item的定义与使用 

在Scrapy中,Item用于定义要提取的数据结构,类似于一个数据模型。

我们首先定义一个名为ProductItem的Item类,其中包含了namepricedescription等字段。然后,在parse方法中,我们实例化了一个ProductItem对象product,并通过选择器提取数据,并将提取的数据赋值给相应的字段。最后,通过yield语句将product对象返回。

import scrapy

class ProductItem(scrapy.Item):
    name = scrapy.Field()
    price = scrapy.Field()
    description = scrapy.Field()

class MySpider(scrapy.Spider):
    name = 'example_spider'
    start_urls = ['http://example.com']

    def parse(self, response):
        product = ProductItem()
        product['name'] = response.css('h1::text').get()
        product['price'] = response.css('.price::text').get()
        product['description'] = response.css('.description::text').get()
        yield product

数据处理与管道(Pipeline) 

 Scrapy的管道(Pipeline)提供了一种机制,用于对提取的数据进行处理和持久化存储。

我们定义一个名为DataPipeline的管道类,并实现了process_item方法。在process_item方法中,我们可以对提取的数据进行任何需要的处理,例如清洗、转换、计算等。在示例中,我们对item['data']进行了处理,并将处理后的结果存储在item['processed_data']中,最后返回处理后的item对象。

class DataPipeline:
    def process_item(self, item, spider):
        # 数据处理逻辑
        processed_data = self.process_data(item['data'])
        item['processed_data'] = processed_data
        return item

为了启用管道,需要在Scrapy配置文件(settings.py)中启用管道并设置优先级: 

ITEM_PIPELINES = {
    'myproject.pipelines.DataPipeline': 300,
}

以上配置将启用DataPipeline并设置其优先级为300。 

你可能感兴趣的:(#,python爬虫,scrapy,python,爬虫)