インターネットの発展により、情報は爆発的に増加し、情報の中で最も大きな割合を占めるのはニュースです。最新かつ最も価値のあるニュース情報をより早く入手するために、人々は通常、ニュース Web サイトで最新情報を閲覧します。ただし、人が毎日読めるニュースの総量は限られているため、ニュース情報をクロールする効率的なツールが必要です。この記事では、PHP で実装されたクローラー プログラムを使用して新浪ニュースをクロールする実際の経験を共有します。
1. クローラーの基礎知識
クローラーは、リクエストを行うブラウザーをシミュレートし、返されたページ データを解析し、必要な情報を抽出して保存またはダウンロードする機能を持つ自動プログラムです。 。一般的なクローラー プログラミング言語には、Python、Java、JavaScript などが含まれます。この記事では、クローラー プログラムを作成するために PHP 言語を選択します。これは、PHP 言語が Web 開発に非常に適しており、Web ページのクローリングと情報抽出を簡単に完了できる多くの強力な HTTP リクエスト関数と DOM 解析ライブラリがあるためです。
2. クローラー プログラムを作成する
1. ターゲット Web サイトを決定する
クローラー プログラムを作成する前に、まずクロールするターゲット Web サイトを決定する必要があります。 。この記事は新浪ニュースサイトを選択します。まず、Web ページの構造と Web サイトのデータ保存方法を理解する必要があります。
2. リクエストを行うブラウザをシミュレートする
ターゲット Web サイトのデータを正常に取得するには、ブラウザをシミュレートしてターゲット Web サイトにリクエストを行う必要があります。 PHP では、cURL 関数ライブラリを使用してこのプロセスを実行できます。例:
$url = 'http://news.sina.com.cn/'; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_ENCODING, ''); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_MAXREDIRS, 3); curl_setopt($ch, CURLOPT_TIMEOUT, 10); $html = curl_exec($ch); curl_close($ch);
このコードは cURL を使用して GET リクエストを発行します。リクエストのアドレスは新浪ニュースのホームページです。CURLOPT_RETURNTRANSFER
は、リクエスト結果をブラウザに直接出力するのではなく返すように cURL 関数に指示するために使用されます。CURLOPT_USERAGENT
は、ターゲット Web サイトがクローラーから保護されないようにブラウザーの ID をシミュレートするために使用され、CURLOPT_FOLLOWLOCATION
は、完全なページのソース コードを取得できるようにリダイレクトを自動的に追跡するために使用されます。
3. ページ データの解析
ページ ソース コードの取得に成功したら、データを解析して必要な情報を抽出する必要があります。解析プロセスは 2 つのステップに分けることができます: まず、HTML コードをドキュメント構造の階層関係を反映する DOM オブジェクトに変換し、次に、対応する構文ルールに従って DOM オブジェクトから必要な情報をフィルタリングします。
PHP では、DOMDocument クラスと SimpleXMLElement クラスを使用して HTML および XML コードを解析できます。たとえば、次のコード スニペットでは、新浪ニュースのホームページからニュースのタイトル、リンク、概要を抽出します。
//创建 DOM 对象 $dom = new DOMDocument(); //HTML 代码转 DOM 对象 $dom->loadHTML($html); //获取所有新闻列表 $newsList = $dom->getElementById('syncad_1'); //遍历新闻列表并提取信息 foreach ($newsList->getElementsByTagName('li') as $item) { //提取标题链接 $linkNode = $item->getElementsByTagName('a')->item(0); $link = $linkNode->getAttribute('href'); //提取标题 $titleNode = $linkNode->getElementsByTagName('span')->item(0); $title = $titleNode->nodeValue; //提取摘要 $summaryNode = $item->getElementsByTagName('p')->item(0); $summary = $summaryNode->nodeValue; //保存数据到数组中 $data[] = [ 'title' => $title, 'link' => $link, 'summary' => $summary ]; }
上記のコード例では、まずgetElementById
メソッドを使用して、すべてのニュース リストを取得し、getElementsByTagName
メソッドを使用して li 要素を除外し、リストを走査して必要な情報を抽出します。このうち、getAttribute
メソッドとnodeValue
メソッドを使用して、属性値とテキストの内容を抽出しました。
4. データの保存
必要な情報の抽出に成功したら、後で使用できるようにその情報をローカル ファイルまたはデータベースに保存する必要があります。この記事では、MySQL データベースを使用してデータを保存し、PHP に付属する PDO 拡張機能を使用してデータベースに接続して操作します。以下は、MySQL データベースにデータを保存するコード例です。
//数据库连接 $dsn = 'mysql:host=127.0.0.1;dbname=news;charset=utf8'; $username = 'root'; $password = '123456'; $options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, ]; $pdo = new PDO($dsn, $username, $password, $options); //保存数据到数据库中 $stmt = $pdo->prepare("INSERT INTO news (title, link, summary) VALUES (:title, :link, :summary)"); foreach ($data as $item) { $stmt->bindParam(':title', $item['title']); $stmt->bindParam(':link', $item['link']); $stmt->bindParam(':summary', $item['summary']); $stmt->execute(); }
上記のコードでは、まず news という名前のテーブルを作成し、ニュースのタイトル、リンク、概要情報を保存します。その後、PDO 関数ライブラリを使用して、接続、前処理、パラメータ バインド、MySQL データベースの実行などの手順を実装します。ここでは、bindParam
メソッドを使用してパラメータをバインドし、SQL ステートメントを実行します。
3. 概要
この記事では、例として、PHP 言語を使用して新浪ニュース Web サイトをクロールするクローラー プログラムを作成する方法を紹介します。このプロセスでは、サンプル コードには、ターゲットのクロール、リクエストの発行、データの解析、データの保存などのステップが含まれています。実際には、Web サイトのクロール対策、データ クリーニング、マルチスレッド クローリングなどの問題も考慮する必要があるかもしれませんが、これらはより高度なクローラー テクノロジであり、今後の研究でさらに詳しく調査される可能性があります。
以上が新浪ニュースをクローリングするための実用的なPHPクローラーの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。