LINUX.ORG.RU

Парсер на Java не парсит все что требуется

 , ,


0

1
    import java.io.FileWriter;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
     
    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    import org.jsoup.nodes.Element;
    import org.jsoup.select.Elements;
     
    public class Main {
    	
    	private static String num;
    	private static FileWriter fw;
    	
    	public static void main(String[] args) throws IOException {
    		
    		List<Article> articleList = new ArrayList<>();
    		fw = new FileWriter("output.txt");
     
    		for (Integer i = new Integer(1);; i++)
    		{
    			System.out.println("Parsing page number " + i.toString() + ".");
    			Document doc = Jsoup.connect("https://auto.ria.com/car/used/?page=" + i.toString()).get();
     
    			Elements h1Elements = doc.getElementsByAttributeValue("class", "item ticket-title");
    			if (h1Elements.isEmpty())
    				break;
     
    			h1Elements.forEach(h1Element -> {
    				Element aElement = h1Element.child(1);
    				String url = aElement.attr("href");
    				String title = aElement.attr("title");
    				
    				Document carPage = new Document("");
    				try {
    					carPage = Jsoup.connect(url).get();
    				} catch (IOException e) {
    					System.out.println("Can not connect to " + url + ".");
    					e.printStackTrace();
    				}
    				
    				String price = "";
    				price = carPage.getElementsByAttributeValue("class", "price-seller").first().child(0).text();
    				List<String> desc = new ArrayList<>();
    				carPage.getElementById("description").child(0).getElementsByTag("dd").forEach(dd -> {
    					if (dd.hasAttr("data-hide")) {
    						desc.add(dd.getElementsByAttributeValue("class", "argument").first().child(0).text());
    					} else {
    						desc.add(dd.text());
    					}
    				});;
    				Elements numElems = carPage.getElementsByAttributeValue("class", "phone");
    				if (!numElems.isEmpty())
    				{
    					num = numElems.first().child(0).child(1).text();
    					numElems.forEach(numElem -> {
    						if (!num.equals(numElem.child(0).child(1).text()))
    							num += ", " + numElem.child(0).child(1).text();
    					});
    					
    					
    					System.out.println("URL: " + url + ",\nTitle: " + title + ",\nPrice: " + price + ",");
    					desc.forEach(str -> {
    						System.out.println(str);
    					});
    					System.out.println("");
    					articleList.add(new Article(url, title, price, desc, num));
    				}
    			});
    			
    			if (i % 10 == 0) {
    				articleList.forEach(carInfo -> {
    					try {
    						fw.write(carInfo.getUrl() + "\n");
    						fw.write(carInfo.getName() + "\n");
    						fw.write(carInfo.getPrice() + "\n");
    						carInfo.getDescription().forEach(str -> {
    							try {
    								fw.write(str + "\n");
    							} catch (IOException ex) {
    								System.out.println(ex.getMessage());
    							}
    						});
    						fw.write(carInfo.getNumber() + "\n\n");
    					} catch (IOException ex) {
    						System.out.println(ex.getMessage());
    					}
    				});
    				
    				articleList.clear();
    			}
    		}
    		
    		try {
    			fw.close();
    		} catch (IOException ex) {
    			System.out.println(ex.getMessage());
    		}
    		
    		// TODO Saving articleList to word, excel, SQL
    	}
    }
     
    class Article {
    	private String url;
    	private String name;
    	private String price;
    	private List<String> description;
    	private String number;
     
    	public Article(String url, String name, String price, List<String> description, String number) {
    		this.url = url;
    		this.name = name;
    		this.price = price;
    		this.description = description;
    		this.number = number;
    	}
     
    	public String getUrl() {
    		return url;
    	}
     
    	public void setUrl(String url) {
    		this.url = url;
    	}
     
    	public String getName() {
    		return name;
    	}
     
    	public void setName(String name) {
    		this.name = name;
    	}
     
    	public String getPrice() {
    		return price;
    	}
     
    	public void setPrice(String price) {
    		this.price = price;
    	}
     
    	public List<String> getDescription() {
    		return description;
    	}
     
    	public void setDescription(List<String> description) {
    		this.description = description;
    	}
     
    	public String getNumber() {
    		return number;
    	}
     
    	public void setNumber(String number) {
    		this.number = number;
    	}
    }

По-разному бывает, но последний раз дошел до 1086-й страницы и остановился. Просто terminated. Запускался из Eclipse, возможно, это какие-то его ограничения, поэтому сейчас пробую вне эклипса парсить, но это займет немало времени. Может, все таки мой косяк, кто знает?

P.S. В Java я нуб, это мой первый проект.

Ответ на: комментарий от MaZy

Не, для этого там и реализована периодическая выгрузка инфы в файл. ОЗУ он стабильно жрет 130 мб на протяжении всей работы

nikitosios20031
() автор топика
Ответ на: комментарий от MaZy

Мда, я мог это предугадать. Я даже подумал об этом, когда писал код, но чето не обратил внимание. Проблема была в том, что в олин прекрасный момент интернет тупит, страница не загружается и программа завершается. Решение - запихнуть загрузку страницы в цикл.

nikitosios20031
() автор топика
Ответ на: комментарий от nikitosios20031

Советую научиться правильно работать с исключениями. Главная проблема была в том, что ты не увидел исключение, из-за которого твоя программа завершалась. Если бы увидел, сам бы понял сразу, что к чему.

Legioner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.