>  기사  >  백엔드 개발  >  Sina News 크롤링을 위한 실용적인 PHP 크롤러

Sina News 크롤링을 위한 실용적인 PHP 크롤러

WBOY
WBOY원래의
2023-06-13 14:55:121102검색

인터넷의 발달로 정보가 폭발적으로 증가했고, 뉴스가 정보의 가장 높은 비율을 차지합니다. 가장 가치 있는 최신 뉴스 정보를 더 빨리 얻기 위해 사람들은 일반적으로 뉴스 웹사이트에서 최신 정보를 검색합니다. 그러나 사람이 매일 읽을 수 있는 뉴스의 총량은 제한되어 있으므로 뉴스 정보를 크롤링하기 위한 효율적인 도구가 필요합니다. 이 기사에서는 PHP로 구현된 크롤러 프로그램을 사용하여 Sina News를 크롤링하는 실제 경험을 공유합니다.

1. 크롤러에 대한 기본 지식

크롤러의 기능은 요청하는 브라우저를 시뮬레이션하고, 반환된 페이지 데이터를 구문 분석하고, 필요한 정보를 추출하고, 저장하거나 다운로드하는 것입니다. 일반적인 크롤러 프로그래밍 언어로는 Python, Java, JavaScript 등이 있습니다. 이 기사에서는 PHP 언어가 웹 개발에 매우 ​​적합하고 웹 페이지 크롤링 및 정보 추출을 쉽게 완료할 수 있는 많은 강력한 HTTP 요청 기능과 DOM 구문 분석 라이브러리를 가지고 있기 때문에 크롤러 프로그램을 작성하기 위해 PHP 언어를 선택합니다.

2. 크롤러 프로그램 작성

1. 대상 웹사이트 결정

크롤러 프로그램 작성을 시작하기 전에 먼저 크롤링하려는 대상 웹사이트를 결정해야 합니다. 이 기사에서는 Sina 뉴스 웹 사이트를 선택했습니다. 먼저, 웹사이트의 웹페이지 구조와 데이터 저장방식을 이해해야 합니다.

2. 브라우저를 시뮬레이션하여 요청

대상 웹사이트의 데이터를 성공적으로 가져오려면 브라우저를 시뮬레이션하여 대상 웹사이트에 요청해야 합니다. 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 요청을 발행하며 요청 주소는 Sina News 홈페이지입니다. 요청에 일부 매개변수가 사용되는 것을 볼 수 있습니다. CURLOPT_RETURNTRANSFER는 요청 결과를 브라우저에 직접 출력하는 대신 cURL 함수에 지시하는 데 사용됩니다. code> 대상 웹사이트가 크롤러로부터 보호되지 않도록 브라우저의 ID를 시뮬레이션하는 데 사용됩니다. CURLOPT_FOLLOWLOCATION은 전체 페이지 소스 코드를 얻을 수 있도록 자동으로 리디렉션을 추적하는 데 사용됩니다. CURLOPT_RETURNTRANSFER 用于告诉 cURL 函数要返回请求结果而不是直接将其输出到浏览器;CURLOPT_USERAGENT 用于模拟浏览器的身份,让目标网站不会防范我们的爬虫;CURLOPT_FOLLOWLOCATION 用于自动跟踪重定向,以便能够获取到完整的页面源代码等。

3.解析页面数据

在成功获取到页面源代码后,我们需要解析数据并提取出所需的信息。解析过程可以分为两个步骤:首先,将 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

3. 페이지 데이터 구문 분석

페이지 소스 코드를 성공적으로 얻은 후에는 데이터를 구문 분석하고 필요한 정보를 추출해야 합니다. 구문 분석 프로세스는 두 단계로 나눌 수 있습니다. 먼저 HTML 코드를 문서 구조의 계층적 관계를 반영하는 DOM 개체로 변환한 다음 해당 구문 규칙에 따라 DOM 개체에서 필요한 정보를 필터링합니다.

PHP에서는 DOMDocument 클래스와 SimpleXMLElement 클래스를 사용하여 HTML 및 XML 코드를 구문 분석할 수 있습니다. 예를 들어, 다음 코드 조각에서는 Sina News 홈페이지에서 뉴스 제목, 링크 및 요약을 추출합니다. 🎜rrreee🎜위 코드 예제에서는 먼저 getElementById 메소드를 사용하여 모든 뉴스를 가져옵니다. 그런 다음 getElementsByTagName 메소드를 사용하여 li 요소를 필터링하고 목록을 반복하여 필요한 정보를 추출합니다. 그 중 getAttribute 메소드와 nodeValue 메소드를 사용하여 속성값과 텍스트 내용을 추출했습니다. 🎜🎜4. 데이터 저장🎜🎜필요한 정보를 성공적으로 추출한 후에는 나중에 사용할 수 있도록 로컬 파일이나 데이터베이스에 저장해야 합니다. 이 기사에서는 MySQL 데이터베이스를 사용하여 데이터를 저장하고, PHP와 함께 제공되는 PDO 확장을 사용하여 데이터베이스에 연결하고 작동합니다. 다음은 MySQL 데이터베이스에 데이터를 저장하는 코드 예제입니다. 🎜rrreee🎜위 코드에서는 먼저 뉴스의 제목, 링크 및 요약 정보를 저장하기 위해 news라는 테이블을 생성합니다. 이후 PDO 함수 라이브러리를 사용해 MySQL 데이터베이스의 연결, 전처리, 매개변수 바인딩, 실행 등의 단계를 구현합니다. 여기서는 bindParam 메서드를 사용하여 매개변수를 바인딩하고 SQL 문을 실행합니다. 🎜🎜3. 요약🎜🎜이 기사에서는 PHP 언어를 사용하여 Sina 뉴스 웹사이트를 크롤링하는 크롤러 프로그램을 작성하는 방법을 예로 소개합니다. 이 프로세스에서 예제 코드에는 대상 크롤링, 요청 발행, 데이터 구문 분석 및 데이터 저장과 같은 단계가 포함됩니다. 실제로 일부 웹 사이트 크롤링 방지 조치, 데이터 정리, 멀티스레드 크롤링 및 기타 문제도 고려해야 하지만 이는 고급 크롤러 기술이므로 향후 연구에서 심층적으로 연구할 수 있습니다. 🎜

위 내용은 Sina News 크롤링을 위한 실용적인 PHP 크롤러의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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