Scrapy вставить в базу данных - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть рабочий скрипт с использованием scrapy, который вставляет очищенные элементы в базу данных с помощью класса конвейеров.Однако это, кажется, значительно замедляет процесс очистки.Я использую метод элемента процесса, чтобы вставить каждый очищенный элемент в базу данных по мере его удаления.Будет ли быстрее вывести очищенные элементы в CSV-файл, а затем использовать хранимую процедуру для вставки данных в базу данных?

def process_item(self, item, spider):

    if 'address_line_1' in item:
        sql = """INSERT dbo.PropertyListings (date, url, ad_type, address_line_1, suburb, state, postcode)
        SELECT ?, ?, ?, ?, ?, ?, ?
        WHERE NOT EXISTS
        (   SELECT 1
            FROM dbo.PropertyListings
            WHERE date = ?
            AND address_line_1 = ?
            AND suburb = ?
            AND state = ?
            And postcode = ?
        )
        """
        self.crsr.execute(sql, item['date'], item['url'], item['ad_type'], item['address_line_1'], item['suburb'], \
            item['state'], item['postcode'], item['date'], item['address_line_1'], item['suburb'], item['state'], \
            item['postcode'])
        self.conn.commit()

    else:
        sql = """INSERT dbo.PropertyListings (date, url, ad_type, address_line_1, suburb, state, postcode)
        SELECT ?, ?, ?, ?, ?, ?, ?
        WHERE NOT EXISTS
        (   SELECT 1
            FROM dbo.PropertyListings
            WHERE date = ?
            AND url = ?
        )
        """

        self.crsr.execute(sql, item['date'], item['url'], item['ad_type'], '', item['suburb'], \
            item['state'], item['postcode'], item['date'], item['url'])
        self.conn.commit()

    return item

1 Ответ

0 голосов
/ 27 ноября 2018

Похоже, вы пытаетесь сделать вставку для каждой точки данных.Это действительно очень медленно!Вам следует рассмотреть массовые вставки после того, как вы собрали все свои данные, или, по крайней мере, вставить кусками.

Используйте что-то вроде этого

def scrape_me_good():
    data = []

    for something in something_else():
        # Process data
        data.append(process_a_something(something)

    bulk_insert(data)

Вместо этого

def scrape_bad():
    for something in something_else():
        single_insert(process_a_something(something)

См. этот ответ , где приведена довольно хорошая разбивка производительности на сервере SQL

...