Налаштування середовища, отримання ключів та запуск скрипта
Частина 1. Налаштування Python-середовища
Перед запуском скрипта необхідно створити віртуальне середовище (venv). Це дозволяє уникнути конфліктів версій бібліотек і не “смітити” в системних пакетах.
Крок 1. Створення venv
Виконується один раз у папці з проектом:
|
1 |
python -m venv venv |
Крок 2. Активація середовища
macOS / Linux:
|
1 |
source venv/bin/activate |
Windows:
|
1 |
venv\Scripts\activate |
Крок 3. Встановлення бібліотек
Після активації venv встановлюємо всі необхідні залежності:
|
1 2 |
pip install requests beautifulsoup4 lxml pip install gspread oauth2client |
Крок 4. Запуск скрипта
|
1 |
python parser_script.py |
Чому Python, а не Google Apps Script? BeautifulSoup з lxml набагато краще витягує дані з WordPress, html.unescape() прибирає HTML-ентіті на зразок “, а скрипт обробляє 600+ статей за один запуск без 6-хвилинного ліміту Google.
Частина 2. Отримання ключів Google Cloud (credentials.json)
Файл credentials.json потрібен для того, щоб Python-скрипт міг писати дані в Google Таблицю. Це робиться один раз.
Крок 1. Створення проекту в Google Cloud
- Перейди на console.cloud.google.com
- У верхньому лівому куті натисни на назву поточного проекту або кнопку Select a project → New Project
- Дай назву (наприклад, MyParser) і натисни Create
Крок 2. Увімкнення потрібних API
- Переконайся, що вибрано твій новий проект у верхній панелі
- Меню зліва → APIs & Services → Library
- Знайди та натисни Enable для: Google Sheets API
- Знайди та натисни Enable для: Google Drive API
Крок 3. Створення сервісного акаунта (Service Account)
- APIs & Services → Credentials
- + Create Credentials → Service Account
- Введи назву (наприклад, parser-bot) → Create and Continue
- У полі Role вибери Basic → Editor
- Натисни Done
Крок 4. Отримання JSON-файлу
- У списку Service Accounts натисни на щойно створену адресу (вигляд: parser-bot@project-id…)
- Вкладка Keys → Add Key → Create new key
- Тип: JSON → Create
- Файл автоматично завантажиться. Перейменуй його в credentials.json і поклади в папку зі скриптом
Крок 5. Надання доступу до таблиці (НАЙВАЖЛИВІШИЙ)
- Відкрий credentials.json у текстовому редакторі
- Знайди рядок “client_email”: “тут_адреса@…” і скопіюй цю адресу
- Відкрий свою Google Таблицю в браузері
- Натисни кнопку Поділитися (Share) у верхньому правому куті
- Встав скопійовану адресу, вибери роль Редактор → Надіслати
Порада: якщо з’явиться помилка SpreadsheetNotFound — переконайся, що значення змінної GOOGLE_SHEET_NAME у скрипті збігається з реальною назвою таблиці на 100%.
Частина 3. Код парсера (parser_script.py)
Налаштування на початку файлу
Перед запуском заміни три змінні під своій проект:
SITEMAP_URL = “https://www.mySite.com/post-sitemap.xml”
GOOGLE_SHEET_NAME = “особисттий сайт” #точна назва таблиці
JSON_KEY_FILE = “credentials.json”
Функція parse_article() — парсинг однієї статті
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
def parse_article(url): headers = {'User-Agent': 'Mozilla/5.0 ...'} response = requests.get(url, headers=headers, timeout=15) soup = BeautifulSoup(response.content, 'html.parser') # 1. Заголовок title_tag = soup.select_one('h1.entry-title') title = title_tag.get_text() if title_tag else "Без назви" title = html.unescape(title).strip() # 2. Категорія category = "Загальне" cat_link = soup.select_one('.category-links a') if cat_link: category = html.unescape(cat_link.get_text().strip()) # 3. Текст статті (перші 1200 символів) content_div = soup.select_one('.entry-content') full_text = "" if content_div: for trash in content_div.find_all(['script','style','ins','aside']): trash.decompose() full_text = " ".join(content_div.get_text().split()) return [url, title, category, full_text[:1200]] |
Функція update_gsheet() — запис у Google Sheets
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
def update_gsheet(data): scope = ["https://spreadsheets.google.com/feeds", "https://www.googleapis.com/auth/drive"] creds = ServiceAccountCredentials.from_json_keyfile_name( JSON_KEY_FILE, scope) client = gspread.authorize(creds) sheet = client.open(GOOGLE_SHEET_NAME).sheet1 sheet.clear() header = ["URL", "Назва", "Категорія", "Текст статті"] sheet.update('A1', [header] + data) |
Головна функція main()
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
def main(): # Отримуємо всі посилання з sitemap response = requests.get(SITEMAP_URL) soup = BeautifulSoup(response.content, 'xml') urls = [loc.text for loc in soup.find_all('loc')] # Парсимо кожну статтю all_data = [] for url in urls: article_data = parse_article(url) all_data.append(article_data) time.sleep(0.1) # пауза щоб не забанили # Записуємо все в Google Sheets update_gsheet(all_data) if __name__ == "__main__": main() |
Скрипт обходить увесь sitemap за один запуск і записує дані в таблицю: колонки URL, Назва, Категорія, Текст статті (перші 1200 символів). Пауза 0.1 секунди між запитами захищає від бану з боку сайту.