0

ソース コードを取得して解析するコードを Java で記述しています。私がアクセスしようとしている Web サイトは次のとおりです 。 %27PAR%27%2c+%27COMM%27%2c+%27TXLN%27 .

全部で 11 ページありますが、ソース コードはそのページのみです。次のページのソース コードにアクセスするには、[次へ] ボタンをクリックし、ページをリロードして新しいソース コードを表示する必要があります。コードでソース コードのさまざまなページをすべて取得するには、このアイデアをコードに実装する必要があります。

これを行うために PhantomJS または CasperJS を使用する可能性について読んだことがありますが、それらをどのように実装するかはわかりません。

私のコードは次のとおりです。

// Scraper class takes an input of a string, and returns the source code of the of the website. Also picks out the needed data
public class Scraper { 

  private static String url; // the input website to be scraped

  public static String sourcetext; //The source code that has been scraped


  //constructor which allows for the input of a URL
  public Scraper(String url) {
    this.url = url;
  }

  //scrapeWebsite runs the method to scrape the input URL and returns a string to be parsed.
  public static void scrapeWebsite() throws IOException {

    URL urlconnect = new URL(url); //creates the url from the variable
    URLConnection connection = urlconnect.openConnection(); // connects to the created URL
    BufferedReader in = new BufferedReader(new InputStreamReader( 
                                                                 connection.getInputStream(), "UTF-8")); // annonymous class to stream the website
    String inputLine; //creates a new variable of string
    StringBuilder sourcecode = new StringBuilder(); // creates a stringbuilder which contains the sourcecode

    //loop appends to the string builder as long as there is information
    while ((inputLine = in.readLine()) != null)
      sourcecode.append(inputLine);// appends the source code to the sting
    in.close();
    sourcetext = sourcecode.toString(); // Takes the text in stringbuilder and converts it to a string
    sourcetext = sourcetext.replace('"','*'); //deletes the quotes(") so it can be parsed
  }

  //This method parses through the data and adds the necesary information to a specified CSV file
  public static void getPlaintiff() throws IOException {

    PrintWriter docketFile = new PrintWriter("tester.csv", "UTF-8"); // creates the csv file. (name must be changed, override deletes file)

    int i = 0;

    //While loop runs through all the data in the source code. There is (14) entries per page.
    while(i<14) {
      String plaintiffAtty = "PlaintiffAtty_"+i+"*>"; //creates the search string for the plaintiffatty
      Pattern plaintiffPattern = Pattern.compile("(?<="+Pattern.quote(plaintiffAtty)+").*?(?=</span>)");//creates the pattern for the atty
      Matcher plaintiffMatcher = plaintiffPattern.matcher(sourcetext); // looks for a match for the atty

      while (plaintiffMatcher.find()) {
        docketFile.write(plaintiffMatcher.group().toString()+", "); //writes the found atty to the file
      }

      String appraisedValue = "Appraised_"+i+"*>"; //creats the search string for the appraised value
      Pattern appraisedPattern = Pattern.compile("(?<="+Pattern.quote(appraisedValue)+").*?(?=</span>)");//creates the parren for the value
      Matcher appraisedMatcher = appraisedPattern.matcher(sourcetext); //looks for a match to the apreaised value

      while (appraisedMatcher.find()) {
        docketFile.write(appraisedMatcher.group().toString()+"\n"); //writes the found value to the file

      }
      i++;
    }
    docketFile.close(); //closes the file
  }
}
4

1 に答える 1

0

これは、大幅に再フォーマットされ、スタイルが変更され、改良された新しいコードです。実際に理解できるようになったので、自分の問題を解決できるかもしれません。(ただし、java 1.6 以前を使用している場合は、try-with-resources の部分を元に戻したいと思うかもしれません。これらは 1.7 で追加されただけだからです。)

/**
 * This class contains methods for is for picking
 * out needed data from the source of a website.
 */
public class Scraper { 

    /**
     * This method scrapes the input URL.
     * @return A string containing the data from the webpage.
     * @throws IOException if there was a problem with accessing the website.
     */
    public static String scrapeWebsite(String url) throws IOException {

        String inputLine;
        StringBuilder sourcetext = new StringBuilder();

        URL urlconnect = new URL(url);
        URLConnection connection = urlconnect.openConnection();

        try(BufferedReader in = new BufferedReader(
                new InputStreamReader(connection.getInputStream(), "UTF-8"))){

            while ((inputLine = in.readLine()) != null)
                sourcetext.append(inputLine);
        }
        return sourceText.toString().replace('"','*');
    }

    /**
     * This method parses through the data and adds the necesary information to
     * a specified .CSV file.
     * @param source The datasource, for example that returned by
     *               {@link scrapeWebsite()}.
     * @param targetFile The file path for the destination .csv file.
     * @throws IOException if there was a problem with accessing the file.
     */
    public static void getPlaintiff(CharSequence source, String targetFile)
            throws IOException{

        try(PrintWriter docketFile = new PrintWriter("tester.csv", "UTF-8")){

            for(int i = 0; i < 14; i++) {
                Matcher plaintiffMatcher = Pattern.compile(
                        "(?<=PlaintiffAtty_" + i + "\\*>).*?(?=</span>)")
                        .matcher(source);

                while (plaintiffMatcher.find())
                    docketFile.println(plaintiffMatcher.group());

                Matcher appraisedMatcher = Pattern.compile(
                        "(?<=Appraised_" + i + "\\*>).*?(?=</span>)")
                        .matcher(source);

                while (appraisedMatcher.find())
                    docketFile.println(appraisedMatcher.group());
            }
        }
    }
}

(新しいバグが導入される可能性があることに注意してください。大したことではなく、それらを修正するだけです。)

EDIT:正規表現を生成するにはインデックスが必要であるため、マッチャーの作成は実際にループ内で行う必要があることに気付きました。docketWriter.writeまた、をより単純なステートメントに置き換えましたdocketWriter.println

于 2013-09-26T20:33:47.553 に答える