Scrapy несколько регулярных выражений в LinkExtractor, похоже, не работают - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть регулярные выражения в файле JSON.Этот файл загружается как конфигурация для моего паука.Паук создает один LinkExtractor с правилами регулярных выражений allow и deny.Я хотел бы:

  • сканировать и очищать страницы продукта (очистка / анализ НЕ работает)
  • сканировать страницы категорий
  • избегать общих страниц (о нас,конфиденциальность и т. д.)

В некоторых магазинах все работает хорошо, но не в других, и я считаю, что это проблема моих регулярных выражений.

"rules": [
    {
        "deny": ["\\/(customer\\+service|ways\\+to\\+save|sponsorship|order|cart|company|specials|checkout|integration|blog|brand|account|sitemap|prefn1=)\\/"],
        "follow": false
    },
    {
        "allow": ["com\\/store\\/details\\/"],
        "follow": true,
        "use_content": true
    },
    {
        "allow": ["com\\/store\\/browse\\/"],
        "follow": true
    }
],

Шаблоны URL:

Продукты:
https://www.example.com/store/details/Nike+SB-Portmore-II-Solar-Canvas-Mens https://www.example.com/store/details/Coleman+Renegade-Mens-Hiking https://www.example.com/store/details/Mueller+ATF3-Ankle-Brace https://www.example.com/store/details/Planet%20Fitness+18 https://www.example.com/store/details/Lifeline+Pro-Grip-Ring https://www.example.com/store/details/Nike+Phantom-Vision

Категории:
https://www.example.com/store/browse/footwear/
https://www.example.com/store/browse/apparel/
https://www.example.com/store/browse/fitness/

Запретить:
https://www.example.com/store/customer+service/Online+Customer+Service https://www.example.com/store/checkout/ https://www.example.com/store/ways+to+save/ https://www.example.com/store/specials https://www.example.com/store/company/Privacy+Policy https://www.example.com/store/company/Terms+of+Service

Загрузка правил изJSON внутри моего паука __init__

for rule in self.MY_SETTINGS["rules"]:
    allow_r = ()
    if "allow" in rule.keys():
        allow_r = [a for a in rule["allow"]]

    deny_r = ()
    if "deny" in rule.keys():
        deny_r = [d for d in rule["deny"]]

    restrict_xpaths_r = ()
    if "restrict_xpaths" in rule.keys():
        restrict_xpaths_r = [rx for rx in rule["restrict_xpaths"]]

    Sportygenspider.rules.append(Rule(
        LinkExtractor(
            allow=allow_r,
            deny=deny_r,
            restrict_xpaths=restrict_xpaths_r,
        ),
        follow=rule["follow"],
        callback='parse_item' if ("use_content" in rule.keys()) else None
    ))

Если я сделаю pprint(vars(onerule.link_extractor)), я смогу правильно увидеть регулярное выражение Python:

'deny_res': [re.compile('\\/(customer\\+service|sponsorship|order|cart|company|specials|checkout|integration|blog|account|sitemap|prefn1=)\\/')]

{'allow_domains': set(),
 'allow_res': [re.compile('com\\/store\\/details\\/')],

{'allow_domains': set(),
 'allow_res': [re.compile('com\\/store\\/browse\\/')],

Проверка регулярного выражения в https://regex101.com/Кажется, все в порядке (несмотря на то, что я использую \\/ в моем файле JSON и \/ в regex101.com)

В моем лог-файле паука, я вижу, чтостраницы продукта сканируются, но не анализируются:

2019-02-01 08:25:33 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.example.com/store/details/FILA+Hometown-Mens-Lifestyle-Shoes/5345120230028/_/A-6323521;> (referer: https://www.example.com/store/browse/footwear)  
2019-02-01 08:25:47 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.example.com/store/details/FILA+D-Formation-Mens-Lifestyle-Shoes/5345120230027/_/A-6323323> (ref

Почему паук не анализирует страницы продукта?(один и тот же код, разные JSON работают в разных магазинах)

1 Ответ

0 голосов
/ 02 февраля 2019

После нескольких часов отладки и тестирования я решил, что мне нужно изменить порядок правил.

  1. Продукты, которые нужно очистить правило
  2. Отрицать нас и т. Д.
  3. Категории для подражания

Теперь это работает.

"rules": [
    {
        "allow": ["com\\/store\\/details\\/"],
        "follow": true,
        "use_content": true
    },
    {
        "deny": ["\\/(customer\\+service|ways\\+to\\+save|sponsorship|order|cart|company|specials|checkout|integration|blog|brand|account|sitemap|prefn1=)\\/"],
        "follow": false
    },
    {
        "allow": ["com\\/store\\/browse\\/"],
        "follow": true
    }
],
...