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

2024-03-13

In the Scrapy 文档 https://doc.scrapy.org/en/latest/topics/request-response.html#using-formrequest-from-response-to-simulate-a-user-login,有以下示例来说明如何在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"。如果找到了,蜘蛛就结束了。

现在,一旦蜘蛛已经走到这一步,它就知道它已经成功通过身份验证,并且您可以开始生成新请求和/或抓取数据。所以,在这种情况下:

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.

如果你看here https://web.archive.org/web/20110517140553/http://dev.scrapy.org/wiki/CommunitySpiders#SilverStripeCMSdemospiderwithloginhandling,有一个蜘蛛在抓取之前进行身份验证的示例。

在这种情况下,它处理的事情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)

因此,每当发出请求时,都会检查响应中是否存在登录表单。如果存在,那么我们知道我们需要登录,因此我们调用相关函数,如果不存在,我们调用负责从响应中抓取数据的函数。

我希望这已经很清楚了,如果您还有其他问题,请随时询问!


Edit:

好的,您想要做的不仅仅是生成一个请求并抓取它。您想要关注链接。

为此,您所需要做的就是从页面中抓取相关链接,并使用这些 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 http://doc.scrapy.org/en/latest/topics/spiders.html#crawlspider而不是手动做事。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