/ru-scrapy-python

В этом репозитории находится полезная информация, собранная участниками чата @scrapy_python

В этом репозитории находится полезная информация, собранная участниками чата.

С чего начать?

Как ограничить количество реквестов?

  • CLOSESPIDER_PAGECOUNT = 10

Как спарсить JS?

  • ставится Splash(удобно в Docker) и плагин scrapy_splash
  • смотреть откуда идут данные в Chrome -> devtools -> network -> XHR
  • JS to Python

Лучшие практики

  • Использовать css селекторы чтобы избежать пробелов в названии при использовании @class в xpath, альтернатива "contains(@class, 'someclass')" выглядит сложнее.
  • Использовать xpath для поиска сложных значений, например в таблицах
  • Использовать inline-requests для синхронных запросов в функции
  • Посмотреть мобильную версию

Популярные css селекторы

  • Достать href тега a: "a::attr(href)"
  • Достать текст ноды: "title::text"
  • Аналог contains у xpath, "a[href*=image] img::attr(src)"
  • Можно добавить xpath ".css('img').xpath('@src')"

Нельзя мешать yield и return?

После return жизни нет. Нужно возвращать список или что-то итерируемое.

Как вытащить узел по тексту внутри него используя css-селектор

Через CSS - никак. Использовать xpath contains. Документация по xpath.

Как поставить на windows

Простой способ - поставить в anaconda

Как достать items из последного job-а в scrapinghub?

https://app.scrapinghub.com/api/items.json?project=PROJECT&spider=SPIDERNAME&apikey=KEY там где SPIDERNAME нужно вставить именно название, а не номер паука. дополнительно можно почитать тут

Как спарсить данные из нескольких форм с POST-запросами

Использовать цикл по форме c FormRequest.from_response, дополнительное поле со счетчиком формы formnumber=counter и с фильтром dont_filter=True.

Как обойти Cloudflare?

Страница отдает 503 ошибку. На этой странице javascript собирает код в форму с рандомным урлом и тремя hidden полями. После отправки этой формы отдается 302 редирект на нужную страницу.

Где найти дефолтные настройки Scrapy?

default_settings.py в офф.репо

Как проанализировать запрос/форму?

Chrome -> devtools -> network -> клик на страницу -> copy as curl. Далее гуглим "curl to python", вставляем код и получаем распаршенный код в библиотеке requests

Чем проанализировать пакеты сети или воспроизвести запрос/форму?

Fiddler или postman(он умеет сразу в питонкод конвертить). Мощнее и сложнее wireshark.