将Scrapy与经过身份验证(登录)的用户会话一起使用

在Scrapy docs中,有以下示例说明如何在Scrapy中使用经过身份验证的会话:

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正如他们在最后一行的评论中所说,你需要做什么?

回答:

在上面的代码中,FormRequest用于进行身份验证的将该after_login函数设置为其回调。这意味着该after_login函数将被调用并传递登录尝试得到的页面作为响应。

然后,通过在页面中搜索特定的字符串(在本例中为)来检查你是否成功登录"authentication failed"。如果找到,则spider结束。

现在,一旦spider走了那么远,它就知道它已经成功通过了身份验证,你就可以开始产生新的请求和/或抓取数据了。因此,在这种情况下:

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而不是手动执行。

以上是 将Scrapy与经过身份验证(登录)的用户会话一起使用 的全部内容, 来源链接: utcz.com/qa/424901.html

回到顶部