2013-12-05 1 views
0

Я довольно новичок в PHP и создаю веб-скребок для проекта. С этого сайта, https://www.bloglovin.com/en/blogs/1/2/all, я очищаю заголовок блога, URL-адрес блога, URL-адрес изображения и конкатенацию следующей ссылки для последующего использования. Как вы можете видеть на странице, есть несколько полей с информацией для каждого блоггера.PHP Scrape - создание многомерных массивов из результатов - текущий код возвращает только один результат

Вот мой код PHP до сих пор;

<?php 

     // Function to make GET request using cURL 
     function curlGet($url) { 
      $ch = curl_init(); // Initialising cURL session 
      // Setting cURL options 
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
      curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); 
      curl_setopt($ch, CURLOPT_URL, $url); 
      $results = curl_exec($ch); // Executing cURL session 
      curl_close($ch); // Closing cURL session 
      return $results; // Return the results 
     } 

     $blogStats = array(); 

     function returnXPathObject($item) { 
      $xmlPageDom = new DomDocument(); 
      @$xmlPageDom->loadHTML($item); 
      $xmlPageXPath = new DOMXPath($xmlPageDom); 
      return $xmlPageXPath; 
     } 

     $blPage = curlGet('https://www.bloglovin.com/en/blogs/1/2/all'); 
     $blPageXpath = returnXPathObject($blPage); 

     $title = $blPageXpath->query('//*[@id="content"]//div/a/h2/span[1]'); 
       if ($title->length > 0) { 
      $blogStats['title'] = $title->item(0)->nodeValue; 
     } 

     $url = $blPageXpath->query('//*[@id="content"]//div/a/h2/span[2]'); 
      if ($url->length > 0) { 
      $blogStats['url'] = $url->item(0)->nodeValue; 
     } 

     $img = $blPageXpath->query('//*[@id="content"]//div/a/div/@href'); 
      if ($img->length > 0) { 
      $blogStats['img'] = $img->item(0)->nodeValue; 
     } 

     $followLink = $blPageXpath->query('//*[@id="content"]/div[1]/div/a/@href'); 
      if ($followLink->length > 0) { 
       $blogStats['followLink'] = 'http://www.bloglovin.com' . $followLink->item($i)->nodeValue; 
     } 


     print_r($blogStats); 


     /*$data = $blogStats; 
     header('Content-Type: application/json'); 
     echo json_encode($data);*/ 
    ?> 

В настоящее время это только возвращает:

Array ([title] => Fashion Toast [url] => fashiontoast.com [followLink] => http://www.bloglovin.com/blog/4735/fashion-toast) 

Мой вопрос, что это лучший способ перебора каждого из результатов? Я просматривал Stack Overflow и изо всех сил пытаюсь найти ответ на свой вопрос, а мои головы немного зацикливаются! Если бы кто-нибудь мог мне посоветовать или поставить меня в правильном направлении, это было бы фантастически.

спасибо.

Обновление: Я очень уверен, что это неправильно, я получаю ошибки!

<?php 

    // Function to make GET request using cURL 
    function curlGet($url) { 
     $ch = curl_init(); // Initialising cURL session 
     // Setting cURL options 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
     curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); 
     curl_setopt($ch, CURLOPT_URL, $url); 
     $results = curl_exec($ch); // Executing cURL session 
     curl_close($ch); // Closing cURL session 
     return $results; // Return the results 
    } 

    $blogStats = array(); 

    function returnXPathObject($item) { 
     $xmlPageDom = new DomDocument(); 
     @$xmlPageDom->loadHTML($item); 
     $xmlPageXPath = new DOMXPath($xmlPageDom); 
     return $xmlPageXPath; 
    } 

