ホームページ >バックエンド開発 >PHPチュートリアル >PHP で大量の Web ページを収集する効率的かつ実現可能な方法をお探しですか?

PHP で大量の Web ページを収集する効率的かつ実現可能な方法をお探しですか?

WBOY
WBOYオリジナル
2016-06-13 12:05:33795ブラウズ

PHP で大量の Web ページを収集する効率的かつ実行可能な方法を見つける方法についてアドバイスを求めてください

この投稿は、oasisxp によって最終編集されました: 2014-08-25 13:45:08 PHP の CURL を使用して、Xiami.com から音楽情報を収集します。
ただし、収集が 50 件程度になると停止し、2 回目に実行すると収集できなくなります。 IP、収集は許可されていないため、基本的にデータの収集は非常に遅いです。
この種のビッグデータはどのように収集すればよいでしょうか?
私のコードに問題がある可能性もあります。
以下はコードの一部です。
$j=0;<br />	//起始ID<br />	$id = 200000;<br />	//采集1000条<br />	//保存采集的数据<br />	$data = array();<br />	while($j<1000){<br />		$url = 'http://www.xiami.com/song/'.($id++);<br />		$ch = curl_init();<br />		$status = curl_getinfo($ch);<br />		///$status['redirect_url'] ;// 跳转到的新地址<br />		$header[]='Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8';<br />		$header[]='Accept-Encoding:gzip,deflate,sdch';<br />		$header[]='Accept-Language:zh-CN,zh;q=0.8';<br />		$header[]='Cache-Control:max-age=0';<br />		$header[]='Connection:keep-alive';<br />		$header[]='Cookie:_unsign_token=a35437bd35c221c09a0e6f564e17c225; __gads=ID=7fcc242f6fd63d77:T=1408774454:S=ALNI_Mae8MH6vL5z6q4NlGYzyqgD4jHeEg; bdshare_firstime=1408774454639; _xiamitoken=3541aab48832ba3ceb089de7f39b9b0f; pnm_cku822=211n%2BqZ9mgNqgJnCG0Zu8%2BzyLTPuc%2B7wbrff98%3D%7CnOiH84T3jPCG%2FIr%2BiPOG8lI%3D%7CneiHGXz6UeRW5k4rRCFXIkcoTdd7ym3fZdO2FrY%3D%7Cmu6b9JHlkuGa5pDqnOie5ZDkmeqb4ZTule6V7ZjjlOib7JrmkvdX%7Cm%2B%2BT%2FGIUew96DXsUYBd4HawbrTOXOVI4iyOLIYUqT%2B9P%7CmO6BH2wDcB9rHGsYdwRrH2gfbAN%2FDH8QZBNkF3gDeQqqCg%3D%3D%7Cme6d7oHyneiH84Twn%2BmR64TzUw%3D%3D; CNZZDATA921634=cnzz_eid%3D1437506062-1408774274-%26ntime%3D1408937320; CNZZDATA2629111=cnzz_eid%3D2021816723-1408774274-%26ntime%3D1408937320; isg=075E6FBDF77039CEB63A1BA239420244';<br />		$header[]='Host:www.xiami.com';<br />		$header[]='User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1653.0 Safari/537.36';<br /><br />		curl_setopt($ch, CURLOPT_URL, $url);	//要访问的地址<br />		curl_setopt($ch, CURLOPT_HTTPHEADER, $header);	//设置http头<br />		curl_setopt($ch, CURLOPT_HEADER, 0);	//显示返回的Header区域内容<br />		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);	//获取的信息以文件流的形式返回<br />		curl_setopt($ch, CURLOPT_TIMEOUT, 20);	//设置超时限制防止死循环<br />		$content = curl_exec($ch);	//执行操作<br />		$curl_errno = curl_errno($ch);<br />		$curl_error = curl_error($ch);<br />		curl_close($ch);	//关闭CURL会话<br />		preg_match('/name="description"\s+content="《(.+)》演唱者(.+),所属专辑《(.+)》/', $content,$matches);<br />		//如果歌曲名字为空,跳过<br />		if(empty($matches[1]) || trim($matches[1]) == ''){<br />			continue;<br />		}<br />		<br />		//匹配出的数据<br />		$data[$id]['song'] = empty($matches[1])?' ':$matches[1];<br />		$data[$id]['songer'] = empty($matches[2])?' ':$matches[2];<br />		$data[$id]['album'] = empty($matches[3])?' ':$matches[3];<br />		<br />		preg_match('/album\/(\d+)/', $content,$matches);<br /><br />		$data[$id]['albumId'] = empty($matches[1])?0:$matches[1];<br /><br />		preg_match('/\/artist\/(\d+)/', $content,$matches);<br />		$data[$id]['songerId'] = empty($matches[1])?0:$matches[1];<br /><br />		//歌词<div class="lrc_main"><br />		preg_match('/<div class="lrc_main">(.*)<\/div>/Us', $content,$matches);<br />		$data[$id]['lrc'] =  empty($matches[1])?' ':addslashes($matches[1]);<br />		//分享 分享<em>(3269)</em><br />		preg_match('/分享<em>\((\d+)\)<\/em>/Us', $content,$matches);<br />		$data[$id]['share'] =  empty($matches[1]) ? 0:$matches[1];<br />		//评论次数 <p class="wall_list_count"><span>920<br />		preg_match('/<p class="wall_list_count"><span>(\d+)<\/span>/Us', $content,$matches);<br />		$data[$id]['comment_count'] =  empty($matches[1])?0:$matches[1];<br /><br /><br />		//入库操作<br />		//print_r($data);<br />		//_____________________________<br />		$j++;<br />		usleep(3000);<br />	}





-----解決策------ - -
様、snoopy クラスを使用してください
-----解決策---------
この投稿の最終編集者は PhpNewnew 2014-08-27 22:09:20 Ruby または Go を使用してください

冗談ですが、逃げたくても逃げられます。それでも実行します コマンドラインモードで実行....
------解決策-----
xiami.com サーバーには制限があり、収集が禁止されているはずです

1. URL リクエストごとに 10 ~ 20 ダースのみを収集し、その後ジャンプして収集を続行することもできます。仮想マシン上で実行し、CPU を長時間使用すると、プロセスが強制終了される可能性があります。

2. ヘッダーのユーザー エージェントと Cookie を変更することをお勧めします。各 URL リクエスト。

3. それでもダメなら機関車を使ってみてください!

4. 電車が動かないなら、この駅は諦めてください!
------解決策---------
同じページを実行するために foreach をループに分割する。
ブラウザまたは cronrab が初めて http://localhost/caiji.php?num=1 を実行するとき、完了するたびに $_GET['num'] 1; と同じスクリプトが繰り返されます。 'num']==1000、終了し、curl は実行されなくなります。

if($_GET['num']){<br />$url = 'http://www.xiami.com/song/'.$_GET['num'];<br />//你的代码<br />$_GET['num'])++;<br />}<br />if($_GET['num']<1001){<br />        $ch = curl_init();<br />	curl_setopt($ch, CURLOPT_URL,"http://localhost/caiji.php?num=".$_GET['num']));<br />	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);<br />	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,2); <br />	curl_setopt($ch, CURLOPT_TIMEOUT ,2);<br />	curl_exec($ch);<br />	curl_close($ch);<br />}else{<br />   exit;<br />}<br />


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。