scrapy爬取的数据存入到数据库中

一般我们爬取的数据要存入到数据库或者生成本地文件才有意义

一、爬取的数据直接在本地生成文件

  • 1、方法一、直接在运行命令的时候生成问

    scrapy crawl 爬虫名字 -o 文件名
  • 2、方法二、在管道中利用文件的写入方式

    • 1、管道的代码

      import json
      
      # quotes爬取的数据写到本地
      
      class QuotesPipelines(object):
          def process_item(self, item, spider):
              if spider.name == 'quotes':
                  with open('quotes_test.json', 'a', encoding='utf-8') as fp:
                      fp.write(json.dumps(dict(item), indent=2, ensure_ascii=False)+ ',\n')
                  return item
    • 2、在settings.py中配置
    • 3、直接运行scrapy crawl quotes --nolog

三、将抓取的数据存入到mongodb数据库中

  • 1、安装包

    pip install pymongo
  • 2、在settings.py中配置数据库的链接信息

    
    # 设置数据库连接
    
    MONGO_URI = 'localhost'
    MONGO_DATABASE = 'test'
  • 3、在管道中写业务逻辑

    import pymongo
    
    class MongoPipeline(object):
        """
        定义一个存入到数据库中的类
        """
        collection_name = 'scrapy_items'
    
        def __init__(self, mongo_uri, mongo_db):
            self.mongo_uri = mongo_uri
            self.mongo_db = mongo_db
    
        @classmethod
        def from_crawler(cls, crawler):
            return cls(
                mongo_uri=crawler.settings.get('MONGO_URI'),
                mongo_db=crawler.settings.get('MONGO_DATABASE', 'items')
            )
    
        def open_spider(self, spider):
            self.client = pymongo.MongoClient(self.mongo_uri)
            self.db = self.client[self.mongo_db]
    
        def close_spider(self, spider):
            self.client.close()
    
        def process_item(self, item, spider):
            if spider.name == 'quotes':
                self.db[self.collection_name].insert_one(dict(item))
                return item
  • 4、在settings.py中配置管道

  • 5、直接运行scrapy crawl quotes --nolog

四、将爬取的数据存入到mysql数据库中

  • 1、安装包

    pip install pymysql
  • 2、在数据库中创建表(区别于mongodb)

  • 3、在settings.py中配置mysql连接信息

    
    # Mysql数据库的配置信息
    
    MYSQL_HOST = '120.24.156.230'
    MYSQL_DBNAME = 'nodejs'  # 数据库名字,请修改
    MYSQL_USER = 'root'  # 数据库账号,请修改
    MYSQL_PASSWD = 'root'  # 数据库密码,请修改
    MYSQL_PORT = 3306  # 数据库端口,在dbhelper中使用
  • 4、使用管道存入数据库中

    import pymysql
    
    # 西刺代理的数据入库
    
    class XiciPipeline(object):
        def __init__(self, dbparams):
            self.connect = pymysql.connect(
                host=dbparams['host'],
                port=dbparams['port'],
                db=dbparams['db'],
                user=dbparams['user'],
                passwd=dbparams['passwd'],
                charset=dbparams['charset'],
                use_unicode=dbparams['use_unicode']
            )
            # 创建一个句柄
            self.cursor = self.connect.cursor()
    
        @classmethod
        def from_crawler(cls, crawler):
            # 读取settings中的配置
            dbparams = dict(
                host=crawler.settings.get('MYSQL_HOST'),
                db=crawler.settings.get('MYSQL_DBNAME'),
                user=crawler.settings.get('MYSQL_USER'),
                passwd=crawler.settings.get('MYSQL_PASSWD'),
                port=crawler.settings.get('MYSQL_POR'),
                charset='utf8',  # 编码要加上,否则可能出现中文乱码问题
                use_unicode=False,
            )
            return cls(dbparams)
    
        def process_item(self, item, spider):
            if spider.name == 'xici':
                sql = 'insert into xici(ip, port, speed, proxy_type, localhost) values (%s, %s, %s, %s,%s)'
                self.cursor.execute(sql, (item['ip'], item['port'], item['speed'], item['proxy_type'], item['localhost']))
                self.connect.commit()
            return item
    
        def close_spider(self, spider):
            self.connect.close()
  • 5、在settings.py中配置管道

  • 6、直接运行scrapy crawl quotes --nolog

猜你喜欢

转载自blog.csdn.net/kuangshp128/article/details/80036573