2

週に1回実行されるphpcronジョブスクリプトを作成しています

このスクリプトの主な目的は、TEDのサイトで利用できるすべてのTEDトークから詳細を取得することです(たとえば、この質問をより理解しやすくするため)

このスクリプトの実行には約70分かかり、2000を超えるWebページになります

私の質問は:

1)関数を使用して毎回Webページを取得するためのより良い/より速い方法があります:

file_get_contents_curl($ url)

2)すべての講演を配列で開催することをお勧めします(かなり大きくなる可能性があります)

3)たとえば、ウェブサイトからすべてのテッドトークの詳細を取得するための一般的なより良い方法はありますか?TEDのウェブサイトを「クロール」してすべての講演を聞くための最良の方法は何ですか

** rssフィードを使用するオプションを確認しましたが、必要な詳細が欠落しています。

ありがとう

<?php
define("START_ID", 1);
define("STOP_TED_QUERY",20);
define ("VALID_PAGE","TED | Talks");
/**
 * this script will run as a cron job and will go over all pages
 * on TED http://www.ted.com/talks/view/id/ 
 * from id 1 till there are no more pages
 */

/**
 * function get a file using curl (fast)
 * @param $url - url which we want to get its content
 * @return the data of the file
 * @author XXXXX
 */
function file_get_contents_curl($url)
{
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

    $data = curl_exec($ch);
    curl_close($ch);

    return $data;
}

//will hold all talks in array
$tedTalks = array();

//id to start the query from
$id=START_ID;

//will indicate when needed to stop the query beacuse reached the end id's on TED website
$endOFQuery=0;

//get the time
$time_start = microtime(true);

//start the query on TED website
//if we will query 20 pages in a row that do not exsist we will stop the querys and assume there are no more
while ($endOFQuery < STOP_TED_QUERY){

    //get the page of the talk
    $html = file_get_contents_curl("http://www.ted.com/talks/view/id/$id");

    //parsing begins here:
    $doc = new DOMDocument();
    @$doc->loadHTML($html);
    $nodes = $doc->getElementsByTagName('title');

    //get and display what you need:
    $title = $nodes->item(0)->nodeValue;


    //check if this a valid page
    if (! strcmp ($title , VALID_PAGE ))
        //this is a removed ted talk or the end of the query so raise a flag (if we get anough of these in a row we will stop)
        $endOFQuery++;
    else {
        //this is a valid TED talk get its details

        //reset the flag for end of query
        $endOFQuery = 0;

        //get meta tags
        $metas = $doc->getElementsByTagName('meta');

        //get the tag we need (keywords)
        for ($i = 0; $i < $metas->length; $i++)
        {
            $meta = $metas->item($i);
            if($meta->getAttribute('name') == 'keywords')
                $keywords = $meta->getAttribute('content');
        }

        //create new talk object and populate it
        $talk = new Talk();
        //set its ted id from ted web site
        $talk->setID($id);
        //parse the name (name has un-needed char's in the end)
        $talk->setName( substr($title, 0, strpos( $title, '|')) );

        //parse the String of tags to array
        $keywords = explode(",", $keywords);
        //remove un-needed items from it
        $keywords=array_diff($keywords, array("TED","Talks"));

        //add the filters tags to the talk
        $talk->setTags($keywords);

        //add to the total talks array
        $tedTalks[]=$talk;
    }

    //move to the next ted talk ID to query
    $id++;
} //end of the while

$time_end = microtime(true);
$execution_time = ($time_end - $time_start);
echo "this took (sec) : ".$execution_time;

?>
4

1 に答える 1

3

github.comでWebクローラーのphpの例を入手しました

誰かがそれがどのように機能するかを探しているなら

https://github.com/Nimrod007/TED-talks-details-from-TED.com-and-youtube

このスクリプトを実装するMashapeでフリーミアムAPIを公開しましたhttps://market.mashape.com/bestapi/ted

楽しい!

于 2013-04-21T14:08:08.233 に答える