Одним из самых эффективных методов защиты от «заимствования» контента является отображение информации только зарегистрированным пользователям. Тем не менее, разработчикам парсеров удалось обойти и это ограничение, представив ряд скриптов, имитирующих поведение реального пользователя на сайте. Одним из них и является Scrapy – частица кода, способная «обмануть» выстроенный щит и получать нужную информацию без дополнительных «телодвижений». Тем не менее, этот способ считается не совсем этичным, т.к. парсить «закрытые» сайты – признак плохого тона.

Вход на сайт
Чтобы войти на сайт, вам придется ввести собственный идентификатор пользователя (чаще – адрес электронной почты) и установленный пароль. И если ранее, для обхода использовали POST-запросы или заранее сохраненные cookie, то Scrapy решает эту проблему без участия человека. Для этого разработан FormRequest, имитирующий вход пользователя по учетным данным, указанным в скрипте:
def parse(self, response):
return scrapy.FormRequest.from_response(
response,
formdata={‘username’: ‘randomuser’, ‘password’: ‘topsecret’},
callback=self.after_login
)
Если все параметры настроены верно, парсер получит доступ к информации, содержащейся на сайте. Чтобы убедиться в отсутствии ошибки, запустите обычный поиск по фразам и попробуйте поискать что-то типа «error» или «failed»:
def after_login(self, response):
if «Error while logging in» in response.body:
self.logger.error(«Login failed!»)
else:
self.logger.error(«Login succeeded!»)
item = SampleItem()
item[«quote»] = response.css(«.text»).extract()
item[«author»] = response.css(«.author»).extract()
return item
А чтобы перейти на страницу с нужной информацией, достаточно ввести запрос:
scrapy.Request(url=»http://scrape.this.com», callback=self.parse_something)
Что делать после входа?
Повысить эффективность поиска можно посредством использования пагинации на сайтах, где есть кнопка «Следующая страница»:
next_page_url = response.css(«li.next > a::attr(href)»).extract_first()
if next_page_url is not None:
yield scrapy.Request(response.urljoin(next_page_url))
При этом стоит отметить, что Scrapy сохраняет cookies сайта автоматически, что позволяет избежать блокировки при подозрительной активности, а также исключает необходимость в аутентификации пользователя при переходе на следующую страницу.