二(1.scrapy)Scrapy--item

本文介绍如何使用Scrapy框架创建爬虫项目,包括项目结构、Item定义及使用ItemLoader简化字段提取过程等内容。

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

Scrapy

文章仅供学习,如有错误,欢迎指出

1.创建项目 scrapy startproject tutorial

2.文件目录

tutorial/
    scrapy.cfg #项目的配置文件
    tutorial/
        __init__.py #声明包
        items.py    #项目中的item文件,提取字段内容
        pipelines.py #项目中的pipeline文件
        settings.py  #设置文件
        spiders/     #你的爬虫专用文件
            __init__.py  #声名包
            ...

使用Item整理

Item对象是自定义的python字典。 您可以使用标准的字典语法来获取到其每个字段的值。(字段即是我们之前用Field赋值的属性):

for i in response('//ul/li'):
    item = DmozItem()#引用items.py下的类
    item['title'] = i.xpath().extract()
    ...
    yield item

存储爬取到的数据

scrapy crawl spidername -o items.json

Item Pipeline

process_item(self, item, spider)

http://scrapy-chs.readthedocs.io/zh_CN/latest/topics/item-pipeline.html#process_item

3.定制自己的Items

Item是爬取到的数据的容器,在这里我们可以将自己爬取到的内容定义不同的字段名。再通过parse的方法解析并读取出来放到这里

import scrapy

class DmozItem(scrapy.Item):
    title = scrapy.Field()
    link = scrapy.Field()
    desc = scrapy.Field()

​ 如果你学过django 那么item字段一定难不倒你, 你可以创建属于自己的Item类,但是需要继承的时Item类,比如一个网站你想爬取的内容很多,那么你可以定义属于自己的item类,并且用Field去声明。但是他并没有对字段进行分类,当你在之后想要存到数据库时,就需要去修改他的形式。

Item在其他地方的引用


  from firstspider.items import DmozItem    #引用Item
    def parse_artical_text(self,response):
        pass

        item = bolezaixianSpiderItem()
        title = response.css('.grid-8 .entry-header h1::text')[0].extract()
        time =  response.css('.grid-8 .entry-meta p::text')[0].extract().strip().replace('·','').strip()
        theme = response.css('.grid-8 .entry-meta p a::text')[0].extract().strip()
        zan =   response.css('.grid-8 .post-adds span h10::text')[0].extract()
        fav = response.css('.grid-8 .post-adds span::text')[2].extract()
        fav_re = re.match('.*?(\d+).*',fav)
        if fav_re:
            fav = fav_re.group(1)
        else:
            fav=0

        item['title'] = title
        item['time'] = time
        item['theme'] = theme
        item['zan'] = zan
        item['fav'] = fav
        yield item

​ 这样的处理方式一旦当字段多的时候我们就会使得工作变得复杂,并且不好修改

#通过Item_load来简化我们提取字段的过程
from scrapy.loader import ItemLoader


item_loader = ItemLoader(item=bolezaixianSpiderItem,response=response)
item_loader.add_css('title','.grid-8 .entry-header h1::text')
item_loader.add_xpath('title','//id[@href ="sd"]')
item_loader.add_value('url',response.url)
item_loader.add_value('title',response.title)

​ 这样的操作会让我们容易后期的修改,add_css内只要输入字段名称以及css筛选的代码就可以过滤出来。

但是有时候我们只要取一个值,这时候我们需要在items.py下去筛选。

​ Field()包含了两种处理方法

from scrapy.loader.processors import MapCompose,TakeFirst

def cut_Item(value):   #这里处理我们的接受到的数据
    return value+"dsd"  #处理数据

class test(scrapy.Item):
    title = scrapy.Field(
        input_process = MapCompose(cut_Item),   #自定义对字段的处理方法
        output_process = TakeFirst() #取第一个,但是如果我们的字段过多。这个时候我们可以自定义一个load
    )

当然如果我们指向要取第一位数字,我们只要声名一个item类就可以了。

他有四个参数

class ItemLoader(object):

    default_item_class = Item
    default_input_processor = Identity()
    default_output_processor = Identity()
    default_selector_class = Selector

    def __init__(self, item=None, selector=None, response=None, parent=None, **context):
        if selector is None and response is not None:
            selector = self.default_selector_class(response)
        self.selector = selector
        context.update(selector=selector, response=response)
        if item is None:
            item = self.default_item_class()
        self.context = context
        self.parent = parent
        self._local_item = context['item'] = item
        self._local_values = defaultdict(list)
# from scrapy.loader import ItemLoader
#
# class  zidingyiItemload(ItemLoader):
#     default_output_processor = TakeFirst()
<think>嗯,用户问的是关于Scrapy命令“scrapy crawl name --nolog”的作用。首先,我得回忆一下Scrapy的基本用法。Scrapy是一个Python的爬虫框架,用户通常通过命令行来运行爬虫。命令“scrapy crawl”后面跟着爬虫的名字,用来启动指定的爬虫。 然后,用户提到了“--nolog”这个参数。我记得Scrapy在默认情况下运行时会输出很多日志信息,包括调试信息、请求响应状态等。这些日志对于开发和调试非常有用,可以帮助开发者了解爬虫的运行情况,定位问题。但有时候,用户可能不需要这些日志,比如在自动化脚本中运行爬虫,或者希望输出更简洁的时候。 接下来需要确认“--nolog”的具体作用。查阅Scrapy的文档,发现“--nolog”参数的作用是禁用日志输出。这样运行爬虫时,控制台就不会显示日志信息,使得输出更干净,只显示爬虫的直接输出,比如通过print语句输出的内容或者Item数据。 然后要思考用户为什么会使用这个参数。可能的情况包括:用户希望减少屏幕上的输出信息,特别是在爬虫已经调试完毕,进入稳定运行阶段时;或者在批量运行爬虫时,避免日志文件过大;或者用户只需要爬取的数据,而不关心中间的过程日志。 还需要考虑用户可能的误解,比如是否“--nolog”会完全禁用所有输出。实际上,Scrapy的日志系统被禁用,但通过标准输出(如print语句)的内容仍然会显示。这一点需要明确说明,避免用户混淆。 另外,可能需要比较其他相关参数,比如“-L”来设置日志级别,例如“-L WARNING”只显示警告及以上级别的日志,而“--nolog”则是完全禁用。这样用户可以根据需求选择不同的日志控制方式。 最后,应该给出一个示例命令,说明如何使用,并解释结果的不同。例如,正常运行的命令会有大量日志,而加上“--nolog”后只有必要的信息显示,这样用户能直观看到区别。 总结起来,回答需要分点说明命令的结构、参数的作用、适用场景以及注意事项,确保用户能够清晰理解并正确使用该命令。</think>Scrapy的`scrapy crawl name --nolog`是一个命令行指令,主要用于控制爬虫运行时的日志输出行为。以下是逐层解析: --- ### 1. **命令结构** - `scrapy crawl`:Scrapy框架运行爬虫的核心命令 - `name`:需替换为你在代码中定义的爬虫名称(`name`属性) - `--nolog`:附加参数,用于关闭日志输出 --- ### 2. **核心作用** - **禁用日志输出**:默认运行爬虫时,Scrapy会输出DEBUG级别的日志(包含请求、响应、管道处理等详细信息)。添加`--nolog`后会完全关闭这些日志。 - **保持终端简洁**:适合以下场景: - 自动化脚本中运行爬虫时避免日志干扰 - 仅需查看`print()`输出或导出数据内容 - 性能测试时减少I/O开销 --- ### 3. **对比实验** #### 默认命令(含日志): ```bash scrapy crawl myspider ``` 输出内容包含: ``` [scrapy.core.engine] DEBUG: Crawled (200) <GET https://example.com> [scrapy.downloadermiddlewares] DEBUG: Redirecting to... ``` #### 使用`--nolog`后: ```bash scrapy crawl myspider --nolog ``` 输出仅保留: - 你的`parse()`方法中的`print()`内容 - 通过`Item Pipeline`导出的数据(如JSON/CSV文件) --- ### 4. **进阶用法** - **部分日志控制**:若需保留警告或错误日志,可改用日志级别参数: ```bash scrapy crawl myspider -L WARNING # 只显示WARNING及以上级别日志 ``` - **日志重定向**:即使使用`--nolog`,仍可通过重定向保存关键输出: ```bash scrapy crawl myspider --nolog > output.txt ``` --- ### 5. **注意事项** - **调试时不建议使用**:排查问题时需依赖完整日志 - **不会关闭Scrapy统计信息**:最终仍会显示类似`{'item_scraped_count': 100}`的统计信息 - **与`-o`配合使用**:常与数据导出命令组合,例如: ```bash scrapy crawl myspider --nolog -o data.json ``` 通过合理使用此参数,可显著提升爬虫在非调试场景下的运行体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值