Webクローラーに関しては、JavaはPythonほど使いやすいものではありません。この記事では、正規表現のみを使用して情報を抽出します。htmlファイルから情報をより正確に抽出する場合は、Webページパーサーを使用する必要があります。Jsoupなどのサードパーティライブラリを使用できます。
DoubanのTop250映画タイトルを抽出しました
Webページパーサーがなければ、これはより難しいことです。最初にWebページを取得します。JDK9はnet.httpパッケージの追加を開始しました。これは、元の
パッケージnewHTTPよりもはるかに単純です。
import java.io.IOException;
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class HttpClientDoPost
{
public static void main(String[] args) throws InterruptedException,IOException
{
doPost();
}
public static void doPost() throws InterruptedException
{
try
{
//创建客户机
HttpClient client=HttpClient.newHttpClient();
//定义请求,配置参数
HttpRequest request=HttpRequest.newBuilder()
.uri(URI.create("https://movie.douban.com/top250"))
.header("User-Agent","HTTPie/0.9.2")
.header("Content-Tpye", "application/x-www-form-urlencoded;charset=utf-8")
.POST(HttpRequest.BodyPublishers.ofString("tAddress="+URLEncoder.encode("1 Market Street", "UTF-8")
+"&tCity="+URLEncoder.encode("San Francisco","UTF-8")))
.build();
//得到网页
HttpResponse<String> response=client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}catch(IOException e)
{
e.printStackTrace();
}
}
}
Webページを取得した後、各映画の名前がaltタグの下にあることに気付きました。そのため、事前検索(幅ゼロのアサーション)を使用してその場所を特定します。
Pattern pattern=Pattern.compile("[!\s·,:()\\u4e00-\\u9fa5]*\\d{0,4}[!\s·,:()\\u4e00-\\u9fa5]+(?<=alt.*)");
次のように、コードはそれほど多くありません。
package spider;
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpResponse.BodyHandlers;
import java.nio.charset.StandardCharsets;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class DoubanTop250
{
public static void main(String[] args) throws InterruptedException {
int count=0;
for(int i=0;i<10;i++) {
String content=getHtml("https://movie.douban.com/top250?start="+i*25).replace(" ", "");
//根据电影名称及位置写出正则表达式
Pattern pattern=Pattern.compile("[!\s·,:()\\u4e00-\\u9fa5]*\\d{0,4}[!\s·,:()\\u4e00-\\u9fa5]+(?<=alt.*)");
Matcher matcher=pattern.matcher(content);
while(matcher.find())
{
String match=matcher.group();
if(!match.contains("豆瓣")) {
System.out.println(match);
count++;
}
}
matcher.reset();
}
System.out.println(count);
}
private static String getHtml(String url) throws InterruptedException
{
try
{
HttpClient client=HttpClient.newHttpClient();
HttpRequest request=HttpRequest.newBuilder(URI.create(url)).build();
HttpResponse<String> response=client.send(request, BodyHandlers.ofString(StandardCharsets.UTF_8));
String content= response.body();
return content;
}catch(IOException e)
{
return null;
}
}
}
もちろん、作者は一生懸命頑張って250をもらえませんでした。その理由は、映画のタイトルが多すぎて、合わせるのが難しいからです(ラスト、コーションは見ることができますが、うまく表示されません)。コンテンツをより速く、より良くクロールするには、解析を使用する必要があります。デバイス。