>백엔드 개발 >PHP 튜토리얼 >PHP 크롤러 연습: MOOC 강좌 정보 크롤링

PHP 크롤러 연습: MOOC 강좌 정보 크롤링

WBOY
WBOY원래의
2023-06-13 11:35:211551검색

인터넷의 발전과 함께 크롤러 기술은 현대 데이터 수집, 데이터 분석 및 비즈니스 의사 결정에서 점점 더 중요한 역할을 하고 있습니다. 크롤러 기술을 사용하는 방법을 배우면 데이터 처리의 효율성과 정확성이 크게 향상됩니다. 이 기사에서는 PHP를 사용하여 MOOC 강좌 정보를 크롤링하는 크롤러를 작성하겠습니다.

이 기사에서 사용할 도구는 다음과 같습니다.

  • PHP 프로그래밍 언어, 버전은 PHP 7.0
  • 타사 라이브러리 Guzzle HTTP 클라이언트, HTTP 요청을 보내고 HTTP 응답을 받는 데 사용됨
  • 간단한 MySQL 캡쳐된 강좌 정보를 저장할 데이터베이스

1. 준비

먼저 로컬 환경에 PHP 7.0 버전을 설치해야 합니다.

Guzzle HTTP 클라이언트는 일반적으로 사용되는 HTTP 클라이언트 도구 라이브러리이므로 Composer를 사용하여 설치할 수 있습니다. 명령줄에서 빈 디렉터리로 전환한 후 새 작곡가.json 파일을 만들고 다음 콘텐츠를 추가합니다.

{

"require": {
    "guzzlehttp/guzzle": "^6.3"
}

}

그런 다음 동일한 디렉터리에서 작곡가 설치를 실행하고 실행이 완료될 때까지 기다립니다. Guzzle HTTP 클라이언트가 성공적으로 설치되었습니다.

2. 대상 웹사이트 구조 분석

코드 작성을 시작하기 전에 대상 웹사이트 구조를 분석해야 합니다. 우리는 MOOC.com(www.imooc.com)에서 Python 강좌를 선택했습니다. 캡처해야 하는 정보에는 강좌 이름, 강좌 번호, 강좌 난이도, 강좌 기간 및 강좌 링크가 포함됩니다.

대상 웹사이트를 열고 특정 작업(예: "Python" 강좌 검색)을 수행한 후 웹사이트에서 반환된 응답 콘텐츠를 볼 수 있습니다. 브라우저의 개발 도구를 사용하여 응답 내용과 웹 페이지 구조를 볼 수 있습니다.

MOOC의 Python 강좌 목록이 AJAX를 통해 동적으로 로드되는 것을 볼 수 있습니다. 데이터 크롤링을 용이하게 하기 위해 AJAX 요청의 URL과 매개변수를 직접 조회한 다음 자체 HTTP 요청을 구성하여 데이터를 얻을 수 있습니다.

대상 웹사이트의 XHR 요청을 살펴보면 Python 강좌에 대해 실제 요청된 URL이 http://www.imooc.com/course/AjaxCourseMore?&page=1임을 알 수 있습니다.

요청 매개변수의 페이지는 현재 액세스 중인 페이지 번호를 나타냅니다. HTTP GET 메서드를 통해 URL에 요청을 보내고 반환된 결과를 기반으로 구문 분석할 수 있습니다.

3. 크롤러 프로그램 작성

이전 단계에서는 대상 웹사이트의 Python 강좌 목록 URL을 얻었습니다. 이제 PHP 코드를 작성하고 Guzzle HTTP 클라이언트를 사용하여 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 응답에서 필요한 강좌 정보를 가져와야 합니다. 응답 내용을 살펴보면, class 속성이 Course-card-container인 HTML 태그에 강좌 정보가 포함되어 있음을 알 수 있습니다.

PHP의 DOMDocument 클래스를 사용하여 HTML 태그를 탐색하고 조건을 충족하는 태그를 구문 분석할 수 있습니다.

최종 코드 구현은 다음과 같습니다.

require 'vendor/autoload.php';

use GuzzleHttpClient;

$client = new Client([

'base_uri' => 'http://www.imooc.com'

]);

$response = $client-> ;요청('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 과정의 정보를 성공적으로 캡처하고 정보를 화면에 인쇄했습니다. 그러나 데이터를 화면에 인쇄하는 것은 실용적이지 않습니다. 데이터를 데이터베이스에 저장해야 합니다

. Python 강좌에 대한 정보를 저장하기 위해 테이블을 생성했습니다. 테이블 구조는 다음과 같습니다.

CREATE TABLE

)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;python_courses (
id int(11) unsigned NOT NULL AUTO_INCREMENT,
course_name varchar(255) NOT NULL DEFAULT '',
course_id varchar(255) NOT NULL DEFAULT '',
course_difficulty varchar(255) NOT NULL DEFAULT '',
course_duration varchar(255) NOT NULL DEFAULT '',
course_link varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (id
코드에서는 PDO를 사용하여 MySQL 데이터베이스에 연결하고 사용합니다. 삽입 작업을 수행하기 위한 prepare( ) 메서드 및 Execute() 메서드는 다음과 같습니다.

require 'vendor/autoload.php';

use GuzzleHttpClient;

$client = new Client([

'base_uri' => 'http://www.imooc.com'

]);

$ 응답 = $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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.