$blogPage = curlGet('https://www.bloglovin.com/en/blogs/1/2/all'); 
    $blogPageXpath = returnXPathObject($blogPage); 

    $blogger = $blogPageXpath->query('//*[@id="content"]/div/@data-blog-id'); 
    if ($blogger->length > 0) { 
    $blogStats[] = $blogger->item(0)->nodeValue; 
    } 


    foreach($blogger as $id) { 

      $blPage = curlGet('https://www.bloglovin.com/en/blogs/1/2/all'); 
      $blPageXpath = returnXPathObject($blPage); 

      $title = $blPageXpath->query('//*[@id="content"]//div/a/h2/span[1]'); 
       if ($title->length > 0) { 
       $blogStats[$id]['title'] = $title->item(0)->nodeValue; 
      } 

      $url = $blPageXpath->query('//*[@id="content"]//div/a/h2/span[2]'); 
       if ($url->length > 0) { 
       $blogStats[$id]['url'] = $url->item(0)->nodeValue; 
      } 

      $img = $blPageXpath->query('//*[@id="content"]//div/a/div/@href'); 
       if ($img->length > 0) { 
       $blogStats[$id]['img'] = $img->item(0)->nodeValue; 
      } 

      $followLink = $blPageXpath->query('//*[@id="content"]/div[1]/div/a/@href'); 
       if ($followLink->length > 0) { 
       $blogStats[$id]['followLink'] = 'http://www.bloglovin.com' . $followLink->item($i)->nodeValue; 
      } 
      } 



    print_r($blogStats); 


    /*$data = $blogStats; 
    header('Content-Type: application/json'); 
    echo json_encode($data);*/ ?> 
+0

oh .. конечно это будет неправильно. $ blogger не существует. Как я уже сказал, вам нужно изменить способ определения $ blPage, чтобы на каждой итерации он был другим. Я написал foreach на случай, если у вас есть массив блогеров с их идентификатором, но я не могу сделать для вас эту часть :) –

ответ

0

Возможно, вы хотите на самом деле добавить измерение в свой массив. Я думаю, что у блоггеров есть уникальный идентификатор или какой-то идентификатор.

Кроме того, ваш код, похоже, выполняется только один раз? возможно, это должно быть что-то вроде foreach.

Я не могу сделать эту часть для вас, но вам нужен массив, содержащий каждый блоггер, или способ сделать это или за! Вы должны понять, как перебрать ваши различные блоггеры сами :)

здесь Exemple массива блоггеров

 
[14]['bloggerOne'] 
[15]['bloggerTwo'] 
[16]['bloggerThree'] 
foreach ($blogger as $id => $name) 
{ 

$blPage = curlGet('https://www.bloglovin.com/en/blogs/1/2/' . $name); 
// here you have something to do so that $blPage is actually different with each iteration, like changing the url 
$blPageXpath = returnXPathObject($blPage); 

$title = $blPageXpath->query('//*[@id="content"]//div/a/h2/span[1]'); 
      if ($title->length > 0) { 
     $blogStats[$id]['title'] = $title->item(0)->nodeValue; 
    } 

    $url = $blPageXpath->query('//*[@id="content"]//div/a/h2/span[2]'); 
     if ($url->length > 0) { 
     $blogStats[$id]['url'] = $url->item(0)->nodeValue; 
    } 

    $img = $blPageXpath->query('//*[@id="content"]//div/a/div/@href'); 
     if ($img->length > 0) { 
     $blogStats[$id]['img'] = $img->item(0)->nodeValue; 
    } 

    $followLink = $blPageXpath->query('//*[@id="content"]/div[1]/div/a/@href'); 
     if ($followLink->length > 0) { 
      $blogStats[$id]['followLink'] = 'http://www.bloglovin.com' . $followLink->item($i)->nodeValue; 
    } 


    } 

так после Еогеасп, вы массив может выглядеть следующим образом:

 
['12345']['title'] = whatever 
     ['url'] = url 
     ['img'] = foo 
     ['followLink'] = bar 
['4141']['title'] = other 
     ['url'] = urlss 
     ['img'] = foo 
     ['followLink'] = bar 
['7415']['title'] = still 
     ['url'] = url4 
     ['img'] = foo 
     ['followLink'] = bar 
+0

У каждого блоггера есть уникальный «идентификатор-блог-id», поэтому можно использовать это. Извините, что звучит глупо, но вы имеете в виду, что я бы xpath для идентификатора blogger в «foreach» или поместил весь блок кода в foreach? Еще немного нуба! – user3015175

+0

О, извините за то, что не поставил его сам, да, весь кодовый блок в foreach, чтобы он делался несколько раз с другим блоггером каждый раз. Сейчас я отредактирую его. –

+0

Извините, я все еще немного боюсь, см. Обновление! Возможно, погружение в проект не было такой фантастической идеей. Но я ценю вашу помощь до сих пор, спасибо. – user3015175