Heim  >  Artikel  >  Backend-Entwicklung  >  Praktischer PHP-Crawler zum Crawlen von Sina News

Praktischer PHP-Crawler zum Crawlen von Sina News

WBOY
WBOYOriginal
2023-06-13 14:55:121103Durchsuche

Mit der Entwicklung des Internets ist die Informationsmenge explosionsartig gestiegen, wobei Nachrichten den größten Anteil an Informationen ausmachen. Um schneller an die neuesten und wertvollsten Nachrichteninformationen zu gelangen, durchsuchen Menschen normalerweise die neuesten Informationen auf Nachrichten-Websites. Allerdings ist die Gesamtmenge an Nachrichten, die eine Person jeden Tag lesen kann, begrenzt, daher benötigen wir ein effizientes Tool zum Crawlen von Nachrichteninformationen. In diesem Artikel werden die praktischen Erfahrungen beim Crawlen von Sina News mit einem in PHP implementierten Crawler-Programm geteilt.

1. Grundkenntnisse über Crawler

Ein Crawler ist ein automatisiertes Programm. Seine Funktion besteht darin, einen Browser zu simulieren, der eine Anfrage stellt, die zurückgegebenen Seitendaten zu analysieren, die erforderlichen Informationen zu extrahieren und sie zu speichern oder herunterzuladen. Zu den gängigen Crawler-Programmiersprachen gehören Python, Java, JavaScript usw. In diesem Artikel wird die PHP-Sprache zum Schreiben von Crawler-Programmen ausgewählt, da die PHP-Sprache sehr gut für die Webentwicklung geeignet ist und über viele leistungsstarke HTTP-Anforderungsfunktionen und DOM-Analysebibliotheken verfügt, mit denen das Crawlen von Webseiten und die Informationsextraktion problemlos abgeschlossen werden können.

2. Schreiben Sie ein Crawler-Programm

1. Bestimmen Sie die Zielwebsite

Bevor Sie mit dem Schreiben eines Crawlerprogramms beginnen, müssen Sie zunächst die Zielwebsite bestimmen, die Sie crawlen möchten. In diesem Artikel wird die Sina-Nachrichten-Website ausgewählt. Zunächst müssen wir die Webseitenstruktur und die Datenspeichermethode der Website verstehen.

2. Simulieren Sie den Browser, um eine Anfrage zu stellen

Um die Daten der Zielwebsite erfolgreich zu erhalten, müssen Sie den Browser simulieren, um eine Anfrage an die Zielwebsite zu stellen. In PHP können wir die cURL-Funktionsbibliothek verwenden, um diesen Prozess durchzuführen. Beispiel:

$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);

Dieser Code verwendet cURL, um eine GET-Anfrage auszugeben, und die Anfrageadresse ist die Homepage von Sina News. Wir können sehen, dass einige Parameter in der Anfrage verwendet werden, wie zum Beispiel: CURLOPT_RETURNTRANSFER wird verwendet, um die cURL-Funktion anzuweisen, das Anfrageergebnis zurückzugeben, anstatt es direkt an den Browser auszugeben; code> Wird verwendet, um die Identität des Browsers zu simulieren, sodass die Zielwebsite nicht vor unseren Crawlern geschützt ist. CURLOPT_FOLLOWLOCATION wird verwendet, um Weiterleitungen automatisch zu verfolgen, sodass der vollständige Quellcode der Seite abgerufen werden kann. 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. Seitendaten analysieren

Nachdem wir den Seitenquellcode erfolgreich erhalten haben, müssen wir die Daten analysieren und die erforderlichen Informationen extrahieren. Der Parsing-Prozess kann in zwei Schritte unterteilt werden: Konvertieren Sie zunächst den HTML-Code in ein DOM-Objekt, das die hierarchische Beziehung der Dokumentstruktur widerspiegelt, und filtern Sie dann die erforderlichen Informationen gemäß den entsprechenden Syntaxregeln aus dem DOM-Objekt heraus.

In PHP können wir die DOMDocument-Klasse und die SimpleXMLElement-Klasse verwenden, um HTML- und XML-Codes zu analysieren. Im folgenden Codeausschnitt extrahieren wir beispielsweise Nachrichtentitel, Links und Zusammenfassungen von der Sina News-Homepage: 🎜rrreee🎜Im obigen Codebeispiel verwenden wir zunächst die Methode getElementById, um alle Nachrichten abzurufen Verwenden Sie dann die Methode getElementsByTagName, um die li-Elemente herauszufiltern und die Liste zu durchlaufen, um die erforderlichen Informationen zu extrahieren. Unter anderem haben wir die Methode getAttribute und die Methode nodeValue verwendet, um den Attributwert und den Textinhalt zu extrahieren. 🎜🎜4. Daten speichern🎜🎜Nachdem wir die erforderlichen Informationen erfolgreich extrahiert haben, müssen wir sie zur späteren Verwendung in einer lokalen Datei oder Datenbank speichern. In diesem Artikel verwenden wir die MySQL-Datenbank zum Speichern von Daten und verwenden die mit PHP gelieferte PDO-Erweiterung, um eine Verbindung zur Datenbank herzustellen und mit ihr zu arbeiten. Das Folgende ist ein Codebeispiel zum Speichern von Daten in einer MySQL-Datenbank: 🎜rrreee🎜Im obigen Code erstellen wir zunächst eine Tabelle mit dem Namen „news“, um den Titel, den Link und die Zusammenfassungsinformationen der Nachrichten zu speichern. Verwenden Sie anschließend die PDO-Funktionsbibliothek, um Schritte wie Verbindung, Vorverarbeitung, Parameterbindung und Ausführung der MySQL-Datenbank zu implementieren. Hier verwenden wir die Methode bindParam, um Parameter zu binden und SQL-Anweisungen auszuführen. 🎜🎜3. Zusammenfassung🎜🎜In diesem Artikel wird als Beispiel beschrieben, wie man mithilfe der PHP-Sprache ein Crawler-Programm zum Crawlen der Sina-News-Website schreibt. In diesem Prozess umfasst der Beispielcode Schritte wie das Crawlen des Ziels, das Senden einer Anfrage, das Parsen der Daten und das Speichern der Daten. In der Praxis müssen Sie möglicherweise auch einige Anti-Crawling-Maßnahmen für Websites, Datenbereinigung, Multi-Thread-Crawling und andere Probleme berücksichtigen. Dabei handelt es sich jedoch um fortschrittlichere Crawler-Technologien, die in zukünftigen Studien eingehend untersucht werden können. 🎜

Das obige ist der detaillierte Inhalt vonPraktischer PHP-Crawler zum Crawlen von Sina News. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn