在有关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