ホームページ >バックエンド開発 >PHPチュートリアル >PHPを使ったクローラーの書き方を詳しく解説した記事

PHPを使ったクローラーの書き方を詳しく解説した記事

藏色散人
藏色散人転載
2021-07-17 15:44:097810ブラウズ

クローラといえば、誰もがPythonを第一印象に思うでしょうが、誰もがPythonを知っているわけではないので、他の言語を使用してクローラを書くことはできますか?もちろん可能ですので、PHP を使用してクローラを作成する方法を紹介します。

ページの HTML コンテンツを取得する

1. 関数 file_get_contents を使用して、ファイル全体を文字列に読み取ります。

file_get_contents(path,include_path,context,start,max_length);
file_get_contents('https://fengkui.net/');

このようにして、ページ全体の HTML コンテンツを文字列に読み込んで解析できます。

2. CURL を使用してリクエストを作成し、HTML

を取得します。
/**
 * [curlHtml 获取页面信息]
 * @param  [type] $url [网址]
 * @return [type]      [description]
 */
function curlHtml($url)
{
    $curl = curl_init();
    curl_setopt_array($curl, array(
        CURLOPT_URL            => "{$url}",
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING       => "",
        CURLOPT_MAXREDIRS      => 10,
        CURLOPT_TIMEOUT        => 30,
        CURLOPT_HTTP_VERSION   => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST  => "GET",
        CURLOPT_HTTPHEADER     => array(
            "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
            "Accept-Encoding: gzip, deflate, br",
            "Accept-Language: zh-CN,zh;q=0.9",
            "Cache-Control: no-cache",
            "Connection: keep-alive",
            "Pragma: no-cache",
            "Upgrade-Insecure-Requests: 1",
            "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36",
            "cache-control: no-cache"
        ),
    ));
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    $response = curl_exec($curl);
    $err = curl_error($curl);
    curl_close($curl);
    if ($err) return false;
    else return $response;
}

Curl を使用すると、ブラウザ ログインのシミュレートやその他の高度な操作など、他の操作を実行できます。

ページ HTML を解析して必要なデータを取得します

1. コンテンツを定期的に取得します

/**
 * [get_tag_data 使用正则获取html内容]
 * @param  [type] $html  [爬取的页面内容]
 * @param  [type] $tag   [要查找的标签]
 * @param  [type] $attr  [要查找的属性名]
 * @param  [type] $value [属性名对应的值]
 * @return [type]        [description]
 */
function get_tag_data($html,$tag,$attr,$value){
    $regex = "/<$tag.*?$attr=\".*?$value.*?\".*?>(.*?)<\/$tag>/is";
    preg_match_all($regex,$html,$matches,PREG_PATTERN_ORDER);
    $data = isset($matches[1][0]) ? $matches[1][0] : &#39;&#39;;
    return $data;
}
$str = &#39;<div class="feng">冯奎博客</div>&#39;;
$value = get_tag_data($str, &#39;div&#39;, &#39;class&#39;, &#39;feng&#39;);

2. Xpath を使用してデータを解析します

XPath はXML パス言語 (XML パス言語)。XML ドキュメントの特定の部分の位置を決定するために使用される言語です。具体的な使用方法と関連する紹介については、Baidu Encyclopedia (XPath) を参照してください。使用方法:

/**
 * [get_html_data 使用xpath对获取到的html内容进行处理]
 * @param  [type]  $html [爬取的页面内容]
 * @param  [type]  $path [Xpath语句]
 * @param  integer $tag  [类型 0内容 1标签内容 自定义标签]
 * @param  boolean $type [单个 还是多个(默认单个时输出单个)]
 * @return [type]        [description]
 */
function get_html_data($html,$path,$tag=1,$type=true)
{
    $dom = new \DOMDocument();
    @$dom->loadHTML("<?xml encoding=&#39;UTF-8&#39;>" . $html); // 从一个字符串加载HTML并设置UTF8编码
    $dom->normalize(); // 使该HTML规范化
    $xpath = new \DOMXPath($dom); //用DOMXpath加载DOM,用于查询
    $contents = $xpath->query($path); // 获取所有内容
    $data = [];
    foreach ($contents as $value) {
        if ($tag==1) {
            $data[] = $value->nodeValue; // 获取不带标签内容
        } elseif ($tag==2) {
            $data[] = $dom->saveHtml($value);  // 获取带标签内容
        } else {
            $data[] = $value->attributes->getNamedItem($tag)->nodeValue; // 获取attr内容
        }
    }
    if (count($data)==1) {
        $data = $data[0];
    }
    return $data;
}

推奨学習: "PHP ビデオ チュートリアル "

以上がPHPを使ったクローラーの書き方を詳しく解説した記事の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はfengkui.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。