данные элемента scrapy не сохраняются в базе данных postgresql - PullRequest
0 голосов
/ 13 июля 2020

Я пытаюсь очистить данные и сохранить их в базе данных postgresql. Код правильно извлекает данные и сохраняет их в файле, но не отображается в таблице в базе данных. URL-адрес, который я пытаюсь очистить, - https://www.gizbot.com/mobile-brands-in-india/ '

spider.py

class MobilesSpider(scrapy.Spider):
    name = "mobiles"

    def start_requests(self):
        urls = [
            'https://www.gizbot.com/mobile-brands-in-india/',
            
        ]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        page = response.url.split("/")[-2]
        filename = 'mobiles-%s.html' % page
        mob = response.xpath('.//div[has-class("all-brands-block-desc-brand")]/text()').getall()
        im = list(response.css('div.all-brands-block'))
        res = dict(zip(mob, im))
        for mobile, i in res.items():

            with open(filename, 'a') as f:
                f.write("%s %s\n" % (mobile, "gizbot.com"+str(i.css('img::attr("data-pagespeed-lazy-src")').extract())))
            self.log('Saved file %s' % filename)

pipelines.py

class MobilesPipeline:

    def open_spider(self, spider):
        hostname = 'localhost'
        username = 'postgres'
        password = 'postgres'  # your password
        database = 'postgres'
        self.connection = psycopg2.connect(host=hostname, user=username, password=password, dbname=database)
        self.cur = self.connection.cursor()

    def close_spider(self, spider):
        self.cur.close()
        self.connection.close()

    def process_item(self, item, spider):
        self.cur.execute("insert into mobiles(name,image) values(%s,%s)", (item['name'], item['image']))
        self.connection.commit()
        return item

I необходимо сохранить название бренда и источник img в базе данных.

1 Ответ

0 голосов
/ 13 июля 2020

Судя по предоставленной вами информации, вы, вероятно, не включили конвейер в настройках вашего паука. Для вызова метода process_item конвейер должен быть активен, для этого вам необходимо добавить следующую конфигурацию в ваш settings.py

ITEM_PIPELINES = {
    'myproject.pipelines.MobilesPipeline': 300,
}
  • Обратите внимание, что вам нужно заменить myproject. с именем вашего проекта.
  • Целое число определяет порядок, в котором работают конвейеры, от классов с более низким значением к классам с более высоким значением.

Вот документы если вам нужна дополнительная информация.

...