From 26864390927ca13dc7b16bdf0215bffe90de0eda Mon Sep 17 00:00:00 2001 From: Xueyulong <1507981279@qq.com> Date: Thu, 9 Apr 2026 12:38:04 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6=E8=87=B3?= =?UTF-8?q?=20'w4'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- w4/.gitconfig | 2 + w4/Spider - 副本.java | 143 ++++++++++++++++++ w4/Spider.java | 143 ++++++++++++++++++ ...面积计算器重构 完整整合版.docx | Bin 0 -> 16598 bytes 4 files changed, 288 insertions(+) create mode 100644 w4/.gitconfig create mode 100644 w4/Spider - 副本.java create mode 100644 w4/Spider.java create mode 100644 w4/图形面积计算器重构 完整整合版.docx diff --git a/w4/.gitconfig b/w4/.gitconfig new file mode 100644 index 0000000..e853fd6 --- /dev/null +++ b/w4/.gitconfig @@ -0,0 +1,2 @@ +[safe] + directory = * diff --git a/w4/Spider - 副本.java b/w4/Spider - 副本.java new file mode 100644 index 0000000..9a7f8f4 --- /dev/null +++ b/w4/Spider - 副本.java @@ -0,0 +1,143 @@ +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.List; + +public class Spider { + protected String baseUrl; + protected String userAgent; + + public Spider(String baseUrl) { + this.baseUrl = baseUrl; + this.userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"; + } + + public Document fetchPage(String url) { + try { + return Jsoup.connect(url) + .userAgent(userAgent) + .timeout(10000) + .get(); + } catch (IOException e) { + System.err.println("Error fetching " + url + ": " + e.getMessage()); + return null; + } + } + + public List parsePage(Document doc) { + throw new UnsupportedOperationException("Subclass must override parsePage method"); + } + + public void saveData(List data, String filename) { + if (data == null || data.isEmpty()) { + System.out.println("No data to save"); + return; + } + + try (PrintWriter writer = new PrintWriter(new FileWriter(filename, false))) { + writer.println("title,rating,link"); + for (Movie movie : data) { + writer.println(movie.getTitle() + "," + movie.getRating() + "," + movie.getLink()); + } + System.out.println("Data saved to " + filename); + } catch (IOException e) { + System.err.println("Error saving data: " + e.getMessage()); + } + } + + public List run(int startPage, Integer endPage) { + List allData = new ArrayList<>(); + int currentPage = startPage; + + while (true) { + String url = endPage != null ? baseUrl + "?start=" + ((currentPage - 1) * 25) : baseUrl; + System.out.println("Processing page " + currentPage + ": " + url); + + Document doc = fetchPage(url); + if (doc == null) { + break; + } + + List pageData = parsePage(doc); + if (pageData == null || pageData.isEmpty()) { + break; + } + + allData.addAll(pageData); + + if (endPage != null && currentPage >= endPage) { + break; + } + + currentPage++; + try { + Thread.sleep(1000); // 防止请求过快被封 + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + break; + } + } + + return allData; + } +} + +class Movie { + private String title; + private String rating; + private String link; + + public Movie(String title, String rating, String link) { + this.title = title; + this.rating = rating; + this.link = link; + } + + public String getTitle() { + return title; + } + + public String getRating() { + return rating; + } + + public String getLink() { + return link; + } +} + +class DoubanMovieSpider extends Spider { + public DoubanMovieSpider() { + super("https://movie.douban.com/top250"); + } + + @Override + public List parsePage(Document doc) { + List movies = new ArrayList<>(); + Elements items = doc.select("div.item"); + + for (Element item : items) { + String title = item.select("span.title").first().text(); + String rating = item.select("span.rating_num").first().text(); + String link = item.select("a").first().attr("href"); + + movies.add(new Movie(title, rating, link)); + } + + return movies; + } +} + +class Main { + public static void main(String[] args) { + DoubanMovieSpider spider = new DoubanMovieSpider(); + List data = spider.run(1, 10); // 爬取前10页 + spider.saveData(data, "douban_movies.csv"); + System.out.println("爬取完成,共获取" + data.size() + "条数据"); + } +} \ No newline at end of file diff --git a/w4/Spider.java b/w4/Spider.java new file mode 100644 index 0000000..9a7f8f4 --- /dev/null +++ b/w4/Spider.java @@ -0,0 +1,143 @@ +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.List; + +public class Spider { + protected String baseUrl; + protected String userAgent; + + public Spider(String baseUrl) { + this.baseUrl = baseUrl; + this.userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"; + } + + public Document fetchPage(String url) { + try { + return Jsoup.connect(url) + .userAgent(userAgent) + .timeout(10000) + .get(); + } catch (IOException e) { + System.err.println("Error fetching " + url + ": " + e.getMessage()); + return null; + } + } + + public List parsePage(Document doc) { + throw new UnsupportedOperationException("Subclass must override parsePage method"); + } + + public void saveData(List data, String filename) { + if (data == null || data.isEmpty()) { + System.out.println("No data to save"); + return; + } + + try (PrintWriter writer = new PrintWriter(new FileWriter(filename, false))) { + writer.println("title,rating,link"); + for (Movie movie : data) { + writer.println(movie.getTitle() + "," + movie.getRating() + "," + movie.getLink()); + } + System.out.println("Data saved to " + filename); + } catch (IOException e) { + System.err.println("Error saving data: " + e.getMessage()); + } + } + + public List run(int startPage, Integer endPage) { + List allData = new ArrayList<>(); + int currentPage = startPage; + + while (true) { + String url = endPage != null ? baseUrl + "?start=" + ((currentPage - 1) * 25) : baseUrl; + System.out.println("Processing page " + currentPage + ": " + url); + + Document doc = fetchPage(url); + if (doc == null) { + break; + } + + List pageData = parsePage(doc); + if (pageData == null || pageData.isEmpty()) { + break; + } + + allData.addAll(pageData); + + if (endPage != null && currentPage >= endPage) { + break; + } + + currentPage++; + try { + Thread.sleep(1000); // 防止请求过快被封 + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + break; + } + } + + return allData; + } +} + +class Movie { + private String title; + private String rating; + private String link; + + public Movie(String title, String rating, String link) { + this.title = title; + this.rating = rating; + this.link = link; + } + + public String getTitle() { + return title; + } + + public String getRating() { + return rating; + } + + public String getLink() { + return link; + } +} + +class DoubanMovieSpider extends Spider { + public DoubanMovieSpider() { + super("https://movie.douban.com/top250"); + } + + @Override + public List parsePage(Document doc) { + List movies = new ArrayList<>(); + Elements items = doc.select("div.item"); + + for (Element item : items) { + String title = item.select("span.title").first().text(); + String rating = item.select("span.rating_num").first().text(); + String link = item.select("a").first().attr("href"); + + movies.add(new Movie(title, rating, link)); + } + + return movies; + } +} + +class Main { + public static void main(String[] args) { + DoubanMovieSpider spider = new DoubanMovieSpider(); + List data = spider.run(1, 10); // 爬取前10页 + spider.saveData(data, "douban_movies.csv"); + System.out.println("爬取完成,共获取" + data.size() + "条数据"); + } +} \ No newline at end of file diff --git a/w4/图形面积计算器重构 完整整合版.docx b/w4/图形面积计算器重构 完整整合版.docx new file mode 100644 index 0000000000000000000000000000000000000000..d4b7d567b6cd304ca5bdffae5e688b6a218bbb96 GIT binary patch literal 16598 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