Korzystanie z sesji użytkownika uwierzytelnionego (zalogowanego)

W Docs Scrappy , znajduje się następujący przykład, aby zilustrować, jak używać uwierzytelnionej sesji w Scrappy:

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...
Mam to działa i jest w porządku. Ale moje pytanie brzmi : co musisz zrobić, aby continue scraping with authenticated session, Jak mówią w komentarzu ostatniej linijki?
Author: bcattle, 2011-05-01

1 answers

W powyższym kodzie, FormRequest, który jest używany do uwierzytelniania, ma ustawioną funkcję after_login jako wywołanie zwrotne. Oznacza to, że funkcja after_login zostanie wywołana i przekazana stronie, którą próba logowania otrzymała jako odpowiedź.

Następnie sprawdza, czy jesteś zalogowany, przeszukując stronę pod kątem określonego ciągu znaków, w tym przypadku "authentication failed". Jeśli go znajdzie, pająk się skończy.

Kiedy pająk zajdzie tak daleko, wie, że udało mu się uwierzytelnić, możesz też zacząć generować nowe żądania i / lub zeskrobywać dane. Tak więc w tym przypadku:
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.

Jeśli spojrzysz proszę., jest przykład pająka, który uwierzytelnia się przed skrobaniem.

W tym przypadku obsługuje rzeczy w funkcji parse (domyślne wywołanie zwrotne dowolnego żądania).

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)

Tak więc, za każdym razem, gdy zostanie złożone żądanie, odpowiedź jest sprawdzana pod kątem obecności formularza logowania. Jeśli tam jest, to wiemy, że potrzebujemy aby się zalogować, więc wywołujemy odpowiednią funkcję, jeśli nie jest obecna, nazywamy funkcję, która jest odpowiedzialna za skrobanie danych z odpowiedzi.

Mam nadzieję, że to jasne, nie krępuj się zapytać, jeśli masz inne pytania!


Edit:

Ok, więc chcesz zrobić coś więcej niż tylko zrobienie jednego żądania i zeskrobanie go. Chcesz śledzić linki.

Aby to zrobić, wystarczy zeskrobać odpowiednie linki ze strony i odradzać żądania za pomocą tych URL. Na przykład:

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)

Jak widać, generuje nowe żądanie dla każdego adresu url na stronie, a każde z tych żądań wywoła tę samą funkcję wraz z odpowiedzią, więc mamy rekursywne skrobanie.

To, co napisałem powyżej, to tylko przykład. Jeśli chcesz "indeksować" strony, powinieneś zajrzeć do CrawlSpiderS zamiast robić rzeczy ręcznie.

 51
Author: Acorn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-03 18:21:23