簡體   English   中英

如何通過命令在數據庫中保存抓取的數據

[英]How to save scraped data through command in database

我在命令中有這個,但沒有保存數據庫。

        $client = new Client(HttpClient::create(['timeout' => 60]));
        $crawler = $client->request('GET', 'https://www.bbc.com/news/');

        $model = new Scraper();
        $crawler->filter('.gs-c-promo-heading')->each(function ($node) {
            $model->title = $node->text();         
        });
        $crawler->filter('.gs-c-promo-summary')->each(function ($node) {
            $model->text = $node->text();
        });
        $crawler->filter('.gs-c-timestamp')->each(function ($node) {
            $model->time = $node->text();
        });
        $crawler->filter('.gs-c-section-link')->each(function ($node) {
            $model->country = $node->text();
        }); 
        $model->save();       
        $this->info('done success');

給出這種類型的錯誤

$ php artisan scraper:start

   ErrorException

  Creating default object from empty value

  at E:\wamp64\www\Laravel7Projects\system\system\app\Console\Commands\ScrapCommand.php:49
    45|         $crawler = $client->request('GET', 'https://www.bbc.com/news/');
    46|
    47|         $crawler->filter('.gs-c-promo-heading')->each(function ($node) {
    48|            
  > 49|             $model->title = $node->text();
   
    51|         });
    52|         $crawler->filter('.gs-c-promo-summary')->each(function ($node) {
    53|             

  1   E:\wamp64\www\Laravel7Projects\system\system\app\Console\Commands\ScrapCommand.php:49
      Illuminate\Foundation\Bootstrap\HandleExceptions::handleError("Creating default object from empty value", "E:\wamp64\www\Laravel
7Projects\system\system\app\Console\Commands\ScrapCommand.php", [Object(Symfony\Component\DomCrawler\Crawler), Object(stdClass)])

  2   E:\wamp64\www\Laravel7Projects\system\system\vendor\symfony\dom-crawler\Crawler.php:352
      App\Console\Commands\ScrapCommand::App\Console\Commands\{closure}(Object(Symfony\Component\DomCrawler\Crawler))

但是使用這種方法是不需要的,因為我想將所有屬性保存在一個新類中

$crawler->filter('.gs-c-promo-heading')->each(function ($node) {
            $model = new Scraper();
            $model->title = $node->text(); 
            $model->save();        
        });

我想保存數據庫中的每個屬性但出現錯誤

使用此邏輯僅保存第一行,因為我想將所有循環保存在數據庫中

$client = new Client(HttpClient::create(['timeout' => 60]));
        $crawler = $client->request('GET', 'https://www.bbc.com/news/');

        $model = new Scraper();
        $crawler->filter('.gs-c-promo-heading')->each(function ($node) use ($model) {
            
            $model->title = $node->text(); 
                  
        });
$model->save();

編輯:只有標題保存在數據庫中,而其他人不使用此方法保存,因為我們只在 foreach 中循環標題並且地圖不起作用,而每個都在工作中,您可以檢查下面的代碼

$titles = $crawler->filter('.gs-c-promo-heading')->each(function($node) {
            return $node->text();
        });
        $texts = $crawler->filter('.gs-c-promo-summary')->each(function($node) {
            return $node->text();
        });
        $times = $crawler->filter('.gs-c-timestamp')->each(function($node) {
            return $node->text();
        });
        $countries = $crawler->filter('.gs-c-section-link')->each(function($node) {
            return $node->text();
        });

        $dataArray = [];
        foreach ($titles as $key => $item) {
            $newModelData = [
                'title' => $titles[$key],
                'text' => $texts[$key],
                'time' => $times[$key],
                'country' => $countries[$key]
            ];
            $dataArray[] = $newModelData;
        }
        Scraper::insert($dataArray);

當您使用each()您無權訪問$model變量(在范圍之外)。 您應該嘗試use()在匿名函數的局部范圍內引入$model變量

    $crawler->filter('.gs-c-promo-heading')->each(function ($node) use($model) {
        $model->title = $node->text();
    });

編輯:如果您想同時保存多個項目,您可以選擇必要的值,然后根據您的模型屬性創建數據數組。

    $titles = $crawler->filter('.gs-c-promo-heading')->map(function($node) {
        return $node->text();
    });
    $texts = $crawler->filter('.gs-c-promo-heading')->map(function($node) {
        return $node->text();
    });
// same for times, countries
    $dataArray = [];
    foreach ($titles as $key => $item) {
        $newModelData = [
            'title' => $titles[$key],
            'text' => $texts[$key],
            'time' => $times[$key],
            'country' => $countries[$key]
        ];
        $dataArray[] = $newModelData;
    }
    Model::createMany($dataArray);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM