2016-10-03 18 views
0

我爲我的一個客戶創建了一個刮板,刮板主要用於抓取幾個合作伙伴網站並獲取數據。刮刀的工作效率達到90頁,一旦達到90頁,它會一次又一次地報廢同一頁面。我真的很困惑,因爲這是爲什麼發生。使用Curl和php一次無法使用超過90頁的內容?

有人可以幫我解決這個問題嗎?

function getFlightCharges() { 
$requestHeaders = requestHeaderProperties(); 
$sql = 'select * from F_charge where enabled = 0'; 
$details = DatabaseHandler::GetAll ($sql); 
foreach ($details as $detail) { 
    $link = $detail ['product_link']; 
    $id = $detail ['id']; 
    $url = $link; 
    $referer = 'Referer: example.com/'; 
    $requestHeaders [] = $referer; 
    $html = getHTMLContentFromURL ($url, $requestHeaders); 
    foreach ($html->find ('.no-touch') as $e) { 
     foreach ($e->find ('.content-well') as $e1) { 
      foreach ($e1->find ('.price') as $prices) { 
       $pricee = strip_tags ($prices->innertext); 
      } 
      foreach ($e1->find ('.article-body') as $desc) { 
       $description = strip_tags ($desc->innertext); 
      } 
     } 
    } 
    $sql = "INSERT INTO price_data(product_price) VALUES (:product_price)"; 
    $params = array (':product_price' => $price); 
    DatabaseHandler::Execute ($sql, $params);  
} 

DatabaseHandler::Close(); 
} 

因此,這裏是獲取合作伙伴網站的鏈接,獲取當前價格和更新我的數據庫的功能。它工作良好,直到第89或第90頁。但不久後,它被卡在第90頁和不斷拼搶,並在數據庫中更新它

+0

它卡在下一頁。它並不總是第90頁。有時它的第88,89或90號。有沒有捲曲超時可能會讓它卡在同一頁面? –

+0

嘗試添加'set_time_limit(0)' –

+0

我無法獲取您的代碼的邏輯。你需要付出很大的努力才能將信息檢索到立即被覆蓋甚至根本不被使用的變量中。由於沒有明顯的原因,不斷將值附加到'$ requestHeaders'(因爲'getHTMLContentFromURL()'未公開),所以不可能知道它的用途。無論如何,你需要做一些基本的調試**。唯一指示你的代碼切換頁面的是來自數據庫查詢的外部循環:如果你一次又一次得到相同的結果,我懷疑的第一件事就是你的表有大量的愚蠢行爲。 –

回答

0

但不久之後,它被卡在第90頁和不斷拼搶,並在數據庫中更新它

基本上每個PHP腳本是limited with a time it runs。一些服務器將其限制爲30秒。所以如果你處理90頁,你可能會擺脫這個腳本運行時間限制。

你的解決方案是:每腳本運行

  1. 限制頁數的訪問。
  2. 使cron命令按計劃執行您的腳本。
  3. 由於您在不同的時間調用腳本,因此應該在db表中添加時間標記以節省上次更新記錄的時間標記。
+0

OP描述了完全相反的情況:腳本不超時,但它永遠運行。 –

+0

@ÁlvaroGonzález,*但不久之後,它就陷入了第90頁,並不斷在數據庫中進行刮擦和更新* - 如果在提取相同頁面的情況下,他如何知道該腳本有效。腳本可能不運行,OP認爲腳本運行更新相同的記錄... –