如何登录几乎所有网站

有关Java Web抓取的第一篇文章中,我展示了如何从CraigList网站提取数据。
但是您想要的数据又或者您要在网站上执行的操作是否需要身份验证呢?

在这个简短的教程中,我将向您展示如何制作可以处理大多数身份验证表单的通用方法。

认证机制

身份验证机制有很多,最常见的是登录表单,有时还会使用CSRF令牌作为隐藏输入。

要使用刮板自动登录到网站,您的想法是:

  • GET /登录页面

  • 选择第一个<input type="password">标记

  • 选择第一个<input>之前未被隐藏的

  • 设置两个输入的value属性

  • 选择随附的表格,然后提交。

黑客新闻认证

假设您要创建一个登录黑客新闻的机器人(提交链接或执行需要经过身份验证的操作):

这是登录表单和关联的DOM:

现在我们可以实现登录算法

    public static WebClient autoLogin ( String loginUrl , String login , String password ) throws FailingHttpStatusCodeException , MalformedURLException , IOException {
        WebClient client = new WebClient ();
        client . getOptions (). setCssEnabled ( false );
        client . getOptions (). setJavaScriptEnabled ( false );

        HtmlPage page = client . getPage ( loginUrl );

        HtmlInput inputPassword = page . getFirstByXPath ( "//input[@type='password']" );
        //The first preceding input that is not hidden
        HtmlInput inputLogin = inputPassword . getFirstByXPath ( ".//preceding::input[not(@type='hidden')]" );

        inputLogin . setValueAttribute ( login );
        inputPassword . setValueAttribute ( password );

        //get the enclosing form
        HtmlForm loginForm = inputPassword . getEnclosingForm () ;

        //submit the form
        page = client . getPage ( loginForm . getWebRequest ( null ));

        //returns the cookie filled client :)
        return client ;
    }

然后是主要方法,即:

  • 使用正确的参数调用autoLogin

  • 前往https://news.ycombinator.com

  • 检查注销链接是否存在以验证我们已登录

  • 将cookie打印到控制台

    public static void main ( String [] args ) {

        String baseUrl = "https://news.ycombinator.com" ;
        String loginUrl = baseUrl + "/login?goto=news" ; 
        String login = "login" ;
        String password = "password" ;

        try {
            System . out . println ( "Starting autoLogin on " + loginUrl );
            WebClient client = autoLogin ( loginUrl , login , password );
            HtmlPage page = client . getPage ( baseUrl ) ;

            HtmlAnchor logoutLink = page . getFirstByXPath ( String . format ( "//a[@href='user?id=%s']" , login )) ;
            if ( logoutLink != null ){
                System . out . println ( "Successfuly logged in !" );
                // printing the cookies
                for ( Cookie cookie : client . getCookieManager (). getCookies ()){
                    System . out . println ( cookie . toString ());
                }
            } else {
                System . err . println ( "Wrong credentials" );
            }

        } catch ( Exception e ) {
            e . printStackTrace ();
        }
    }

您可以在此Github存储库中找到代码

走得更远

在许多情况下,此方法将不起作用:Amazon,DropBox ...以及所有其他受两步/验证码保护的登录表单。

可以通过以下代码改进的事情:

  • 处理autoLogin内部的注销链接autoLogin

  • 检查null输入/表单并抛出适当的异常

在下一篇文章中,我将向您展示如何使用OCR和验证码破解API处理验证码或虚拟数字键盘!

如果您喜欢网页抓取并厌倦了代理,JS渲染和验证码的处理,则可以查看我们新的网页抓取API ,其中有前1000个API调用。

From: https://dev.to/scrapingbee/how-to-log-in-to-almost-any-websites-7dn

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值