Parser запускается, но ничего не происходит: данные не записываются в CSV, сообщения об ошибках не принимаются - PullRequest
0 голосов
/ 13 февраля 2020

Нужен для разбора fragrantica. В сети нашел следующий python скрипт. Когда я запускаю скрипт - ничего не происходит и csv файл не создается. Но все равно ошибок нет.

Может кто-нибудь сказать, что не так со скриптом и куда копаться, чтобы его исправить? (неправильные библиотеки, изменение структуры сайта и т. д. c)

PS. запуск скрипта из простоя.

`import csv
import logging
from lxml import html
import re
import requests
import urllib.parse

ROOT_URL = 'https://www.fragrantica.com'
HEADERS = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:45.0) Gecko/20100101 Firefox/45.0'}
RE_NAMESPACE = {'re': "http://exslt.org/regular-expressions"}


def get_list_groups():
    url = urllib.parse.urljoin(ROOT_URL, 'groups/')
    r = requests.get(url, headers=HEADERS)
    tree = html.fromstring(r.content)
    return [gr.get('href') for gr in tree.xpath('//span/a[re:test(@href, "^/groups.*.html$")]',
                                                namespaces=RE_NAMESPACE)]


def get_list_fragrances_by_group(group_path):
    url = urllib.parse.urljoin(ROOT_URL, group_path)
    r = requests.get(url, headers=HEADERS)
    tree = html.fromstring(r.content)
    return [fr.get('href') for fr in tree.xpath('//a[re:test(@href, "^/perfume.*.html$")]',
                                                namespaces=RE_NAMESPACE)]


def get_fragrance_data(fragrance_path):
    url = urllib.parse.urljoin(ROOT_URL, fragrance_path)
    r = requests.get(url, headers=HEADERS)
    tree = html.fromstring(r.content)
    fragrance = {}
    try:
        designer = tree.xpath('//div[@class="subTtl"]/a/text()', namespaces=RE_NAMESPACE)[0]
        match = re.match(r"(?P<title>.*?) %s( for (?P<gender>.*?))?$" % designer,
                         tree.xpath('//h1/span[@itemprop="name"]/text()')[0])
        if match:
            fragrance = match.groupdict()
        fragrance['designer'] = designer
        fragrance['pic'] = tree.xpath('//div[@id="mainpicbox"]/img/@src')[0]
        fragrance['noses'] = tree.xpath('//a[re:test(@href, "^.*/noses.*.html$")]/b/text()', namespaces=RE_NAMESPACE)
        fragrance['description'] = tree.xpath('//div[@itemprop="description"]')[0].text_content().strip()
        match = re.match(r".* launched in (?P<year>.*?)\.", fragrance['description'])
        fragrance['year'] = match.group('year') if match else ''
        for note in tree.xpath('//*[re:test(., "^(Fragrance|Top|Middle|Base) Notes$")]', namespaces=RE_NAMESPACE):
            fragrance[note.text_content()] = note.xpath(
                '../span[@class="rtgNote"]/img/@alt|../*/span[@class="rtgNote"]/img/@alt')
    except IndexError:
        logging.warning(fragrance_path)
    return fragrance


def group_import_csv(group_path):
    keys = (['title', 'description', 'gender', 'designer', 'pic', 'noses', 'year', 'Fragrance Notes', 'Top Notes',
             'Middle Notes',
             'Base Notes'])
    with open(group_path.split('/')[-1].split('.')[0] + '.csv', 'w') as f:
        w = csv.DictWriter(f, keys)
        w.writeheader()
        for fr in get_list_fragrances_by_group(group_path):
            w.writerow(get_fragrance_data(fr))


list_groups = get_list_groups()
for group in list_groups:
    group_import_csv(group)`
...