【问题标题】:Getting data from posts in each page using php使用php从每个页面中的帖子中获取数据
【发布时间】:2016-05-23 06:54:35
【问题描述】:

这是为了使用 curl 和 PHP Dom 从每个帖子(来自 forbes.com)中获取标题和日期。当我在 foreach 中打印日期时,标题和时间显示正确的计数“30”。但我的问题是当我打印插入查询时,得到的结果是错误的。每个页面有 15 个帖子,下面的代码用于从两个页面获取数据。请检查下面的代码并帮助我解决这个问题?

<?php
require_once('dbconnect.php');

//use curl to get html content
function getHTML($url)
{
    $curl=curl_init();
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "GET");
    curl_setopt($curl, CURLOPT_COOKIEFILE, '/cookies.txt');
    $result = curl_exec($curl);
    curl_close($curl);
    return $result;
}

$url                                 = "http://www.forbes.com/search/post/REIT/15/All-time/0/";
$results                             = getHTML($url);
$dom_document                        = new DOMDocument();
$dom_document->loadHTML($results);
$remove[]                            = ",";
$remove[]                            = " ";
$remove[]                            = "results";

/* ############################################################################ Total ###################################################################*/
$total_results                       = @$dom_document->getElementsByTagName('div');
foreach ($total_results as $total_result) {
    $total_result_class = $total_result->getAttribute('class');
    if(strstr($total_result_class, 'total_records')){
        $total_result_replace = str_replace($remove, '', $total_result->textContent);
    }
}
$pages_divide = $total_result_replace / 15;          //338.4666
$pages_floor  = floor($pages_divide);               //338

for($i = 1; $i<= 2; $i++) { // $i<= 2 (two page)
    $url_without_page       = "http://www.forbes.com/search/post/REIT/15/All-time/";
    $url_with_page          = $url_without_page . $i . '/';
    /*echo '<pre>';
      print_r($url_with_page);*/
    $url_pages              = getHTML($url_with_page);
    $dom_document_pages     = new DOMDocument();
    $dom_document_pages->loadHTML($url_pages);

    /* ############################################################################ Title ###################################################################*/
    $title_result                             = array();
    $titles                                   = @$dom_document_pages->getElementsByTagName('h2');
    foreach ($titles as $title) {
        foreach($title->childNodes as $nodes){
            if($nodes->tagName == 'a'){
                $title_result                 = str_replace("'", "", $nodes->textContent);
                /* echo '<pre>';
                   print_r($title_result);*/  
            }
        }

    }

    /* ############################################################################# Time ###################################################################*/
    $time_result                  = array();
    $times                        = @$dom_document_pages->getElementsByTagName('time');
    foreach ($times as $time) {
        $date                     = new DateTime();
        $date_replace             = str_replace(",", "", $time->textContent); //Feb 10, 2016
        $string_to_time           = strtotime($date_replace);
        $date->setTimestamp($string_to_time);
        $time_result             = $date->format('Y-m-d');
        /*echo '<pre>';
          print_r($time_result);*/
    }
    $query_insert                  = "INSERT INTO article_forbes(title, datetime) VALUE ('".$title_result."', '".$time_result."')";
    echo '<pre>';
    echo $query_insert;
    //$mysqli->query($query_insert);
}

【问题讨论】:

  • 时间显示正确是什么意思"30"?现在不是时候。
  • 你为什么要循环获取标题和时间,然后只插入最后一个?将$title_result 设置为数组有什么意义,然后在循环中将其设置为单个标题。你对$time_result做同样的事情。
  • @Barmar "30" 表示计数

标签: php dom curl php-5.6


【解决方案1】:

您没有在循环中插入数据。所以你只是插入最后一个标题和最后一个时间。

您将$title_result$time_result 初始化为数组,所以我怀疑您最初打算在那里收集所有标题和时间。但是,您没有将它们推送到循环中的数组上,而是用字符串替换了数组。改变

$title_result = str_replace("'", "", $nodes->textContent);

$title_result[] = $nodes->textContent;

这样您就可以推入数组,并对$time_result 进行类似的更改。

那么你应该循环插入。

$stmt = mysqli_prepare("INSERT INTO article_forbes(title, datetime) VALUES (?, ?)");
mysqli_bind_param($stmt, "ss", $title, $time);

for ($i = 0; $i < count($title_result); $i++) {
    $title = $title_result[$i];
    $time = $time_result[$i];
    mysqli_execute($stmt);
}

使用这样的预处理语句意味着您不需要从标题中删除特殊字符。

【讨论】:

  • 目前我只收到 15 个条目但我已经编写了 30 个条目的代码。
  • 我看不出原因。每页应该有 15 个条目。
  • 对不起。我在另一个 for 循环中添加了 for 循环。现在一切都很清楚和正确。感谢您的支持。
猜你喜欢
  • 2018-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-03
相关资源
最近更新 更多