Jsoup возвращает ошибку Status 400 для некоторых ссылок, но не для других на той же странице - PullRequest
0 голосов
/ 27 ноября 2018

Странно, я получаю результаты, которые мне нужны для первых 12 или около того ссылок, затем каждый раз происходит сбой на одной и той же ссылке (AAA 090).Я не уверен, в чем разница между ссылками.

    import org.jsoup.*;
    import org.jsoup.helper.*;
    import org.jsoup.nodes.*;
    import org.jsoup.select.*;
    import org.w3c.dom.Document;

    import java.io.*; // Only needed if scraping a local File.

    public class Scraper {


        public Scraper() {

            org.jsoup.nodes.Document page = null;
            org.jsoup.nodes.Document prefix = null;
            org.jsoup.nodes.Document course = null;
            org.jsoup.nodes.Document cls = null;
            try {
                page = Jsoup.connect("https://erpdnssb.cccs.edu/PRODCCCS/ccns_pub_controller.p_command_processor?pi_course_status=A&pi_term_code=201920&pi_search_type=SB_PREFIX").get();

            // get the page title
            String title = page.title();
            System.out.println("title: " + title);

            // get all links in page
            Elements links = page.select("a[href]");
            for (Element link : links) {
                if(!link.text().equalsIgnoreCase("HELP")&&!link.text().equalsIgnoreCase("Exit"))
                { 
                    prefix = Jsoup.connect("https://erpdnssb.cccs.edu/PRODCCCS/" + link.attr("href")).get();
                    Elements links2 = prefix.select("a[href]");
                    for (Element link2 : links2) {
                        if(link2.text().matches("[A-Z]{3}"))
                        {
                            course = Jsoup.connect("https://erpdnssb.cccs.edu/PRODCCCS/" + link2.attr("href")).get();
                            Elements links3 = course.select("a[href]");
                            for (Element link3 : links3) {
                                if(link3.text().matches("[A-Z]{3} [0-9]{3}"))
                                {
                                    cls = Jsoup.connect("https://erpdnssb.cccs.edu/PRODCCCS/" + link3.attr("href")).get();
                                    Elements links4 = cls.getAllElements();


                                    //Elements courseNum = link4.select("body > div.pagebodydiv > table:nth-child(4) > tbody > tr:nth-child(1)");
                                    System.out.println("\nhref = " + link3.attr("href") + "\n" +  cls.text() + "\n");
                                    System.out.println("link: " + cls.tagName());
                                    System.out.println("Course Number: " + link3.data().toString());

                                }
                            }
                        }
                    }
                }
            }
        }catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }

    public static void main (String args[]) {

        new Scraper();
    }

}

org.jsoup.HttpStatusException: HTTP ошибка получения URL.Status = 400,> URL = https://erpdnssb.cccs.edu/PRODCCCS/ccns_pub_controller.p_command_processor?>pi_search_type=SB_COURSE&_subj_code=AAA&pi_crse_numb=090&pi_archive_date=&pi_co>urse_status=A&pi_term_code=201920 at> org.jsoup.helper.HttpConnection $ Response.execute (HttpConnection.java:776) в> org.jsoup.helper.HttpConnection $ Response.execute (HttpConnection.java): 722) в> org.jsoup.helper.HttpConnection.execute (HttpConnection.java:306) в> org.jsoup.helper.HttpConnection.get (HttpConnection.java:295) в Scraper. (Scraper.java:42) вScraper.main (Scraper.java:64) "

1 Ответ

0 голосов
/ 04 декабря 2018

Я думаю, что вы идете по пути «Зачем упрощать, если это может быть сложно?».Я просто смотрю на тот сайт, который вы пытаетесь отменить.Сайт хорошо структурирован и организован.Так что нет необходимости в конкатенации строк, использовании регулярных выражений и выполнении всех операций очистки в конструкторе.Я бы предложил следующие шаги:

  1. Получить первую страницу и выбрать таблицу со ссылками префикса от A до Z
  2. Для каждой ссылки из 1. получить страницу префикса ивыберите таблицу со ссылками префикса курса.Например, для префикса A получить ссылки от AAA до AVT
  3. . Для каждой ссылки префикса курса из 2. получить страницу префикса курса и выбрать таблицу, содержащую ссылки на курс.Например, для AAA, чтобы получить ссылки от AAA 010 до AAA 999

Ваш код может быть что-то вроде:

import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class JsoupTest {
    final static String homePage = "https://erpdnssb.cccs.edu/PRODCCCS/ccns_pub_controller.p_command_processor?"
                      + "pi_course_status=A&pi_term_code=201920&pi_search_type=SB_PREFIX";

    public static void main(String[] args) {
        try {
            Document page = Jsoup.connect(homePage).get();
            Elements prefixLinks = page.select(".pagebodydiv > table:nth-child(6) tbody tr td a");

            for(Element prefix : prefixLinks){
                Document prefixPage = Jsoup.connect(prefix.absUrl("href")).get();
                Elements coursePrefixLinks = prefixPage.select(".pagebodydiv > table:nth-child(6) tbody tr td a");

                for(Element coursePrefix : coursePrefixLinks){
                    Document coursePrefixPage = Jsoup.connect(coursePrefix.absUrl("href")).get();
                    Elements courseLinks = coursePrefixPage.select(".pagebodydiv > table:nth-child(6) tbody tr td a");                    

                    for(Element course : courseLinks){
                        Document coursePage = Jsoup.connect(course.absUrl("href")).get();
                        try{
                            String courseNr = coursePage.select("tr:contains(Course:)").first().text();  
                            String courseTitle = coursePage.select("tr:contains(Title:)").first().text(); 
                            System.out.println(courseNr +"\n" + courseTitle + "\n********************");
                        }
                        catch(NullPointerException np){
                            System.out.println("Broken link, Page not Found");
                        }
                    }
                }
            }

        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}
...