У меня есть несколько вопросов о моей логике в проекте. Мой проект основан на скриптах, которые анализируют данные с тысячи сайтов (отдельный скрипт для сайта). На самом деле у меня есть около 40 скриптов, но я хочу организовать их для больших данных в будущем. После очистки скрипты имеют метод «insert_data», который вставляет данные (список словарей) в мою базу данных POSTGRESQL. В скриптах для получения данных использую библиотеки: запросы, urllib, иногда selenium (страницы с JS) и BeautifulSoup4 для парсинга загруженных данных. Ниже логика моих скриптов:
class Main():
# initialize variables
def __init__():
def get_url(self, url):
requests.get(url)
return soup(url)
# data_insert is list of dicts
def insert_data(self, data_insert):
cursor.executemany("INSERT INTO table1 (url, title, etc...) VALUES (% (url)s, %(title)s, data_insert)
def __main__(self):
# 1 looping
for auction in auctions:
list_auctions.append(get_href_auction)
# 2 looping
for row in list_auctions:
get_url(row)
grab some data
record = {"var1":"value", "var2":"value" etc}
final_list.append(record)
# after 2 looping insert data to POSTGRESQL
insert_data(final_list)
В базе данных у меня есть таблица для каждого веб-сайта и таблица «data_all». Скрипты вставляют данные в таблицу для каждого веб-сайта, и у меня есть триггер после вставки, который загружает данные из этих таблиц в основную таблицу «data_all». Ниже код моего триггера:
CREATE TRIGGER trigger_insert_data_to_main_table
AFTER INSERT
ON data_table1
EXECUTE PROCEDURE insert_data_to_main_table();
CREATE TRIGGER trigger_insert_data_to_main_table
AFTER INSERT
ON data_table2
EXECUTE PROCEDURE insert_data_to_main_table();
и т.д... для всех моих таблиц.
CREATE OR REPLACE FUNCTION insert_data_to_main_table()
RETURNS trigger AS
$BODY$
BEGIN
INSERT INTO data_all
SELECT t1.*
FROM data_table1 t1
LEFT JOIN data_all d ON d.url = t1.url
WHERE d.url IS NULL
UNION
SELECT t2.*
FROM data_table2 t2
LEFT JOIN data_all d ON d.url = t2.url
WHERE d.url IS NULL;
RETURN NULL;
END;
SELECT t3.*
FROM data_table3 t3
и т.д... для всех моих таблиц.
Эта функция позволяет мне игнорировать дубликаты URL-адресов (которые УНИКАЛЬНЫ для каждой строки) в основной таблице «data_all».
- Хорошая логика для парсинга скриптов? Для страниц без JS работает нормально (быстро). Иногда у меня есть только 1 цикл, чтобы получить некоторые данные с главной страницы (без итерации для аукциона).
- Это хороший способ вставлять данные таким образом? В будущем мне нужно создать основной скрипт с очередью скриптов очистки
- Как обезопасить основной скрипт, чтобы в случае ошибки он возвращал мне сообщение и продолжал работать?
- Я недавно читал о многопроцессорности. Стоит ли использовать его в этом проекте для повышения эффективности?
- У кого-нибудь есть лучшая идея для захвата данных со страниц JS? Я нахожу решение на основе request.post. Это единственная альтернатива селену в питоне?
Большое спасибо, что прочитали пост до конца и надеюсь, что вы можете мне помочь. С Уважением :)