Xidian大学のすべての教師の「教師のメールボックス」ホームページをクロールする(Javaのjsoupを使用)

1.はじめに

Xidianの先生のホームページ情報をクロールするために、古い先生のホームページを選択しました古い先生のホームページ新しい先生のホームページよりも安定しており、更新された先生の情報がより詳細になっています。

今回はJsoup:  Jsoup中国語ドキュメントを使用しました

2.基本的な考え方

ホームページ->各大学の教師のURL->すべての教師ページのメールボックス情報から大学のURLを取得します

3.コード


import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import static java.lang.Thread.sleep;

public class JsoupTestTitle {

    public  static List<String> school = new ArrayList<String>();
    public  static List<String> zhuye = new ArrayList<String>();
    public  static Set<String> email = new TreeSet<>();

    public static void main(String[] args) throws Exception {
        getSchool();
        getZhuye();
        getEmail();
    }


    //爬取全部学院的url
    public static void getSchool() {

        String url = "https://web.xidian.edu.cn/showcollege.php?col_num=1";
        Document doc = null;
        try {
            doc = Jsoup.connect(url).get();
            Elements listDiv = doc.getElementsByAttributeValue("class", "right_container");
            for (Element element : listDiv) {
                Elements texts = element.getElementsByTag("a");
                for (Element text : texts) {

                    // 取所有文本
                    //String ptext = text.text();

                    String ptext = text.attr("href");


                    if("s".equals(ptext.substring(0,1))){
                        school.add("https://web.xidian.edu.cn/" + ptext);
                    }

                    //if(!ptext.equals(""))
                    // System.out.println("https://web.xidian.edu.cn/" + ptext);

                }
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }


    //按照学院爬取教师的主页url
    public static void getZhuye() {

        for(String ss : school){

            String url = ss;
            //for(String ss : school)
            Document doc = null;
            try {
                doc = Jsoup.connect(url).get();
                Elements listDiv = doc.getElementsByAttributeValue("class", "left_item");

                for (Element element : listDiv) {
                    Elements texts = element.getElementsByTag("a");
                    for (Element text : texts) {

                        // 取所有文本
                        //String ptext = text.text();

                        String ptext = text.attr("href");
                        String ptitle = text.attr("title");
                        zhuye.add("https://web.xidian.edu.cn/" + ptext + "+" + ptitle);
                        //if(!ptext.equals(""))
                        // System.out.println("https://web.xidian.edu.cn/" + ptext);

                    }
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }


    //按照教师主页爬取教师的邮箱
    public static void getEmail() throws InterruptedException {

        for(String zz : zhuye) {
            int index = zz.indexOf("+");


            String url = zz.substring(0,index);
            String name = zz.substring(index+1,zz.length());
            sleep(1000);

            //String url = "https://web.xidian.edu.cn/baoliang/";
            Document doc = null;
            try {
                doc = Jsoup.connect(url).get();
                Elements listDiv = doc.getElementsByAttributeValue("class", "nr");
                sleep(1000);
                for (Element element : listDiv) {
                    String Content = element.text();
                    //正则表达式判断邮箱
                    String patternStr = "[\\w[.-]]+@[\\w[.-]]+\\.[\\w]+";
                    Pattern pattern = Pattern.compile(patternStr);
                    Matcher matcher = pattern.matcher(Content);
                    //如果主页含有邮箱
                    if (matcher.find()) {

                        String teacherEmail = name + ":" + matcher.group();
                        if(!email.contains(teacherEmail)){
                            //email.add(teacherEmail);
                            System.out.println(teacherEmail);
                        }

                    }
                }
            } catch (IOException | InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

}

4.運用結果:

5.いくつかのメモ:

  • Xidianの古い教師のホームページは非常に不規則で、一部は電子メール:[email protected]、一部は電子メール:[email protected]、一部は直接[email protected]です。メールボックスの場所も不規則で、一部は紹介にあります。一部は左側の列にあり、一部は右側の列にあります。そのため、正規表現を使用してメールボックスを直接照合することになりました。
  • 最初はクロールが速すぎて一時的にブロックされすぎたため、sleep()を使用しました。ユーザーエージェントとのJsoup.connectがブロックされている可能性が高いようです...
  • この実行後、java.net.SocketTimeoutException:接続タイムアウト例外がスローされます。Jsoup.connectでのタイムアウトの設定も役に立たないため、最適化する必要があります
  • 最終結果のリンクを参照してください:https : //share.weiyun.com/5Hqwqhv
元の記事を108件公開 48 件を賞賛 5万回以上の閲覧

おすすめ

転載: blog.csdn.net/larry1648637120/article/details/103354591