Java クローラー HttpClient は jsoup 分析をクロールします
Java クローラー HttpClient は jsoup 分析をクロールします
httpclientDemo を使用してデータをクロールする
HttpClient はApache Jakarta Common のサブプロジェクトであり、HTTP プロトコルをサポートする効率的で最新の機能豊富なクライアント プログラミング ツールキットを提供するために使用でき、HTTP プロトコルの最新バージョンと推奨事項をサポートします。
依存関係を導入する
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.8</version>
</dependency>
新しいパッケージを作成してテスト クラスを作成する
HttpClientTest
public class HttpClientTest {
public static void main(String[] args) {
//1.生成httpclient,相当于该打开一个浏览器
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
//2.创建get请求,相当于在浏览器地址栏输入 网址
HttpGet request = new HttpGet("https://taolitop.com/");
try {
//3.执行get请求,相当于在输入地址栏后敲回车键
response = httpClient.execute(request);
//4.判断响应状态为200,进行处理
if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
//5.获取响应内容
HttpEntity httpEntity = response.getEntity();
String html = EntityUtils.toString(httpEntity, "utf-8");
System.out.println(html);
} else {
//如果返回状态不是200,比如404(页面不存在)等,根据情况做处理,这里略
System.out.println("返回状态不是200");
System.out.println(EntityUtils.toString(response.getEntity(), "utf-8"));
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//6.关闭
HttpClientUtils.closeQuietly(response);
HttpClientUtils.closeQuietly(httpClient);
}
}
}
上記のコードを実行すると、完全な html コードが得られます
上記のように、ここに簡単な例があります
この Web サイトにはクローラー対策の設定がないため、関連するリソースを設定なしで簡単に取得できます。
以下のサイトをクロールすると、
https://www.tuicool.com/
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<p>系统检测亲不是真人行为,因系统资源限制,我们只能拒绝你的请求。如果你有疑问,可以通过微博 http://weibo.com/tuicool2012/ 联系我们。</p>
</body>
</html>
これは、ボットが特定されたことを意味します。
解決策:
- マスカレード ブラウザ: マスカレード リクエスト ヘッダー
ブラウザになりすます、実際に、なりすましをしていた場合、短期間に何度もアクセスすると、ウェブサイトがIPをブロックします.このとき、IPアドレスを変更し、プロキシIPを使用する必要があります.
- プロキシ IP
インターネットには、xici などの無料のプロキシ IP Web サイトがいくつかあります。
長い間存続し、検証されたばかりの IP を選択します。ここでは、「112.85.168.223:9999」を選択します。
- クロールの速度を遅くし、次のクロールに移動する前に一定期間プログラムをスリープ状態にすることも、アンチクロールの簡単な方法です。
- 一部の Web サイトは、ログイン後に対応するリソースのみを要求できます。このとき、シミュレートされたログインが必要です。
HttpGet request = new HttpGet("https://www.tuicool.com/");
//设置请求头,将爬虫伪装成浏览器
request.setHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36");
HttpHost proxy = new HttpHost("112.85.168.223", 9999);
RequestConfig config = RequestConfig.custom().setProxy(proxy).build();
request.setConfig(config);
サンプルコード
public class HttpClientTest2 {
public static void main(String[] args) {
//1.生成httpclient,相当于该打开一个浏览器
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
//2.创建get请求,相当于在浏览器地址栏输入 网址
HttpGet request = new HttpGet("https://www.tuicool.com/");
//这里的地址网站有反爬虫的设计,下面是对反爬虫的处理
//方法一,最简单的是对请求头进行伪装,伪装成浏览器
// request.setHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36");
//设置请求头,将爬虫伪装成浏览器
request.setHeader("User-Agent","Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36");
//如果你伪装了之后,如果短时间内一直多次访问的话,网站会对你的ip进行封杀,这个时候就需要换个ip地址了,使用代理IP
HttpHost proxy = new HttpHost("112.85.168.223", 9999);
RequestConfig config = RequestConfig.custom().setProxy(proxy).build();
request.setConfig(config);
try {
//3.执行get请求,相当于在输入地址栏后敲回车键
response = httpClient.execute(request);
//4.判断响应状态为200,进行处理
if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
//5.获取响应内容
HttpEntity httpEntity = response.getEntity();
String html = EntityUtils.toString(httpEntity, "utf-8");
System.out.println(html);
} else {
//如果返回状态不是200,比如404(页面不存在)等,根据情况做处理,这里略
System.out.println("返回状态不是200");
System.out.println(EntityUtils.toString(response.getEntity(), "utf-8"));
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//6.关闭
HttpClientUtils.closeQuietly(response);
HttpClientUtils.closeQuietly(httpClient);
}
}
}
jsoup を使用して html を解析する
jsoup は、URL アドレスと HTML テキスト コンテンツを直接解析できる Java HTML パーサーです。DOM、CSS、および jQuery のような操作メソッドを介してデータを取得および操作できる、非常に省力化されたAPIを提供します。
詳細については、ブログを参照してください https://blog.csdn.net/weixin_44540681/article/details/116378094
依存関係のインポート
<dependency>
<!-- jsoup HTML parser library @ htt p://jsoup.org/ -->
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.10.2</version>
</dependency>
例として https://taolitop.com/ をクロールすると、以前は html コードを取得していましたが、今は画像リソースのみを取得したいと考えています。
上記のコードを変更しましょう (jsoup を使用)
Document doc = Jsoup.parse(html);
Elements links = doc.getElementsByTag("img");
for (Element link : links) {
String linkHref = link.attr("src");
linkHref = "https://taolitop.com" +linkHref;
System.out.println(linkHref);
}
public class HttpClientTest {
public static void main(String[] args) {
//1.生成httpclient,相当于该打开一个浏览器
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
//2.创建get请求,相当于在浏览器地址栏输入 网址
HttpGet request = new HttpGet("https://taolitop.com/");
try {
//3.执行get请求,相当于在输入地址栏后敲回车键
response = httpClient.execute(request);
//4.判断响应状态为200,进行处理
if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
//5.获取响应内容
HttpEntity httpEntity = response.getEntity();
String html = EntityUtils.toString(httpEntity, "utf-8");
// System.out.println(html);
Document doc = Jsoup.parse(html);
Elements links = doc.getElementsByTag("img");
for (Element link : links) {
String linkHref = link.attr("src");
linkHref = "https://taolitop.com" +linkHref;
System.out.println(linkHref);
}
} else {
//如果返回状态不是200,比如404(页面不存在)等,根据情况做处理,这里略
System.out.println("返回状态不是200");
System.out.println(EntityUtils.toString(response.getEntity(), "utf-8"));
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
//6.关闭
HttpClientUtils.closeQuietly(response);
HttpClientUtils.closeQuietly(httpClient);
}
}
}
これですべての画像リソースが揃いました