Рубрики
Без рубрики

Автоматический загрузчик счетов на Java

В этой статье я собираюсь показать, как загружать счета (или любой другой файл) из… Помеченный java, очистка веб-страниц.

Очистка веб-страниц 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”