[JAVA] Scraping mit jsoup, um das "Likes" -Ranking von Qiita-Organisationen zu erhalten

Irgendwie hat Qiita Orgs Ranking aufgehört, also habe ich die "Likes" der Organisation in Java genommen und arrangiert. (Im Gegensatz zu Qiita Orgs Ranking ist dies nicht die Anzahl der Beiträge.)

Die Bibliothek von jsoup wird zum Scraping verwendet. Die Implementierung ist durchaus angemessen, daher denke ich, dass sie erst jetzt funktioniert.

(Wenn Sie zu viel tun, kann Qiita wütend werden)

Quellcode

import java.io.IOException;
import java.io.UncheckedIOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Set;

import org.jsoup.helper.HttpConnection;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class QiitaOrgsRank {
	static class Data {
		private final String org;
		private final URL url;
		private final int iine;

		public Data(URL url) {
			this.url = url;
			System.out.println("connect:" + url);
			Document document;
			try {
				document = HttpConnection.connect(url).get();
			} catch (IOException e) {
				throw new UncheckedIOException(e);
			}
			Elements stats = document.select(".organizationHeader_stats_value");
			Elements name = document.select(".organizationHeader_profile_orgName");

			org = name.get(0).text();
			iine = Integer.parseInt(stats.get(1).text().trim());
		}

		public int getIine() {
			return iine;
		}

		@Override
		public String toString() {
			return org + "\t" + iine + "\t" + url;
		}
	}

	public static void main(String[] args) throws URISyntaxException {

		Set<URL> urls = getOrgUrls();
		int rank = 1;
		for (Data data : (Iterable<Data>) () -> urls.stream()
				.map(Data::new)
				.sorted(Comparator.comparing(Data::getIine).reversed())
				.iterator()) {
			System.out.println(rank++ + "\t" + data.toString());
		}

	}

	private static Set<URL> getOrgUrls() throws URISyntaxException {
		Set<URL> urls = new HashSet<>();
		int i = 1;
		while (true) {
			try {
				Set<URL> orgs = getOrgUrls(i++);
				if (orgs.isEmpty()) {
					break;
				}
				urls.addAll(orgs);
			} catch (IOException e) {
				break;
			}
		}
		return urls;
	}

	private static Set<URL> getOrgUrls(int i) throws IOException, URISyntaxException {
		URL pageUrl = new URL("http://qiita.com/organizations?page=" + i);
		System.out.println("connect:" + pageUrl);

		Set<URL> urls = new HashSet<>();
		Document document = HttpConnection.connect(pageUrl).get();

		Elements elements = document.select(".organizationsList_orgName").select("a");
		for (Element element : elements) {
			URL url = pageUrl.toURI().resolve(element.attr("href")).toURL();
			urls.add(url);
		}
		return urls;
	}

}

Ergebnis

Ab dem 22. Juli 2017 sind wir auf dem 15. Platz

1 TIS Co., Ltd. 49212 http://qiita.com/organizations/tis
2	Mercari	47221	http://qiita.com/organizations/mercari
3	Wantedly, Inc.	45934	http://qiita.com/organizations/wantedly
4 Increments Co., Ltd. 38725 http://qiita.com/organizations/increments
5 Sonic Garden Co., Ltd. 37053 http://qiita.com/organizations/sonicgarden
6 Rektor 32109 http://qiita.com/organizations/rector
7 Basic Co., Ltd. 25553 http://qiita.com/organizations/basicinc
8 Topgate Co., Ltd. 22962 http://qiita.com/organizations/topgate
9	ShouldBee	22815	http://qiita.com/organizations/shouldbee
10 Dwango Co., Ltd. 22029 http://qiita.com/organizations/dwango
11 Pixiv Co., Ltd. 21340 http://qiita.com/organizations/pixiv
12	Drivemode, Inc.	18300	http://qiita.com/organizations/drivemode
13 Atlae Co., Ltd. 16562 http://qiita.com/organizations/atrae
14	freee	16294	http://qiita.com/organizations/freee
15 Future Architect Co., Ltd. 16168 http://qiita.com/organizations/future

Das? Wird diese Zahl mit Inkrementen nicht signifikant reduziert?

Recommended Posts

Scraping mit jsoup, um das "Likes" -Ranking von Qiita-Organisationen zu erhalten
Website-Scraping mit jsoup
Einfaches Web-Scraping mit Jsoup