PHP で大量の Web ページを収集する効率的かつ実行可能な方法を見つけるのを手伝ってください。
Jun 23, 2016 pm 01:50 PM PHP の CURL を使用して、Xiami.com から音楽情報を収集したいと考えています。
しかし、それは非常に遅く、50 個ほど収集すると、Web ページが 2 回目に実行されると収集できなくなります。収集は許可されていないため、基本的にデータの収集は非常に遅くなります。
この種のビッグデータはどのように収集すればよいでしょうか?
私のコードに問題がある可能性もあります。
以下はコードの一部です。
$j=0; //起始ID $id = 200000; //采集1000条 //保存采集的数据 $data = array(); while($j<1000){ $url = 'http://www.xiami.com/song/'.($id++); $ch = curl_init(); $status = curl_getinfo($ch); ///$status['redirect_url'] ;// 跳转到的新地址 $header[]='Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'; $header[]='Accept-Encoding:gzip,deflate,sdch'; $header[]='Accept-Language:zh-CN,zh;q=0.8'; $header[]='Cache-Control:max-age=0'; $header[]='Connection:keep-alive'; $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'; $header[]='Host:www.xiami.com'; $header[]='User-Agent:Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1653.0 Safari/537.36'; curl_setopt($ch, CURLOPT_URL, $url); //要访问的地址 curl_setopt($ch, CURLOPT_HTTPHEADER, $header); //设置http头 curl_setopt($ch, CURLOPT_HEADER, 0); //显示返回的Header区域内容 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //获取的信息以文件流的形式返回 curl_setopt($ch, CURLOPT_TIMEOUT, 20); //设置超时限制防止死循环 $content = curl_exec($ch); //执行操作 $curl_errno = curl_errno($ch); $curl_error = curl_error($ch); curl_close($ch); //关闭CURL会话 preg_match('/name="description"\s+content="《(.+)》演唱者(.+),所属专辑《(.+)》/', $content,$matches); //如果歌曲名字为空,跳过 if(empty($matches[1]) || trim($matches[1]) == ''){ continue; } //匹配出的数据 $data[$id]['song'] = empty($matches[1])?' ':$matches[1]; $data[$id]['songer'] = empty($matches[2])?' ':$matches[2]; $data[$id]['album'] = empty($matches[3])?' ':$matches[3]; preg_match('/album\/(\d+)/', $content,$matches); $data[$id]['albumId'] = empty($matches[1])?0:$matches[1]; preg_match('/\/artist\/(\d+)/', $content,$matches); $data[$id]['songerId'] = empty($matches[1])?0:$matches[1]; //歌词<div class="lrc_main"> preg_match('/<div class="lrc_main">(.*)<\/div>/Us', $content,$matches); $data[$id]['lrc'] = empty($matches[1])?' ':addslashes($matches[1]); //分享 分享<em>(3269)</em> preg_match('/分享<em>\((\d+)\)<\/em>/Us', $content,$matches); $data[$id]['share'] = empty($matches[1]) ? 0:$matches[1]; //评论次数 <p class="wall_list_count"><span>920 preg_match('/<p class="wall_list_count"><span>(\d+)<\/span>/Us', $content,$matches); $data[$id]['comment_count'] = empty($matches[1])?0:$matches[1]; //入库操作 //print_r($data); //_____________________________ $j++; usleep(3000); }
ディスカッション (解決策) に返信
親愛なる、スヌーピー クラスを使用してください
親愛なる、Ruby または Go を使用してください
冗談です、走りたくても、まだ間に合うでしょうコマンド行パターン 実行...
xiami.com サーバーには制限があり、収集が禁止されているはずです
1. URL リクエストごとに 10 ~ 20 ダースのみを収集し、その後ジャンプして収集を続けることができます。ページのタイムアウトも防ぎます。仮想マシン上で実行して CPU を長時間使用すると、プロセスが強制終了される可能性があります。
2. ヘッダーのユーザー エージェントと Cookie を変更することをお勧めします。各 URL リクエストの。
3. それでもダメなら機関車を使ってみてください!
4. 電車が動かないなら、この駅は諦めてください!
同じページを実行するには foreach をループに分割します。
ブラウザまたは cronrab が完了後に毎回 http://localhost/caiji.php?num=1 を実行するとき、 $_GET[' の後に、curl は同じスクリプトを繰り返し実行します。 num']==1000、終了し、curl は実行されなくなります。
れーい

人気の記事

人気の記事

ホットな記事タグ

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法
