ホームページ > バックエンド開発 > PHPチュートリアル > PHP を使用してデータを非同期的にクロールする方法の簡単な分析

PHP を使用してデータを非同期的にクロールする方法の簡単な分析

リリース: 2023-04-11 10:00:01
転載
3914 人が閲覧しました

クローラーと言えば、多くの人は Python クローラーを思い浮かべるでしょう。Python クローラーには大きな利点があるからです。しかし、実は PHP を使用してデータを非同期にクロールすることもできるので、PHP を使用してデータを非同期にクロールする方法を紹介します。

PHP を使用してデータを非同期的にクロールする方法の簡単な分析

Web クローラーとは何ですか?

Web クローラーは、Web ページを自動的に抽出するプログラムです。検索エンジンのために World Wide Web から Web ページをダウンロードし、検索エンジンの重要なコンポーネントです。従来のクローラーは、1 つまたは複数の最初の Web ページの URL から開始し、最初の Web ページ上の URL を取得します。Web ページをクロールするプロセス中、現在のページから新しい URL を継続的に抽出し、特定の URL が得られるまでキューに入れます。システムの停止条件が満たされています。

クローラーの用途は何ですか?

  • 一般的な検索エンジンの Web ページ コレクターとして。 (google、baidu)

  • 垂直型検索エンジンを構築します。

  • 科学研究: オンライン人間行動、オンライン コミュニティ進化、人間動態研究、計量社会学、複雑なネットワーク、データマイニングなどの分野における実証研究はすべて大量のデータを必要とし、Web クローラーは関連データを収集するための強力なツールです。

  • #覗き見、ハッキング、スパム送信...

QueryList の概要と機能 #QueryList は、phpQuery に基づいた、シンプルでエレガント、スケーラブルな PHP 収集ツール (クローラー) のセットです。

機能:

    jQuery とまったく同じ CSS3 DOM セレクターを備えています
  • jQuery API とまったく同じ DOM 操作を備えています
  • には、ユニバーサル リスト コレクション ソリューションがあります。
  • には、シミュレートされたログイン、偽のブラウザ、HTTP プロキシを簡単に実装できる強力な HTTP リクエスト スイートがあります。その他の複雑なネットワーク リクエスト
  • 文字化けの解決策
  • 強力なコンテンツ フィルタリング機能があり、jQuey セレクターを使用してコンテンツをフィルタリングできます
  • 高度なモジュール設計と強力なスケーラビリティを備えている
  • 表現力豊かな API
  • 高品質を備えているドキュメント
  • #豊富なプラグインを備えています
  • #プロフェッショナルな Q&A コミュニティとコミュニケーション グループを備えています

  • Through

マルチスレッド コレクション

  • 画像のローカリゼーション

  • 次のようなブラウザの動作をシミュレートします: フォームフォームの送信

  • Web クローラー

  • 環境要件

PHP >= 7.0

PHP バージョンがまだ PHP5 のままである場合、または Composer の使用方法がわからない場合は、QueryList3 の使用を選択できます。QueryList3 は php5 をサポートします。 3および手動インストール。 QueryList3 ドキュメント: http://v3.querylist.cc

インストール

Composer によるインストール:

composer require jaeger/querylist
ログイン後にコピー

Use

要素操作「Nitu.com」のすべての画像アドレスを収集

QueryList::get('http://www.nipic.com')->find('img')->attrs('src');
ログイン後にコピー

Baidu 検索結果を収集

$ql = QueryList::get('http://www.baidu.com/s?wd=QueryList');

$ql->find('title')->text(); // 获取网站标题
$ql->find('meta[name=keywords]')->content; // 获取网站头部关键词

$ql->find('h3>a')->texts(); //获取搜索结果标题列表
$ql->find('h3>a')->attrs('href'); //获取搜索结果链接列表

$ql->find('img')->src; //获取第一张图片的链接地址
$ql->find('img:eq(1)')->src; //获取第二张图片的链接地址
$ql->find('img')->eq(2)->src; //获取第三张图片的链接地址
// 遍历所有图片
$ql->find('img')->map(function($img){
    echo $img->alt;  //打印图片的alt属性
});
ログイン後にコピー

その他の使用方法

$ql->find(&#39;#head&#39;)->append(&#39;<div>追加内容</div>&#39;)->find(&#39;div&#39;)->htmls();
$ql->find(&#39;.two&#39;)->children(&#39;img&#39;)->attrs(&#39;alt&#39;); //获取class为two元素下的所有img孩子节点
//遍历class为two元素下的所有孩子节点
$data = $ql->find(&#39;.two&#39;)->children()->map(function ($item){
    //用is判断节点类型
    if($item->is(&#39;a&#39;)){
        return $item->text();
    }elseif($item->is(&#39;img&#39;))
    {
        return $item->alt;
    }
});

$ql->find(&#39;a&#39;)->attr(&#39;href&#39;, &#39;newVal&#39;)->removeClass(&#39;className&#39;)->html(&#39;newHtml&#39;)->...
$ql->find(&#39;div > p&#39;)->add(&#39;div > ul&#39;)->filter(&#39;:has(a)&#39;)->find(&#39;p:first&#39;)->nextAll()->andSelf()->...
$ql->find(&#39;div.old&#39;)->replaceWith( $ql->find(&#39;div.new&#39;)->clone())->appendTo(&#39;.trash&#39;)->prepend(&#39;Deleted&#39;)->...
ログイン後にコピー

リスト収集

百度検索結果リストのタイトルとリンクを収集:

$data = QueryList::get(&#39;http://www.baidu.com/s?wd=QueryList&#39;)
    // 设置采集规则
    ->rules([ 
        &#39;title&#39;=>array(&#39;h3&#39;,&#39;text&#39;),
        &#39;link&#39;=>array(&#39;h3>a&#39;,&#39;href&#39;)
    ])
    ->query()->getData();

print_r($data->all());
ログイン後にコピー
収集結果:

Array
(
    [0] => Array
        (
            [title] => QueryList|基于phpQuery的无比强大的PHP采集工具
            [link] => http://www.baidu.com/link?url=GU_YbDT2IHk4ns1tjG2I8_vjmH0SCJEAPuuZN
        )
    [1] => Array
        (
            [title] => PHP 用QueryList抓取网页内容 - wb145230 - 博客园
            [link] => http://www.baidu.com/link?url=zn0DXBnrvIF2ibRVW34KcRVFG1_bCdZvqvwIhUqiXaS
        )
    [2] => Array
        (
            [title] => 介绍- QueryList指导文档
            [link] => http://www.baidu.com/link?url=pSypvMovqS4v2sWeQo5fDBJ4EoYhXYi0Lxx
        )
        //...
)
ログイン後にコピー

エンコード変換

// 输出编码:UTF-8,输入编码:GB2312
QueryList::get(&#39;https://top.etao.com&#39;)->encoding(&#39;UTF-8&#39;,&#39;GB2312&#39;)->find(&#39;a&#39;)->texts();

// 输出编码:UTF-8,输入编码:自动识别
QueryList::get(&#39;https://top.etao.com&#39;)->encoding(&#39;UTF-8&#39;)->find(&#39;a&#39;)->texts();
ログイン後にコピー

HTTP ネットワーク操作

Cookie を使用して Sina Weibo にログイン

//采集新浪微博需要登录才能访问的页面
$ql = QueryList::get(&#39;http://weibo.com&#39;,&#39;param1=testvalue & params2=somevalue&#39;,[
    &#39;headers&#39; => [
        //填写从浏览器获取到的cookie
        &#39;Cookie&#39; => &#39;SINAGLOBAL=546064; wb_cmtLike_2112031=1; wvr=6;....&#39;
    ]
]);
//echo $ql->getHtml();
echo $ql->find(&#39;title&#39;)->text();
//输出: 我的首页 微博-随时随地发现新鲜事
ログイン後にコピー
HTTP プロキシを使用

$urlParams = [&#39;param1&#39; => &#39;testvalue&#39;,&#39;params2&#39; => &#39;somevalue&#39;];
$opts = [
    // 设置http代理
    &#39;proxy&#39; => &#39;http://222.141.11.17:8118&#39;,
    //设置超时时间,单位:秒
    &#39;timeout&#39; => 30,
     // 伪造http头
    &#39;headers&#39; => [
        &#39;Referer&#39; => &#39;https://querylist.cc/&#39;,
        &#39;User-Agent&#39; => &#39;testing/1.0&#39;,
        &#39;Accept&#39;     => &#39;application/json&#39;,
        &#39;X-Foo&#39;      => [&#39;Bar&#39;, &#39;Baz&#39;],
        &#39;Cookie&#39;    => &#39;abc=111;xxx=222&#39;
    ]
];
$ql->get(&#39;http://httpbin.org/get&#39;,$urlParams,$opts);
// echo $ql->getHtml();
ログイン後にコピー

模擬ログイン

// 用post登录
$ql = QueryList::post(&#39;http://xxxx.com/login&#39;,[
    &#39;username&#39; => &#39;admin&#39;,
    &#39;password&#39; => &#39;123456&#39;
])->get(&#39;http://xxx.com/admin&#39;);
//采集需要登录才能访问的页面
$ql->get(&#39;http://xxx.com/admin/page&#39;);
//echo $ql->getHtml();
ログイン後にコピー

フォーム フォームの操作

GitHub へのログインをシミュレートする

// 获取QueryList实例
$ql = QueryList::getInstance();
//获取到登录表单
$form = $ql->get(&#39;https://github.com/login&#39;)->find(&#39;form&#39;);

//填写GitHub用户名和密码
$form->find(&#39;input[name=login]&#39;)->val(&#39;your github username or email&#39;);
$form->find(&#39;input[name=password]&#39;)->val(&#39;your github password&#39;);

//序列化表单数据
$fromData = $form->serializeArray();
$postData = [];
foreach ($fromData as $item) {
    $postData[$item[&#39;name&#39;]] = $item[&#39;value&#39;];
}

//提交登录表单
$actionUrl = &#39;https://github.com&#39;.$form->attr(&#39;action&#39;);
$ql->post($actionUrl,$postData);
//判断登录是否成功
// echo $ql->getHtml();
$userName = $ql->find(&#39;.header-nav-current-user>.css-truncate-target&#39;)->text();
if($userName)
{
    echo &#39;登录成功!欢迎你:&#39;.$userName;
}else{
    echo &#39;登录失败!&#39;;
}
ログイン後にコピー

バインド関数拡張機能

myHttp メソッドをカスタマイズする:

$ql = QueryList::getInstance();

//绑定一个myHttp方法到QueryList对象
$ql->bind(&#39;myHttp&#39;,function ($url){
    $html = file_get_contents($url);
    $this->setHtml($html);
    return $this;
});

//然后就可以通过注册的名字来调用
$data = $ql->myHttp(&#39;https://toutiao.io&#39;)->find(&#39;h3 a&#39;)->texts();
print_r($data->all());
ログイン後にコピー
または、実装をクラスにカプセル化し、次のようにバインドします。

$ql->bind(&#39;myHttp&#39;,function ($url){
    return new MyHttp($this,$url);
});
ログイン後にコピー

プラグインの使用法

CURL マルチスレッド プラグインを使用します。マルチスレッド コレクション GitHub ランキング :

$ql = QueryList::use(CurlMulti::class);
$ql->curlMulti([
    &#39;https://github.com/trending/php&#39;,
    &#39;https://github.com/trending/go&#39;,
    //.....more urls
])
 // 每个任务成功完成调用此回调
 ->success(function (QueryList $ql,CurlMulti $curl,$r){
    echo "Current url:{$r[&#39;info&#39;][&#39;url&#39;]} \r\n";
    $data = $ql->find(&#39;h3 a&#39;)->texts();
    print_r($data->all());
})
 // 每个任务失败回调
->error(function ($errorInfo,CurlMulti $curl){
    echo "Current url:{$errorInfo[&#39;info&#39;][&#39;url&#39;]} \r\n";
    print_r($errorInfo[&#39;error&#39;]);
})
->start([
    // 最大并发数
    &#39;maxThread&#39; => 10,
    // 错误重试次数
    &#39;maxTry&#39; => 3,
]);
ログイン後にコピー
詳細については、GitHub を確認してください: https://github.com/jae-jae/QueryList

推奨学習: "

PHP ビデオ チュートリアル

"

以上がPHP を使用してデータを非同期的にクロールする方法の簡単な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:PHP自学中心
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート