package com.javarush.test.level28.lesson15.big01.model; import com.javarush.test.level28.lesson15.big01.vo.Vacancy; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import java.io.IOException; import java.util.ArrayList; import java.util.List; /** * Created by promoscow on 30.03.17. */ public class HHStrategy implements Strategy { private static final String URL_FORMAT = "http://hh.ua/search/vacancy?text=java+%s&page=%d"; private static final String USER_AGENT = "Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6"; private static final String REFERRER = "none"; @Override public List<Vacancy> getVacancies(String searchString) { ArrayList<Vacancy> vacancies = new ArrayList<>(); try { for (int i = 0; true; i++) { Document document = getDocument(searchString, i); List<Element> list = document.getElementsByAttributeValue("data-qa", "vacancy-serp__vacancy"); if (list.isEmpty()) break; for (Element element : list) { Vacancy vacancy = new Vacancy(); vacancy.setTitle(element.getElementsByAttributeValue ("data-qa", "vacancy-serp__vacancy-title").text()); vacancy.setCompanyName(element.getElementsByAttributeValue ("data-qa", "vacancy-serp__vacancy-employer").text()); vacancy.setCity(element.getElementsByAttributeValue ("data-qa", "vacancy-serp__vacancy-address").text()); if (element.getElementsByAttributeValue ("data-qa", "vacancy-serp__vacancy-compensation").text() != null) { vacancy.setSalary(element.getElementsByAttributeValue ("data-qa", "vacancy-serp__vacancy-compensation").text()); } else vacancy.setSalary(""); vacancy.setUrl(element.getElementsByAttributeValue ("data-qa", "vacancy-serp__vacancy-title").attr("href")); vacancy.setSiteName(document.title()); vacancies.add(vacancy); // System.out.println(vacancy); // System.out.println(); } } } catch (IOException e) { e.printStackTrace(); } return vacancies; } protected Document getDocument(String searchString, int page) throws IOException { return Jsoup.connect(String.format(URL_FORMAT, searchString, page)).userAgent(USER_AGENT).referrer(REFERRER).get(); } }
package com.javarush.test.level28.lesson15.big01.model; import com.javarush.test.level28.lesson15.big01.view.View; import com.javarush.test.level28.lesson15.big01.vo.Vacancy; import java.util.ArrayList; import java.util.List; /** * Created by promoscow on 03.04.17. */ public class Model { private View view; private Provider[] providers; public Model(View view, Provider... providers) { if (view == null || providers == null || providers.length == 0) throw new IllegalArgumentException(); this.view = view; this.providers = providers; } public void selectCity(String city) { List<Vacancy> list = new ArrayList<>(); for (Provider provider : providers) { list.addAll(provider.getJavaVacancies(city)); } view.update(list); } }
package com.javarush.test.level28.lesson15.big01.model; import com.javarush.test.level28.lesson15.big01.vo.Vacancy; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.IOException; import java.util.ArrayList; import java.util.List; /** * Created by promoscow on 05.04.17. */ public class MoikrugStrategy implements Strategy { private static final String URL_FORMAT = "https://moikrug.ru/vacancies?page=%d&q=java+%s"; private static final String USER_AGENT = "Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6"; private static final String REFERRER = "none"; @Override public List<Vacancy> getVacancies(String searchString) { List<Vacancy> vacancies = new ArrayList<>(); try { for (int i = 0; true; i++) { Document document = getDocument(searchString, i); List<Element> list = document.getElementsByAttributeValue("class", "job "); List<Element> listMarket = document.getElementsByAttributeValue("class", "job marked"); if (list.isEmpty() && listMarket.isEmpty()) break; for (Element element : list) { Vacancy vacancy = new Vacancy(); vacancy.setTitle(element.getElementsByAttributeValue("class", "title").text()); Elements salary = element.getElementsByAttributeValue("class", "salary"); vacancy.setSalary(salary.text()); Elements city = element.getElementsByAttributeValue("class", "location"); vacancy.setCity(city.text()); vacancy.setCompanyName(element.getElementsByAttributeValue("class", "company_name").text()); vacancy.setSiteName(document.title()); Elements s = element.getElementsByAttributeValue("class", "title"); Elements tag = s.select("*"); vacancy.setUrl("https://moikrug.ru" + tag.attr("href")); vacancies.add(vacancy); } for (Element element : listMarket) { Vacancy vacancy = new Vacancy(); vacancy.setTitle(element.getElementsByAttributeValue("class", "title").text()); Elements salary = element.getElementsByAttributeValue("class", "salary"); vacancy.setSalary(salary.text()); Elements city = element.getElementsByAttributeValue("class", "location"); vacancy.setCity(city.text()); vacancy.setCompanyName(element.getElementsByAttributeValue("class", "company_name").text()); vacancy.setSiteName(document.title()); Elements s = element.getElementsByAttributeValue("class", "title"); Elements tag = s.select("*"); vacancy.setUrl("https://moikrug.ru" + tag.attr("href")); vacancies.add(vacancy); } } } catch (IOException e) { } return vacancies; } protected Document getDocument(String searchString, int page) throws IOException { return Jsoup.connect(String.format(URL_FORMAT, page, searchString)).userAgent(USER_AGENT).referrer(REFERRER).get(); } }
package com.javarush.test.level28.lesson15.big01.model; import com.javarush.test.level28.lesson15.big01.vo.Vacancy; import java.util.List; /** * Created by promoscow on 23.02.17. */ public class Provider { private Strategy strategy; public Provider(Strategy strategy) { this.strategy = strategy; } public Provider() { } public void setStrategy(Strategy strategy) { this.strategy = strategy; } public List<Vacancy> getJavaVacancies(String searchString) { return strategy.getVacancies(searchString); } }
package com.javarush.test.level28.lesson15.big01.model; import com.javarush.test.level28.lesson15.big01.vo.Vacancy; import java.util.List; /** * Created by promoscow on 23.02.17. */ public interface Strategy { public List<Vacancy> getVacancies(String searchString); }
<!DOCTYPE html> <html lang="ru"> <head> <meta charset="utf-8"> <title>Вакансии</title> </head> <body> <table> <tr> <th>Title</th> <th>City</th> <th>Company Name</th> <th>Salary</th> </tr> <tr class="vacancy"> <td class="title"><a href="http://javarush.ru">Junior Java Developer</a></td> <td class="city">Entire World</td> <td class="companyName">JavaRush</td> <td class="salary">1mmm</td> </tr> <tr class="vacancy template" style="display: none"> <td class="title"><a href="url"></a></td> <td class="city"></td> <td class="companyName"></td> <td class="salary"></td> </tr> </table> </body> </html>
package com.javarush.test.level28.lesson15.big01.view; import com.javarush.test.level28.lesson15.big01.Controller; import com.javarush.test.level28.lesson15.big01.vo.Vacancy; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.List; /** * Created by promoscow on 03.04.17. */ public class HtmlView implements View { private Controller controller; private final String filePath = "./src/" + String.valueOf(this .getClass() .getPackage() .getName() .replace(".", "/") + "/vacancies.html"); @Override public void update(List<Vacancy> vacancies) { try { updateFile(getUpdatedFileContent(vacancies)); } catch (Exception e) { e.printStackTrace(); } } @Override public void setController(Controller controller) { this.controller = controller; } public void userCitySelectEmulationMethod() { controller.onCitySelect("Odessa"); } private String getUpdatedFileContent(List<Vacancy> list) throws IOException { String result = null; try { Document document = getDocument(); Elements clone = document.getElementsByAttributeValue("class", "vacancy template"); Elements template = clone.clone(); Elements elements = clone.clone(); clone.removeAttr("style"); clone.removeClass("template"); elements.removeAttr("style"); elements.removeClass("template"); Elements sh = elements.clone(); for (Element element : document.select("*")) if (element.attr("class").equals("vacancy")) element.remove(); Element out = document.select("tbody").last(); for (Vacancy vacancy : list) { Elements cloneVacancy = sh.clone(); Element city = cloneVacancy.select("td").get(1); city.text(vacancy.getCity()); Element companyName = cloneVacancy.select("td").get(2); companyName.text(vacancy.getCompanyName()); Element salary = cloneVacancy.select("td").get(3); salary.text(vacancy.getSalary()); Element title = cloneVacancy.select("a").get(0); title.text(vacancy.getTitle()); title.attr("href", vacancy.getUrl()); out.append(cloneVacancy.outerHtml()); } out.append(template.outerHtml()); result = document.html(); } catch (Exception e) { e.printStackTrace(); result = "Some exception occurred"; } return result; } private void updateFile(String s) { try { BufferedWriter writer = new BufferedWriter(new FileWriter(filePath)); writer.write(s); writer.close(); } catch (IOException e) { e.printStackTrace(); } } protected Document getDocument() throws IOException { return Jsoup.parse(new File(filePath), "UTF-8"); } }
package com.javarush.test.level28.lesson15.big01.view; import com.javarush.test.level28.lesson15.big01.Controller; import com.javarush.test.level28.lesson15.big01.vo.Vacancy; import java.util.List; /** * Created by promoscow on 03.04.17. */ public interface View { void update(List<Vacancy> vacancies); void setController(Controller controller); }
package com.javarush.test.level28.lesson15.big01.vo; /** * Created by promoscow on 30.03.17. */ public class Vacancy { private String title, salary, city, companyName, siteName, url; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getSalary() { return salary; } public void setSalary(String salary) { this.salary = salary; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getCompanyName() { return companyName; } public void setCompanyName(String companyName) { this.companyName = companyName; } public String getSiteName() { return siteName; } public void setSiteName(String siteName) { this.siteName = siteName; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Vacancy vacancy = (Vacancy) o; if (title != null ? !title.equals(vacancy.title) : vacancy.title != null) return false; if (salary != null ? !salary.equals(vacancy.salary) : vacancy.salary != null) return false; if (city != null ? !city.equals(vacancy.city) : vacancy.city != null) return false; if (companyName != null ? !companyName.equals(vacancy.companyName) : vacancy.companyName != null) return false; if (siteName != null ? !siteName.equals(vacancy.siteName) : vacancy.siteName != null) return false; return url != null ? url.equals(vacancy.url) : vacancy.url == null; } @Override public int hashCode() { int result = title != null ? title.hashCode() : 0; result = 31 * result + (salary != null ? salary.hashCode() : 0); result = 31 * result + (city != null ? city.hashCode() : 0); result = 31 * result + (companyName != null ? companyName.hashCode() : 0); result = 31 * result + (siteName != null ? siteName.hashCode() : 0); result = 31 * result + (url != null ? url.hashCode() : 0); return result; } @Override public String toString() { return "Vacancy{" + "title='" + title + '\'' + ", salary='" + salary + '\'' + ", city='" + city + '\'' + ", companyName='" + companyName + '\'' + ", siteName='" + siteName + '\'' + ", url='" + url + '\'' + '}'; } }
package com.javarush.test.level28.lesson15.big01; import com.javarush.test.level28.lesson15.big01.model.HHStrategy; import com.javarush.test.level28.lesson15.big01.model.Model; import com.javarush.test.level28.lesson15.big01.model.MoikrugStrategy; import com.javarush.test.level28.lesson15.big01.model.Provider; import com.javarush.test.level28.lesson15.big01.view.HtmlView; /** * Created by promoscow on 23.02.17. */ public class Aggregator { public static void main(String[] args) { HtmlView view = new HtmlView(); Provider moiKrugProvider = new Provider(new MoikrugStrategy()); Provider provider = new Provider(new HHStrategy()); Model model = new Model(view, provider, moiKrugProvider); Controller controller = new Controller(model); view.setController(controller); view.userCitySelectEmulationMethod(); } }
package com.javarush.test.level28.lesson15.big01; import com.javarush.test.level28.lesson15.big01.model.Model; import com.javarush.test.level28.lesson15.big01.model.Provider; import com.javarush.test.level28.lesson15.big01.vo.Vacancy; import java.util.Arrays; import java.util.List; /** * Created by promoscow on 23.02.17. */ public class Controller { private Model model; public Controller(Model model) { if (model == null) throw new IllegalArgumentException(); this.model = model; } public void onCitySelect(String cityName) { model.selectCity(cityName); } }
Leave A Comment