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