ホームページ >バックエンド開発 >PHPチュートリアル >PHP クローラーの実践: MOOC コース情報をクロールする
インターネットの発展に伴い、最新のデータ収集、データ分析、ビジネス上の意思決定において、クローラー テクノロジーがますます重要な役割を果たすようになりました。クローラーテクノロジーの使用方法を学ぶことで、データ処理の効率と精度が大幅に向上します。この記事では、PHP を使用して、MOOC 上のコース情報をクロールするクローラーを作成します。
この記事で使用するツールは次のとおりです:
1. 準備作業
最初に必要なものがあります。ローカル環境を作成するには PHP 7.0 バージョンをインストールします。インストールプロセスは省略されます。
Guzzle HTTP クライアントは、一般的に使用される HTTP クライアント ツール ライブラリであり、Composer を使用してインストールできます。コマンドラインで空のディレクトリに切り替え、新しいcomposer.jsonファイルを作成して次の内容を追加します:
{
"require": { "guzzlehttp/guzzle": "^6.3" }
}
次に同じレベルにディレクトリ内でcomposer installを実行すると、Guzzle HTTP Clientのインストールが完了しました。
2. ターゲット Web サイトの構造を分析する
コードを書き始める前に、ターゲット Web サイトの構造を分析する必要があります。 MOOC.com (www.imooc.com) の Python コースを選択しました。取得する必要がある情報には、コース名、コース番号、コース難易度、コース期間、コース リンクが含まれます。
対象の Web サイトを開いて特定の操作 (「Python」コースの検索など) を実行すると、Web サイトから返された応答コンテンツを表示できます。ブラウザの開発ツールを使用して、応答の内容と Web ページの構造を表示できます。
MOOC 上の Python コースのリストが AJAX を通じて動的に読み込まれていることがわかります。データのクロールを容易にするために、AJAX リクエストの URL とパラメータを直接検索し、独自の HTTP リクエストを構築してデータを取得できます。
ターゲット Web サイトの XHR リクエストを見ると、Python コースに対して実際にリクエストされた URL が http://www.imooc.com/course/AjaxCourseMore?&page=1 であることがわかります。
リクエストパラメータのpageは現在アクセス中のページ番号を示します。 HTTP GET メソッドを通じて URL にリクエストを送信し、返された結果に基づいてリクエストを解析できます。
3. クローラー プログラムを作成する
前のステップで、ターゲット Web サイトの Python コースのリスト URL を取得しました。後は、Guzzle HTTP クライアントを使用して PHP コードを記述するだけです。 HTTP リクエストを送信して解析し、結果を返すだけです。
まず、Guzzle HTTP クライアント ライブラリを導入する必要があります。 PHP ファイルの先頭に次のコードを追加します:
require 'vendor/autoload.php';
次に、Guzzle HTTP クライアント オブジェクトを作成します:
$client = new GuzzleHttpClient( );
次に、このオブジェクトを使用して HTTP リクエストを送信できます:
$response = $client->request('GET', 'http://www .imooc.com /course/AjaxCourseMore?&page=1');
上記のコードでは、Guzzle HTTP クライアント オブジェクトの request() メソッドを使用し、リクエスト メソッドが GET であることを指定し、要求された URL は、前の手順で指定したものです。取得された URL です。
最後に、HTTP 応答から必要なコース情報を取得する必要があります。応答の内容を調べると、コース情報が course-card-container の class 属性を持つ HTML タグに含まれていることがわかります。
PHP の DOMDocument クラスを使用して、HTML タグを走査し、条件を満たすタグを解析できます。
最終的なコード実装は次のとおりです:
require 'vendor/autoload.php';
use GuzzleHttpClient;
$client = new Client( [
'base_uri' => 'http://www.imooc.com'
]);
$response = $client->request('GET', '/course/AjaxCourseMore?&page=1');
if ($ response->getStatusCode() == 200) {
$dom = new DOMDocument(); @$dom->loadHTML($response->getBody()); $xpath = new DOMXPath($dom); $items = $xpath->query("//div[@class='course-card-container']"); foreach ($items as $item) { $courseName = trim($xpath->query(".//h3[@class='course-card-name']/a", $item)->item(0)->textContent); $courseId = trim($xpath->query(".//div[@class='clearfix']/a[@class='course-card'], $item)->item(0)->getAttribute('href')); $courseDifficulty = trim($xpath->query(".//p[@class='course-card-desc']", $item)->item(0)->textContent); $courseDuration = trim($xpath->query(".//div[@class='course-card-info']/span[@class='course-card-time']", $item)->item(0)->textContent); $courseLink = trim($xpath->query(".//h3[@class='course-card-name']/a", $item)->item(0)->getAttribute('href')); // 将抓取到的数据存储到MySQL数据库中 // ... echo "课程名称:" . $courseName . "
";
echo "课程编号:" . $courseId . "
";
echo "课程难度:" . $courseDifficulty . "
";
echo "课程时长:" . $courseDuration . "
";
echo "课程链接:" . $courseLink . "
";
}
}
DOMDocument を使用して HTML 応答コンテンツを読み取り、次に DOMXPath を使用してタグを走査します。最後に、キャプチャした情報を出力します。
4. データの保存
これで、Python コースの情報を取得し、その情報を画面に出力することができました。ただし、データを画面に出力するのは現実的ではありません。データをデータベースに保存する必要があります。
MySQL データベースに、Python コースに関する情報を保存するテーブルを作成しました。テーブル構造は次のとおりです:
CREATE TABLE python_courses
(
id
int(11) unsigned NOT NULL AUTO_INCREMENT,
course_name
varchar(255) NOT NULL DEFAULT '',
course_id
varchar(255) NOT NULL デフォルト '',
course_difficulty
varchar(255) NOT NULL デフォルト '',
course_duration
varchar(255) ) NOT NULL デフォルト '',
course_link
varchar(255) NOT NULL デフォルト '',
主キー (id
)
) ENGINE=InnoDB デフォルト CHARSET =utf8;
コードでは、PDO を使用して MySQL データベースに接続し、prepare() メソッドとexecute() メソッドを使用して挿入操作を実行します。最終的なコードは次のとおりです。
require 'vendor/autoload.php';
use GuzzleHttpClient;
$client = new Client([
'base_uri' => 'http://www.imooc.com'##) #] );$response = $client->request('GET', '/course/AjaxCourseMore?&page=1');
if ($response->getStatusCode() == 200) {
$dom = new DOMDocument(); @$dom->loadHTML($response->getBody()); $xpath = new DOMXPath($dom); $items = $xpath->query("//div[@class='course-card-container']"); $dsn = 'mysql:host=localhost;dbname=test'; $username = 'root'; $password = ''; $pdo = new PDO($dsn, $username, $password, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]); $stmt = $pdo->prepare("INSERT INTO `python_courses` (`course_name`, `course_id`, `course_difficulty`, `course_duration`, `course_link`) VALUES (:course_name, :course_id, :course_difficulty, :course_duration, :course_link)"); foreach ($items as $item) { $courseName = trim($xpath->query(".//h3[@class='course-card-name']/a", $item)->item(0)->textContent); $courseId = trim($xpath->query(".//div[@class='clearfix']/a[@class='course-card']", $item)->item(0)->getAttribute('href')); $courseDifficulty = trim($xpath->query(".//p[@class='course-card-desc']", $item)->item(0)->textContent); $courseDuration = trim($xpath->query(".//div[@class='course-card-info']/span[@class='course-card-time']", $item)->item(0)->textContent); $courseLink = trim($xpath->query(".//h3[@class='course-card-name']/a", $item)->item(0)->getAttribute('href')); $stmt->bindParam(':course_name', $courseName); $stmt->bindParam(':course_id', $courseId); $stmt->bindParam(':course_difficulty', $courseDifficulty); $stmt->bindParam(':course_duration', $courseDuration); $stmt->bindParam(':course_link', $courseLink); $stmt->execute(); }
}
现在,我们已经成功的构建了一个简单的PHP爬虫,用于抓取慕课网上的Python课程信息。经过这个例子的介绍,你应该可以使用PHP编写你自己的爬虫程序,并获取到你需要的数据了。
以上がPHP クローラーの実践: MOOC コース情報をクロールするの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。