• Scrapy框架的学习(6.item介绍以及items的使用(提前定义好字段名))转载https://blog.csdn.net/wei18791957243/article/details/86259688


     

    在Scrapy框架中的items.py的作用

      1.可以预先定义好要爬取的字段     items.py

    1. import scrapy
    2.  
    3.  
    4. class TencentItem(scrapy.Item):
    5. # define the fields for your item here like:
    6. # name = scrapy.Field()
    7. """定义好字段,并不代表真正的值,只是占一个位置,用的时候直接赋值就行"""
    8. position = scrapy.Field()
    9. category = scrapy.Field()
    10. date = scrapy.Field()

     2. 把字段定义好之后 ,就可以在爬虫中进行使用

        在用的时候, item的键名要和在items.py里面定义好的字段名称一致

    1. import scrapy
    2. ''' 导入不同爬虫的类字段'''
    3. from tencent.items import TencentItem,TencentItem2,TencentItem3
    4.  
    5. class TencentSpiderSpider(scrapy.Spider):
    6. name = 'tencent_spider'
    7. allowed_domains = ['tencent.com']
    8. start_urls = ['https://hr.tencent.com/position.php']
    9.  
    10. def parse(self, response):
    11. tr_list = response.xpath("//table[@class='tablelist']//tr")[1:-1]
    12. for tr in tr_list:
    13. """使用定义好的类"""
    14. item = TencentItem()
    15. """里面的键名,必须提前在items里面定义好之后才能用"""
    16. item["position"] = tr.xpath("./td/a/text()").extract_first()
    17. item["category"] = tr.xpath(".//td[2]/text()").extract_first()
    18. item["date"] = tr.xpath(".//td[5]/text()").extract_first()
    19. yield item

     3. 如果想在pipelines.py中使用的方法是大同小异,只是在进行处理的时候item传过来的是一个类对象,要对其进行相应        的  转化

    1. '''分别导入不同爬虫的字段类'''
    2. from tencent.items import TencentItem, TencentItem2, TencentItem3
    3.  
    4.  
    5. class TencentPipeline(object):
    6. def process_item(self, item, spider):
    7. """使用item的时候这里接收的是TencentItem类的对象,我们可以把它转化字典"""
    8. print(dict(item))
    9. '''针对与不同的爬虫字段类的对象,做不同的处理'''
    10. return item

    4. 这样做有什么好处呢,个人理解:

    (1)  可以直接看items.py,可以看出来要爬取那些字段

     (2) 防止我们在item["键名"]  输入键名的时候输入错误

    有多个爬虫时Item的处理

    例如有个腾讯爬虫、有个京东爬虫,怎样处理

    1. 在items.py里面创建不同的类,分别保存各自的字段

    1. class TencentItem(scrapy.Item):
    2. """腾讯爬虫要爬取的字段"""
    3. """定义好字段,并不代表真正的值,只是占一个位置,用的时候直接赋值就行"""
    4. position = scrapy.Field()
    5. category = scrapy.Field()
    6. date = scrapy.Field()
    7.  
    8. class JdItem(scrapy.Item):
    9. """京东爬虫要爬取的字段"""
    10. """定义好字段,并不代表真正的值,只是占一个位置,用的时候直接赋值就行"""
    11. position = scrapy.Field()
    12. category = scrapy.Field()
    13. date = scrapy.Field()

     2. 然后在不同的爬虫程序里使用对应的类即可

         在腾讯的爬虫里 ,  导入和使用

    1. import scrapy
    2. # 导入不同爬虫的类字段
    3. from tencent.items import TencentItem
    4.  
    5. class TencentSpiderSpider(scrapy.Spider):
    6. pass
    7. def parse(self, response):
    8. pass
    9. for tr in tr_list:
    10. """使用定义好的腾讯爬虫的类的字段"""
    11. item = TencentItem()
    12. yield item

      在京东的爬虫中,可以这样使用

    1. import scrapy
    2. # 导入不同爬虫的类字段
    3. from JD.items import JdItem
    4.  
    5. class JdSpiderSpider(scrapy.Spider):
    6. pass
    7. def parse(self, response):
    8. pass
    9. for tr in tr_list:
    10. """使用定义好的腾讯爬虫的类的字段"""
    11. item = JdItem()
    12. yield item

    3. 对于多个爬虫,在pipelines,py中可以进行判断,分别对不同的爬虫的字段进行不同的处理

        isinstance() 函数来判断一个对象是否是一个已知的类型

    1. '''分别导入不同爬虫的字段类'''
    2. from tencent.items import TencentItem, JdItem2
    3.  
    4.  
    5. class TencentPipeline(object):
    6. def process_item(self, item, spider):
    7. '''针对与不同的爬虫字段类的对象,做不同的处理'''
    8. if isinstance(item, TencentItem):
    9. pass
    10. if isinstance(item, JdItem2):
    11. pass
    12. return item
  • 相关阅读:
    python 函数嵌套
    python 函数对象
    python 函数参数
    python 连接MySQL报错及解决方案
    解决 No module named pip
    python 文件处理
    python
    python 元祖
    python 读取域名信息
    ubuntu 配置网卡,DNS, iptables
  • 原文地址:https://www.cnblogs.com/agang-php/p/10582111.html
Copyright © 2020-2023  润新知