Я создал небольшой алгоритм, который извлекает данные с сайта объявлений о продаже подержанных автомобилей, но я сталкиваюсь с некоторыми проблемами со скоростью алгоритма. Если будет извлечено более 1500 объявлений, потребуется около35-40 секунд, чтобы получить все значения.Вот код:
public class ScrapperOlxImplementation implements ScrapperOlx {
private static final String USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36";
// private final String query = "dacia";
private String lastPage = "";
private int pageFinalNumber;
private int index = 0;
private int k, j, m, l, n;
private int indexNume = 0;
private int searchOne, searchTwo, searchThree;
private String img = "";
private int indexare;
@Override
public List searchOlx(String marca, String model, String pretDeLa, String pretPanaLa, String anFabrDeLa,
String anFabrPanaLa, String orasParam) {
Document page = null;
try {
page = Jsoup.connect(
"link"))
.userAgent(USER_AGENT).get();
try {
lastPage = page.select(".item.fleft").last().text();
if (lastPage != null) {
pageFinalNumber = Integer.parseInt(lastPage);
}
} catch (NullPointerException e) {
pageFinalNumber = 1;
}
List<SearchResultOlx> list = new ArrayList<>();
for (int i = 1; i <= pageFinalNumber; i++) {
String iChanging = Integer.toString(i);
Document page2 = Jsoup.connect(link))
.userAgent(USER_AGENT).get();
Elements pageSearch = page2.select(".lheight22.margintop5");
Elements pageSearch2 = page2.select(".space.inlblk.rel");
Elements pageSearch3 = page2.select(".lheight22.margintop5 > a");
Elements pageSearch4 = page2.select(".offer-wrapper");
Elements pageSearch5 = page2.select(".breadcrumb.x-normal > span");
Elements searchResults = page2.select(".offer-wrapper > table > tbody > tr > td[width=150] > a");
for (j = 0; j < pageSearch.size(); j++) {
String title = pageSearch.get(j).text();
list.add(new SearchResultOlx(title));
}
for (Element searchResult : searchResults) {
boolean withoutImage = searchResult.hasClass(".nophoto");
if (!withoutImage) {
String imgSrc = searchResult.select("img").attr("src");
list.get(indexare).setImgLink(imgSrc);
} else {
list.get(indexare).setImgLink("No photo");
}
indexare++;
}
for (k = 0; k < pageSearch2.size(); k++) {
String price = pageSearch2.get(k).text();
list.get(searchOne).setPrice(price);
searchOne++;
}
for (l = 0; l < pageSearch3.size(); l++) {
String url = pageSearch3.get(l).attr("href");
list.get(searchTwo).setUrl(url);
searchTwo++;
}
for (n = 0; n < pageSearch5.size(); n++) {
if (n == 0 || n % 2 == 0) {
String oras = pageSearch5.get(n).text();
list.get(indexNume).setOras(oras);
indexNume++;
}
}
}
// REINITIALIZATIONS
searchOne = 0;
searchTwo = 0;
searchThree = 0;
j = 0;
n = 0;
k = 0;
l = 0;
m = 0;
index = 0;
indexNume = 0;
indexare = 0;
return list;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
Сначала я получаю количество страниц, на которых размещается реклама, и после этого я перебираю каждую страницу и извлекаю данные. Как я могу сделать это быстрее? Если бы это былоиспользовать потоки я должен делать это на итерациях или где?