PHP爬蟲 -- 009 實戰 爬取博客文章

先看看網站

步驟

  • 分析元素, 整理思路

  • 書寫代碼
  • chrome小彩蛋, 快速生成css選擇器

  • 保存到markdown文件中

番外1, code runner 插件設置, 如何從終端輸出

  • ctrl+shift+p
  • settings
  • 選擇 open user settings

番外2, 設置vscode的默認終端

php代碼

<?php
require 'vendor/autoload.php';
use QL\QueryList;
// 生成一個querylist對象
$ql = new QueryList();
/* * @Description: 獲取四篇博客的標題, 發佈日期, 文章連接 * @param: 主頁的url * @return: 二維數組, 包括 title, date, url */ 
function get_tilte_date($url){
    // 全局的querylist對象, 防止內存溢出報錯
    global $ql;
    return $ql->get($url)->rules([  //設置採集規則
        'date' => ['header > div > a > time.entry-date.published','text'], // 數組第一個元素是css選擇器, 第二個是屬性名
        'title' => ['header > h2 > a','text'],
        'url'=>['header > h2 > a','href']
    ])->queryData(); // queryData() 返回數組
}
/* * @Description: 獲取文章所有內容 * @param: 文章的url * @return: 文章的內容, 字符串類型 */ 
function get_content($url){
    global $ql;
    // 使用find()獲取單元素, find()裏面, 傳的是css選擇器, text()獲取文本
    return $ql->get($url)->find('article.post.type-post.status-publish.format-standard.hentry.category-uncategorized')->text();
}

/* * @Description: 建立markdown文檔, 並將爬取到的數據寫入 * @param: 包含數據的一個數組 * @return: 沒有返回值 */ 
function make_markdown($content_array){
    // 打開一個mymd.md文件, 若是沒有就建立
    $md_obj = fopen('mymd.md','w+');
    foreach ($content_array as $key => $value) {
      fwrite($md_obj,"## {$value['title']}\n");   
      fwrite($md_obj,"創做時間: `{$value['date']}`\n"); 
      fwrite($md_obj,"```\n"); 
      fwrite($md_obj,"{$value['content']}`\n"); 
      fwrite($md_obj,"```\n"); 
    }
    fclose($md_obj);
}

/* * @Description: 開始函數, 調用該函數, 便可開始爬蟲 * @param: 起始url, 主頁url * @return: 沒有返回值, 會把內容寫入到markdown文件裏 */ 
function start($url){
    $data = get_tilte_date($url);
    // 遍歷數組, 給數組新增content元素
    foreach ($data as $key => $value) {
        $data[$key]['content'] = get_content($value['url']);
    }
    make_markdown($data);
}
// 調用start()函數, 傳入起始url/主頁url, 開始爬取
start("https://wordpress-edu-3autumn.localprod.forc.work/");
複製代碼

留個小做業

  • 爬取分類下的圖書名和對應價格, 保存到books.txt
  • books.toscrape.com
  • 最終效果...

小彩蛋(點擊調轉到函數定義的位置)

下一節

相關文章
相關標籤/搜索