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

Вход на сайт
Чтобы войти на сайт, вам придется ввести собственный идентификатор пользователя (чаще – адрес электронной почты) и установленный пароль. И если ранее, для обхода использовали POST-запросы или заранее сохраненные cookie, то Scrapy решает эту проблему без участия человека. Для этого разработан FormRequest, позволяющий ответить на вопрос «Как смотреть закрытый контент на сайтах?». 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 сайта автоматически, что позволяет избежать блокировки при подозрительной активности, а также исключает необходимость в аутентификации пользователя при переходе на следующую страницу.