Использование Scrapy с авторизованным (авторизованным) сеансом пользователя - PullRequest
55 голосов
/ 01 мая 2011

В документах Scrapy приведен следующий пример, иллюстрирующий использование аутентифицированного сеанса в Scrapy:

class LoginSpider(BaseSpider):
    name = 'example.com'
    start_urls = ['http://www.example.com/users/login.php']

    def parse(self, response):
        return [FormRequest.from_response(response,
                    formdata={'username': 'john', 'password': 'secret'},
                    callback=self.after_login)]

    def after_login(self, response):
        # check login succeed before going on
        if "authentication failed" in response.body:
            self.log("Login failed", level=log.ERROR)
            return

        # continue scraping with authenticated session...

У меня это работает, и это нормально. Но мой вопрос : что вы должны сделать с continue scraping with authenticated session, как говорится в комментарии к последней строке?

1 Ответ

65 голосов
/ 01 мая 2011

В приведенном выше коде для FormRequest, который используется для аутентификации, установлена ​​функция after_login в качестве обратного вызова.Это означает, что функция after_login будет вызвана и передана страница, полученная попыткой входа в качестве ответа.

Затем выполняется проверка успешного входа в систему путем поиска на странице определенной строки, вэтот случай "authentication failed".Если он находит его, паук заканчивается.

Теперь, когда паук прошел этот путь, он знает, что он успешно прошел аутентификацию, и вы можете начать создавать новые запросы и / или очищать данные.Итак, в этом случае:

from scrapy.selector import HtmlXPathSelector
from scrapy.http import Request

# ...

def after_login(self, response):
    # check login succeed before going on
    if "authentication failed" in response.body:
        self.log("Login failed", level=log.ERROR)
        return
    # We've successfully authenticated, let's have some fun!
    else:
        return Request(url="http://www.example.com/tastypage/",
               callback=self.parse_tastypage)

def parse_tastypage(self, response):
    hxs = HtmlXPathSelector(response)
    yum = hxs.select('//img')

    # etc.

Если вы посмотрите здесь , есть пример паука, который проверяет подлинность перед очисткой.

В этом случае он обрабатывает вещи в функции parse (обратный вызов по умолчанию для любого запроса).

def parse(self, response):
    hxs = HtmlXPathSelector(response)
    if hxs.select("//form[@id='UsernameLoginForm_LoginForm']"):
        return self.login(response)
    else:
        return self.get_section_links(response)

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

Я надеюсь, что этоясно, не стесняйтесь спрашивать, если у вас есть какие-либо вопросы!


Редактировать:

Хорошо, так что вы хотите сделать больше, чем просто создать одинзапрос и очистить его.Вы хотите переходить по ссылкам.

Чтобы сделать это, все, что вам нужно сделать, это очистить соответствующие ссылки со страницы и создать запросы с использованием этих URL-адресов.Например:

def parse_page(self, response):
    """ Scrape useful stuff from page, and spawn new requests

    """
    hxs = HtmlXPathSelector(response)
    images = hxs.select('//img')
    # .. do something with them
    links = hxs.select('//a/@href')

    # Yield a new request for each link we found
    for link in links:
        yield Request(url=link, callback=self.parse_page)

Как видите, он порождает новый запрос для каждого URL-адреса на странице, и каждый из этих запросов будет вызывать эту же функцию со своим ответом, поэтому у нас есть рекурсивный анализпродолжается.

То, что я написал выше, является лишь примером.Если вы хотите "сканировать" страницы, вам нужно смотреть CrawlSpider, а не делать это вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...