目录
Scrapy日志信息
了解日志信息
关于日志信息的重要性
利用日志信息进行调试和优化
Scrapy数据的提取
选择器(Selector)的基本使用
Item的定义与使用
数据处理与管道(Pipeline)
Scrapy日志信息
在开发和调试过程中,了解和利用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) <GET http://www.baidu.com/> (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)
我们可以看到大体的日志信息如下:
启动爬虫
使用的模块与版本
加载配置文件
打开下载中间件
打开中间件
打开管道
爬虫开启
打印统计
详细的信息介绍:
-
日志级别控制:Scrapy框架通过设置日志级别来控制控制台输出的详细程度。默认情况下,日志级别设置为DEBUG,输出最详细的信息。我们可以根据需要将日志级别调整为其他级别,如INFO、WARNING、ERROR等,以减少冗余信息。
-
请求与响应信息:在控制台日志中,Scrapy会显示每个请求的URL、HTTP方法、请求头信息等内容,方便我们追踪和调试网络请求。同时,对于每个请求的响应,日志中会显示响应的状态码、大小以及响应时间等信息,帮助我们评估爬虫的性能和网络状况。
-
解析过程日志:当Scrapy框架解析网页并提取数据时,会在控制台中显示解析过程的详细日志信息,包括解析的XPath或CSS选择器表达式、提取的字段内容以及数据处理的结果。通过观察这些日志信息,我们可以及时发现解析错误和异常,优化数据提取的方法,确保数据的准确性和完整性。
-
中间件日志:Scrapy框架中的中间件用于处理请求和响应,在控制台日志中,我们可以查看中间件的调用顺序和结果,从而了解中间件在爬虫过程中的作用和效果。中间件日志信息可以帮助我们定位中间件的问题,如处理请求时出现的错误或异常。
关于日志信息的重要性
-
爬虫状态跟踪:通过控制台日志信息,我们可以实时监控爬虫的状态,包括请求的发送和响应的接收情况,从而了解爬虫的运行情况。当爬虫出现异常或错误时,控制台日志信息可以帮助我们快速定位问题所在,加快故障排查的速度。
-
数据提取与处理:控制台日志信息中会显示爬虫解析网页的过程,包括提取的字段、抓取的链接以及数据处理的结果。通过查看这些信息,我们可以验证数据提取的准确性,及时发现和解决解析过程中的问题,并根据日志信息对数据进行预处理和清洗。
-
请求优化与反爬虫策略:通过观察控制台日志信息,我们可以分析请求的发送频率、响应时间以及可能的异常情况,进而优化请求策略,降低被反爬虫策略拦截的概率。此外,当网站对爬虫进行反爬虫限制时,通过观察日志信息可以及时发现相关反爬虫机制,并针对性地调整爬虫的行为,提高爬取效率。
利用日志信息进行调试和优化
-
定位错误和异常:当爬虫运行出现错误或异常时,可以通过查看控制台日志信息来定位问题所在。根据日志中的报错信息和堆栈调用,我们可以追踪错误的源头,修复代码中的bug,并确保爬虫的正常运行。
-
优化数据提取:通过观察控制台日志中的解析过程日志,我们可以检查数据提取的结果,判断是否存在解析错误或缺失数据的情况。对于复杂的网页结构,可以根据日志信息调整解析规则,优化数据提取的准确性和效率。
-
网络请求优化:通过观察控制台日志中的请求和响应信息,我们可以评估爬虫的性能,发现潜在的网络瓶颈和延迟问题。根据日志中的响应时间和状态码,我们可以调整请求频率、使用异步请求等方式,优化爬虫的网络请求效率。
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类,其中包含了name
、price
和description
等字段。然后,在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。