如何用java写爬虫
使用Java编写爬虫的方法
引入必要的依赖库
在Java中编写爬虫通常需要借助一些第三方库,常用的包括Jsoup和HttpClient。Jsoup用于解析HTML,HttpClient用于发送HTTP请求。在Maven项目中,可以在pom.xml中添加以下依赖:
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.15.3</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
发送HTTP请求
使用HttpClient发送GET请求获取网页内容。以下是一个简单的示例代码:
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
public class SimpleCrawler {
public static String fetchPage(String url) throws Exception {
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(url);
CloseableHttpResponse response = httpClient.execute(httpGet);
String content = EntityUtils.toString(response.getEntity());
response.close();
httpClient.close();
return content;
}
}
解析HTML内容
使用Jsoup解析HTML内容并提取所需数据。以下是一个解析示例:
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class HtmlParser {
public static void parseHtml(String html) {
Document doc = Jsoup.parse(html);
Elements links = doc.select("a[href]");
for (Element link : links) {
System.out.println("Link: " + link.attr("href"));
}
}
}
处理动态内容
对于动态加载的内容,可以使用Selenium WebDriver模拟浏览器行为。以下是一个示例:
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class DynamicContentCrawler {
public static void main(String[] args) {
System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");
WebDriver driver = new ChromeDriver();
driver.get("https://example.com");
String pageSource = driver.getPageSource();
driver.quit();
System.out.println(pageSource);
}
}
存储爬取的数据
将爬取的数据存储到文件或数据库中。以下是一个存储到文件的示例:
import java.io.FileWriter;
import java.io.IOException;
public class DataStorage {
public static void saveToFile(String data, String filename) throws IOException {
FileWriter writer = new FileWriter(filename);
writer.write(data);
writer.close();
}
}
遵守robots.txt规则
在爬取网站前,检查目标网站的robots.txt文件,确保爬虫行为符合网站的爬取政策。可以使用以下代码检查:
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
public class RobotsChecker {
public static String checkRobotsTxt(String baseUrl) throws Exception {
String robotsUrl = baseUrl + "/robots.txt";
Document doc = Jsoup.connect(robotsUrl).get();
return doc.text();
}
}
设置请求头模拟浏览器
为避免被网站屏蔽,可以设置User-Agent等请求头模拟浏览器访问:
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
public class HeaderExample {
public static Document fetchWithHeaders(String url) throws Exception {
return Jsoup.connect(url)
.userAgent("Mozilla/5.0")
.header("Accept-Language", "en-US")
.get();
}
}
处理分页和递归爬取
对于需要分页或递归爬取的网站,可以通过循环或递归方式实现:
public class PaginationCrawler {
public static void crawlPages(String baseUrl, int maxPages) throws Exception {
for (int i = 1; i <= maxPages; i++) {
String pageUrl = baseUrl + "?page=" + i;
String content = SimpleCrawler.fetchPage(pageUrl);
HtmlParser.parseHtml(content);
}
}
}
异常处理和限速
添加异常处理和限速逻辑,避免频繁请求导致IP被封:
import java.util.concurrent.TimeUnit;
public class PoliteCrawler {
public static void politeFetch(String url) throws Exception {
try {
String content = SimpleCrawler.fetchPage(url);
HtmlParser.parseHtml(content);
TimeUnit.SECONDS.sleep(2); // 限速2秒
} catch (Exception e) {
System.err.println("Error fetching URL: " + url);
e.printStackTrace();
}
}
}
通过以上方法,可以构建一个基本的Java爬虫程序。根据实际需求,可以进一步扩展功能,如使用代理IP、处理登录会话等。







