Очистка веб-страниц Java (Серия из 7 частей)
В этой статье я собираюсь показать, как загружать счета (или любой другой файл) с веб-сайта с помощью HtmlUnit.
Я предлагаю вам сначала прочитать эти статьи: Введение в веб-очистку с помощью Java и Аутологин
Поскольку я веду этот блог на Digital Ocean (10 долларов в кредит, если вы зарегистрируетесь по этой ссылке), я покажу, как написать бота для автоматической загрузки всех ваших счетов.
Авторизоваться
Чтобы отправить форму входа без необходимости проверять dom, мы будем использовать волшебный метод, о котором я писал в предыдущей статье.
Затем мы должны перейти на страницу счета: Затем мы должны перейти на страницу счета:
String baseUrl = "https://cloud.digitalocean.com";
String login = "email";
String password = "password" ;
try {
WebClient client = Authenticator.autoLogin(baseUrl + "/login", login, password);
HtmlPage page = client.getPage("https://cloud.digitalocean.com/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();
}
Приносил счета
Давайте создадим новый класс под названием Счет или счет-фактура для представления счета:
Давайте создадим новый класс под названием Счет или счет-фактура для представления счета:
public class Bill {
private String label ;
private BigDecimal amount ;
private Date date;
private String url ;
//... getters & setters
}
Теперь нам нужно проверить dom, чтобы узнать, как мы можем извлечь описание, сумму, дату и URL-адрес каждого счета. Откройте свой любимый инструмент:
Нам здесь повезло, это чистый ДОМ, с красивым и хорошо структурированным столом. Поскольку HtmlUnit имеет множество методов для обработки HTML-таблиц, мы будем использовать эти:
Html-таблицадля хранения таблицы и повторения по каждой строкеполучить ячейкудля выбора ячеек
Затем, используя библиотеку Джексона, мы экспортируем объекты счета в JSON и распечатаем их.
HtmlTable billsTable = (HtmlTable) page.getFirstByXPath("//table[@class='listing Billing--history']");
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);
Все почти закончено, осталось загрузить счет-фактуру. Это довольно просто, мы будем использовать объект Страница для хранения pdf-файла и вызовем getContentAsStream на нем. При этом лучше проверить, имеет ли файл правильный тип содержимого ( приложение/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"}
Как обычно, вы можете найти полный код на этом Репозиторий Github
Если вам нравится очистка веб-страниц и вы устали заботиться о прокси, рендеринге JS и капчах, вы можете проверить наш новый API очистки веб-страниц , первые 1000 вызовов API на нас.
Очистка веб-страниц Java (Серия из 7 частей)
Оригинал: “https://dev.to/scrapingbee/an-automatic-bill-downloader-in-java-4277”