在上面的代码中,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而不是手动执行操作。