Как визуализировать данные из Scraped данных - PullRequest
0 голосов
/ 03 мая 2020

Я сделал веб-скребок с Scrapy, который собирает данные обменного курса из https://www.ecb.europa.eu/stats/policy_and_exchange_rates/euro_reference_exchange_rates/html/index.en.html и отображает данные (сокращенное наименование валюты, полное имя валюты и курс) в виде таблицы через My SQL , Что я хочу сделать, так это сделать так, чтобы каждый раз, когда курс повышался или понижался по сравнению с последним циклом, к валюте добавлялся столбец, сообщающий, на сколько процентов он увеличился или уменьшился. Как бы я это сделал? Это код, который у меня есть:

currency_scraper.py:

import scrapy
from ..items import EurotocurrencyItem

class CurrencySpider(scrapy.Spider):
    name = 'currency'
    start_urls = [
        'https://www.ecb.europa.eu/stats/policy_and_exchange_rates/euro_reference_exchange_rates/html/index.en.html'
    ]

    def parse(self, response):
        exchange_rates = response.xpath('//*[@class="forextable"]//tr')
        for exchange_rate in exchange_rates:
            item = EurotocurrencyItem()
            currency = exchange_rate.xpath('.//td[@class="currency"]//text()').extract_first()
            currencyl = exchange_rate.xpath('.//td[@class="alignLeft"]//text()').extract_first()
            rate = exchange_rate.css('.rate::text').extract_first()

            item['currency'] = currency
            item['currencyl'] = currencyl
            item['rate'] = rate

            yield item

items.py:

import scrapy


class EurotocurrencyItem(scrapy.Item):
    currency = scrapy.Field()
    currencyl = scrapy.Field()
    rate = scrapy.Field()

pipelines.py:

import mysql.connector


class EurotocurrencyPipeline:

    def __init__(self):
        self.create_connection()
        self.create_table()

    def create_connection(self):
        self.conn = mysql.connector.connect(
            host='localhost',
            user='root',
            passwd='notrealpassword',
            database='currency'
        )
        self.curr = self.conn.cursor()

    def create_table(self):
        self.curr.execute("""DROP TABLE IF EXISTS currency_tb""")
        self.curr.execute("""create table currency_tb(
                    currency text,
                    currencyl text,
                    rate text
                    )""")

    def process_item(self, item, spider):
        self.store_db(item)
        return item

    def store_db(self, item):
        self.curr.execute("""insert into currency_tb values(%s, %s, %s  )""", (
            item['currency'],
            item['currencyl'],
            item['rate']
        ))
        self.conn.commit()

1 Ответ

0 голосов
/ 03 мая 2020

Несколько возможностей:

  • В методе process_item (который будет выполняться для каждого элемента) можно выполнить запрос к mysql, чтобы получить предыдущий обменный курс валюты. Затем вы можете сравнить его с курсом в вашем элементе, а затем выполнить вставку
  • . Вы добавляете метод open_spider в конвейер, в котором вы запрашиваете весь текущий курс обмена по валюте в словаре. Затем в process_item вы сравниваете курс в словаре для валюты с курсом в текущем элементе. Таким образом, вам нужно всего лишь сделать 1 выбор в базе данных
  • . Вы меняете структуру своей базы данных, поэтому вы всегда вставляете значение при каждой очистке. Лог c расчета уменьшения / увеличения может быть выполнен вне лога скребков c.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...