簡體   English   中英

在共享主機上每分鍾通過cron作業卷曲php抓取

[英]curl php scraping through cron job every minute on Shared hosting

我有一個棘手的問題。 我在一個基本的共享主機上。 我使用curl和php創建了一個很好的抓取腳本。

因為使用Curl進行多線程並不是真正的多線程,甚至我使用的最好的curl多線程腳本都將抓取速度提高了1.5-2,所以得出的結論是,我需要運行大量的cron任務(例如50)每分鍾與mysql表進行交互的php腳本上,以便向客戶提供快速的網頁抓取。

我的問題是,同時運行許多cron任務時,出現“ Mysql服務器已消失”的問題。 如果我減少了cron任務的數量,它會繼續工作,但總是很慢。

我還嘗試了一種基於瀏覽器的解決方案,方法是在每次結束時重新加載腳本。 它工作得更好,但始終是相同的問題:當我決定同時運行10次腳本時,它開始使mysql服務器或Web服務器超載(我不知道)

為了解決這個問題,我已經購買了一個mysql服務器,可以在其中設置my.cnf ...,但是問題仍然大致相同。

========= 我的問題是:問題出在哪里? 表大小? 我需要一個大的100MBPS專用服務器。 如果是,您確定它可以解決問題,而且速度如何? 通過知道,我希望提取速度大約每秒增加100個網址(目前,每15秒訪問1個網址,速度非常慢...)

  • 腳本上只有一陣子。 它加載所有頁面和preg匹配項或dom數據,然后插入mysql數據庫。

  • 我提取了大量數據,這就是為什么一個表快速包含數百萬個條目的原因...但是當我刪除它們時,它的運行速度可能會更快一些,但這始終是相同的問題:不可能按順序並行地大規模運行任務加快過程。

  • 我不認為問題出在我的腳本上。 在所有情況下,即使進行了完美的優化,我也不會按照自己想要的速度走。

  • 我通過使用帶有withotu代理的腳本進行刮擦進行了評估,但是區別很小。.不明顯。

我的結論是,我需要使用專用服務器,但是如果我不確定,我不想每月投資100美元,這樣就可以解決問題,並且我能夠運行大量的cron任務/ mysql數據庫沒有問題。

非常簡單...永遠不要在同一URL上發送多線程。 可能有許多不同的URL。 但是,請嘗試遵守一定的超時時間。 您可以執行以下操作:

sleep($random);  $random = random(15, 35) ; // in seconds

我將不得不查看代碼,但從本質上講,它的確像是主機受到速率限制。

是否可以每隔一分鍾或兩分鍾運行一次cron,但在腳本中將這些剪貼簿批處理到一個SQL connect中呢?

本質上,目標是打開sql套接字一次,並在連接上運行多個URL抓取,而當前每個mysql連接一次抓取,希望避免主機對速率的限制。

偽代碼:

<?php
$link = mysqli_connect("127.0.0.1", "my_user", "my_password", "my_db");
$sql = "SELECT url FROM urls_table WHERE scraped='0' LIMIT 100";
$result = mysqli_query($link, $sql);
while($row = mysqli_fetch_array($result, MYSQLI_NUM)){
    $url_to_scrape = $row[0];
    //TODO: your scrape code goes here
}
//Only AFTER you've scraped multiple URLs do we close the connection
//this will drastically reduce the number of SQL connects and should help
mysqli_close($link);
?>

暫無
暫無

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

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