[クローラーの基本] Javaは正規表現を使用してWebページ情報を抽出します

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をもらえませんでした。その理由は、映画のタイトルが多すぎて、合わせるのが難しいからです(ラスト、コーションは見ることができますが、うまく表示されません)。コンテンツをより速く、より良くクロールするには、解析を使用する必要があります。デバイス。

おすすめ

転載: blog.csdn.net/m0_47202518/article/details/108330913