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? 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.
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 CrawlSpider
S zamiast robić rzeczy ręcznie.
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