使用 MySQLDB 模組在 Scrapy 中連線和批量插入 MySQL - Python 2.7

此示例演示如何使用 Python Scrapy 將資料動態插入 MySQL。

你無需為任何專案編輯 pipelines.py 檔案。

此示例可用於你的所有專案。

只需從你的 Spiderpipelines.py 中選擇一個查詢,就會自動建立一個查詢。

使用批量插入語句批量插入行。

必讀

  1. 你來自 Spider 的 tihuan 6 的金鑰必須與資料庫表的列名相同。
  2. 必須在執行程式碼之前建立表。
  3. 注意 if len(self.items) >= 50 行,你可以將 50 改為任何整數。

settings.py

DB_CREDS = {
    'host':'localhost',
    'user':'root',
    'pass':'password',
    'db':'db_name'
}

your_project_folder/spiders/spider_file.py

from scrapy.utils.project import get_project_settings
        def __init__(self, *args, **kwargs):
                self.connectDB()

        def connectDB(self):
                
                self.conn = MySQLdb.connect(user=DB_CREDS['user'], passwd=DB_CREDS['pass'], db=DB_CREDS['db'], host=DB_CREDS['host'], charset="utf8", use_unicode=True)

                self.cursor = MySQLdb.cursors.DictCursor(self.conn) 

                self.conn.autocommit(True)

your_project_folder/pipelines.py

# -*- coding: utf-8 -*-
import logging
from scrapy import signals

class MyPipeline(object):

    def __init__(self):
        self.items=[]

    def process_item(self, item, spider):
            
                self.placeholders = ', '.join(['%s'] * len(item))
                self.columns = ', '.join(item.keys())
                self.query = "INSERT INTO %s ( %s ) VALUES ( %s )" % ("table_name", self.columns, self.placeholders)
                
        self.items.extend([item.values()])
        
        if len(self.items) >= 50:

            try:
                spider.cursor.executemany(self.query, self.items)
                self.items = []    
            except Exception as e:
                if 'MySQL server has gone away' in str(e):
                    spider.connectDB()
                    spider.cursor.executemany(self.query, self.items)
                    self.items = []    
                    else:   
                        raise e
        return item

        def close_spider(self, spider):
            try:
                    spider.cursor.executemany(self.query, self.items)
                    self.items = []    
            except Exception as e:
                    if 'MySQL server has gone away' in str(e):
                            spider.connectDB()
                            spider.cursor.executemany(self.query, self.items)
                            self.items = []    
                    else:   
                            raise e