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