ホームページ >バックエンド開発 >PHPチュートリアル >PHP クローラーの実践: MOOC コース情報をクロールする

PHP クローラーの実践: MOOC コース情報をクロールする

WBOY
WBOYオリジナル
2023-06-13 11:35:211553ブラウズ

インターネットの発展に伴い、最新のデータ収集、データ分析、ビジネス上の意思決定において、クローラー テクノロジーがますます重要な役割を果たすようになりました。クローラーテクノロジーの使用方法を学ぶことで、データ処理の効率と精度が大幅に向上します。この記事では、PHP を使用して、MOOC 上のコース情報をクロールするクローラーを作成します。

この記事で使用するツールは次のとおりです:

  • PHP プログラミング言語、バージョンは PHP 7.0
  • サードパーティ ライブラリ Guzzle HTTP Client、 HTTP リクエストの送信と HTTP レスポンスの受信に使用されます
  • 取得したコース情報を保存するために使用されるシンプルな MySQL データベース

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。