В приведенном выше коде для 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
, а не делать это вручную.