在authentication(login)用户会话中使用Scrapy

在Scrapy文档中 ,有以下示例来说明如何在Scrapy中使用经过身份validation的会话:

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

在上面的代码中,用于validation的after_loginafter_login函数设置为其callback函数。 这意味着after_login函数将被调用,并通过login尝试得到的页面作为响应。

然后通过在页面中search特定的string来检查您是否成功login,在这种情况下, "authentication failed" 。 如果发现它,蜘蛛结束。

现在,一旦蜘蛛得到这么多,它知道它已经成功validation,你可以开始产生新的请求和/或抓取数据。 所以,在这种情况下:

 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. 

如果你看这里 ,有一个蜘蛛的例子,之前authentication刮。

在这种情况下,它处理parse函数中的东西(任何请求的默认callback)。

 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) 

因此,无论何时发出请求,都会检查响应是否存在login表单。 如果在那里,那么我们知道我们需要login,所以我们调用相关的函数,如果不存在,我们调用负责从响应中获取数据的函数。

我希望这是明确的,随时问如果你有任何其他问题!


编辑:

好的,所以你想要做的不仅仅是产生一个单一的请求,并刮擦它。 你想跟随链接。

要做到这一点,你所需要做的只是从页面上刮掉相关的链接,并使用这些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产生了一个新的请求,并且每个请求都会在响应中调用这个相同的函数,所以我们有一些recursion的挖掘。

我上面写的只是一个例子。 如果你想“抓取”页面,你应该看看CrawlSpider的,而不是手动做的事情。