java读取银联账单_Java中的⾃动账单下载器
java读取银联账单
在本⽂中,我将展⽰如何使⽤HtmlUnit从⽹站下载账单(或其他⽂件)。
我建议您先阅读这些⽂章: 和
由于我在上托管了此博客(如果您通过此链接注册,可节省10美元的信⽤),因此我将展⽰如何编写⼀个⾃动下载每张账单的机器⼈。
登录
要提交登录表单⽽不需要检查dom,我们将使⽤我在上⼀篇⽂章中编写的魔术⽅法。
然后,我们必须转到帐单页⾯: cloud.digitalocean/settings/billing : cloud.digitalocean/settings/billing
String baseUrl = "cloud.digitalocean" ;
String login = "email" ;
String password = "password" ;
try {
WebClient client = Authenticator . autoLogin ( baseUrl + "/login" , login , password );
HtmlPage page = client . getPage ( "cloud.digitalocean/settings/billing" );
if ( page . asText (). contains ( "You need to sign in for access to this page" )){
throw new Exception ( String . format ( "Error during login on %s , check your credentials" , baseUrl ));
}
} catch ( Exception e ) {
e . printStackTrace ();
}
取账单
让我们创建⼀个称为Bill或Invoice的新类来表⽰票据:
⽐尔
public class Bill {
private String label ;
private BigDecimal amount ;
private Date date ;
private String url ;
//... getters & setters
}
现在我们需要检查dom,以了解如何提取每个账单的描述,⾦额,⽇期和URL。 打开您喜欢的⼯具:
我们在这⾥很幸运,它是⼀个⼲净的DOM,具有漂亮且结构良好的表。 由于HtmlUnit有许多处理HTML表的⽅法,因此我们将使⽤以下⽅法:
HtmlTable存储表并在每⾏上进⾏迭代
getCell选择单元格
然后,使⽤Jackson库将Bill对象导出到JSON并进⾏打印。
HtmlTable billsTable = ( HtmlTable ) page . getFirstByXPath ( "//table[@class='listing Billing--history']" );
html如何下载for ( HtmlTableRow row : billsTable . getBodies (). get ( 0 ). getRows ()){
String label = row . getCell ( 1 ). asText ();
// We only want the invoice row, not the payment one
if (! label . contains ( "Invoice" )){
continue ;
}
Date date = new SimpleDateFormat ( "MMMM d, yyyy" , Locale . ENGLISH ). parse ( row . getCell ( 0 ). asText ());
BigDecimal amount = new BigDecimal ( row . getCell ( 2 ). asText (). replace ( "$" , "" ));
String url = (( HtmlAnchor ) row . getCell ( 3 ). getFirstChild ()). getHrefAttribute ();
Bill bill = new Bill ( label , amount , date , url );
bills . add ( bill );
ObjectMapper mapper = new ObjectMapper ();
String jsonString = mapper . writeValueAsString ( bill ) ;
System . out . println ( jsonString );
快要完成了,最后⼀件事是下载发票。 这很简单,我们将使⽤Page对象存储pdf,并在其上调⽤getContentAsStream 。 最好在执⾏此操作时检查⽂件是否具有正确的内容类型(本例中为application/pdf )
Page invoicePdf = client . getPage ( baseUrl + url );
if ( invoicePdf . getWebResponse (). getContentType (). equals ( "application/pdf" )){
IOUtils . copy ( invoicePdf . getWebResponse (). getContentAsStream (), new FileOutputStream ( "DigitalOcean" + label + ".pdf" ));
}
就是这样,这⾥是输出:
{ "label" : "Invoice for December 2015" , "amount" : 0.35 , "date" : 1451602800000 , "url" : "/billing/XXXXX.pdf" }
{ "label" : "Invoice for November 2015" , "amount" : 6.00 , "date" : 1448924400000 , "url" : "/billing/XXXX.pdf" }
{ "label" : "Invoice for October 2015" , "amount" : 3.05 , "date" : 1446332400000 , "url" : "/billing/XXXXX.pdf" }
{ "label" : "Invoice for April 2015" , "amount" : 1.87 , "date" : 1430431200000 , "url" : "/billing/XXXXX.pdf" }
{ "label" : "Invoice for March 2015" , "amount" : 5.00 , "date" : 1427839200000 , "url" : "/billing/XXXXX.pdf" }
{ "label" : "Invoice for February 2015" , "amount" : 5.00 , "date" : 1425164400000 , "url" : "/billing/XXXXX.pdf" }
{ "label" : "Invoice for January 2015" , "amount" : 1.30 , "date" : 1422745200000 , "url" : "/billing/XXXXXX.pdf" }
{ "label" : "Invoice for October 2014" , "amount" : 3.85 , "date" : 1414796400000 , "url" : "/billing/XXXXXX.pdf" }
和往常⼀样,您可以在此上到完整的代码
如果您喜欢⽹页抓取,并且厌倦了代理,JS渲染和验证码的处理,则可以查看我们新的 ,其中有前1000个API调⽤。
翻译⾃:
java读取银联账单
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论