前回のエピソードでは、Zhihu クローラーを作成するために Java を使用する必要性について話しました。今回は、コードを使用して Web ページのコンテンツを取得する方法を学習します。
まず、HTML、CSS、JS、AJAX の経験がない場合は、W3C (ここをクリックしてください) にアクセスして少し学ぶことをお勧めします。
HTMLと言えば、GETアクセスとPOSTアクセスの問題があります。
この側面についての理解が不足している場合は、W3C の記事「GET vs. POST」を読むことができます。
あ、ここでは詳しくは説明しません。
次に、Java を使用して Web ページのコンテンツをクロールする必要があります。
このとき、Baiduが役に立ちます。
はい、彼はもはや無名のインターネット速度テスターではなく、私たちの爬虫類モルモットになろうとしています! ~
まず Baidu のホームページを見てみましょう:
このようなページが HTML と CSS の共同作業の結果であることは誰もが知っていると思います。
ブラウザでページを右クリックし、「ページのソースコードを表示」を選択します:
はい、これは次のようなものです。これはBaiduページのソースコードです。
次のタスクは、クローラーを使用して同じものを取得することです。
まず簡単なソースコードを見てみましょう:
import java.io.*; import java.net.*; public class Main { public static void main(String[] args) { // 定义即将访问的链接 String url = "http://www.baidu.com"; // 定义一个字符串用来存储网页内容 String result = ""; // 定义一个缓冲字符输入流 BufferedReader in = null; try { // 将string转成url对象 URL realUrl = new URL(url); // 初始化一个链接到那个url的连接 URLConnection connection = realUrl.openConnection(); // 开始实际的连接 connection.connect(); // 初始化 BufferedReader输入流来读取URL的响应 in = new BufferedReader(new InputStreamReader( connection.getInputStream())); // 用来临时存储抓取到的每一行的数据 String line; while ((line = in.readLine()) != null) { //遍历抓取到的每一行并将其存储到result里面 result += line; } } catch (Exception e) { System.out.println("发送GET请求出现异常!" + e); e.printStackTrace(); } // 使用finally来关闭输入流 finally { try { if (in != null) { in.close(); } } catch (Exception e2) { e2.printStackTrace(); } } System.out.println(result); } }
上記は、Baidu にアクセスする Java をシミュレートする Main メソッドです
それを実行して結果を確認できます:
ああ、それはまさに以前ブラウザで見たものと同じです。この時点で、最も単純なクローラーの準備が整いました。
しかし、これらすべてが私が望むものであるわけではありません。
Baidu の大きな足のロゴを例に挙げてみましょう。
一時的な必要性:
Baidu ロゴの大きな足の画像リンクを取得します。
まずはブラウザでの見方について説明します。
画像を右クリックし、[要素の検査] を選択します (Firefox、Google、IE11 にはすべてこの機能がありますが、名前は異なります):
ああ、たくさんの div に囲まれていることがわかります。貧弱な img タグ。
このsrcは画像へのリンクです。
では、Java ではどうすればよいでしょうか?
コードのデモンストレーションを容易にするために、すべてのコードがクラスによってカプセル化されていないことをあらかじめご了承ください。ご理解ください。
まず前のコードを sendGet 関数にカプセル化しましょう:
import java.io.*; import java.net.*; public class Main { static String sendGet(String url) { // 定义一个字符串用来存储网页内容 String result = ""; // 定义一个缓冲字符输入流 BufferedReader in = null; try { // 将string转成url对象 URL realUrl = new URL(url); // 初始化一个链接到那个url的连接 URLConnection connection = realUrl.openConnection(); // 开始实际的连接 connection.connect(); // 初始化 BufferedReader输入流来读取URL的响应 in = new BufferedReader(new InputStreamReader( connection.getInputStream())); // 用来临时存储抓取到的每一行的数据 String line; while ((line = in.readLine()) != null) { // 遍历抓取到的每一行并将其存储到result里面 result += line; } } catch (Exception e) { System.out.println("发送GET请求出现异常!" + e); e.printStackTrace(); } // 使用finally来关闭输入流 finally { try { if (in != null) { in.close(); } } catch (Exception e2) { e2.printStackTrace(); } } return result; } public static void main(String[] args) { // 定义即将访问的链接 String url = "http://www.baidu.com"; // 访问链接并获取页面内容 String result = sendGet(url); System.out.println(result); } }
これで少しすっきりしましたが、私の強迫性障害を許してください。
次のタスクは、取得したたくさんのものから写真へのリンクを見つけることです。
最初に考えられる方法は、indexof 関数を使用して、ページのソース コードの文字列結果内の文字列の部分文字列を検索することです。
はい、このメソッドは、直接 IndexOf("src") を実行して開始シリアル番号を見つけ、その後急いで終了シリアル番号を取得するなど、この問題をゆっくりと解決できます。
しかし、この方法を常に使用できるわけではありません。結局のところ、わらじは歩き回るのにのみ適しています。後は、頭を保持するために義足を切断する必要があります。
私の侵入を許して続行してください。
それでは、この写真のソースをどのように見つけられるのでしょうか?
はい、下の視聴者が言ったように、通常のマッチングです。
正規表現についてよくわからない学生がいる場合は、この記事を参照してください: [Python] Web クローラー (7): Python の正規表現チュートリアル。
簡単に言えば、正規表現はマッチングのようなものです。
たとえば、3人の太った男性がここに立っていて、赤い服、青い服、緑の服を着ています。
ルールは次のとおりです: 緑色のものを捕まえてください!
そして、太った緑色の男は一人で捕まりました。
とても簡単です。
しかし、正規文法は依然として広範囲で奥が深いため、初めて触れると少し混乱するのは避けられません
私は定期的なオンライン テスト ツール、つまり正規表現オンライン テストを皆さんにお勧めします。
規則性を魔法の武器として、Java で規則性を使用するにはどうすればよいですか?
上記は、基礎知識ゼロで Java Zhihu クローラーを作成する内容です。まずは、Baidu ホームページで練習してください。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) をご覧ください。