>  기사  >  백엔드 개발  >  PHP를 사용하여 비동기적으로 데이터를 크롤링하는 방법에 대한 간략한 분석

PHP를 사용하여 비동기적으로 데이터를 크롤링하는 방법에 대한 간략한 분석

青灯夜游
青灯夜游앞으로
2023-01-12 20:02:333874검색

크롤러라고 하면 많은 사람들이 Python 크롤러를 떠올릴 것입니다. 왜냐하면 Python 크롤러에는 큰 장점이 있기 때문입니다. 그러나 실제로 PHP를 사용하여 비동기적으로 데이터를 크롤링할 수도 있습니다. PHP를 사용하여 비동기적으로 데이터를 크롤링하는 방법을 소개하겠습니다.

PHP를 사용하여 비동기적으로 데이터를 크롤링하는 방법에 대한 간략한 분석

웹 크롤러란 무엇인가요?

웹 크롤러는 검색 엔진용 World Wide Web에서 웹 페이지를 자동으로 추출하는 프로그램이며 검색 엔진의 중요한 구성 요소입니다. 기존 크롤러는 하나 또는 여러 개의 초기 웹페이지의 URL에서 시작하여 웹페이지를 크롤링하는 동안 현재 페이지에서 새로운 URL을 지속적으로 추출하여 특정 URL이 나올 때까지 대기열에 넣습니다. 시스템의 정지 조건이 충족되었습니다.

크롤러는 어떤 용도로 사용되나요?

  • 범용 검색 엔진 웹 페이지 수집기 역할을 합니다. (google, baidu)

  • 수직 검색 엔진을 구축하세요.

  • 과학 연구: 온라인 인간 행동, 온라인 커뮤니티 진화, 인간 역학 연구, 계량경제학, 복잡한 네트워크, 데이터 마이닝 및 기타 실증 연구 분야 모두 많은 양의 데이터가 필요하며 웹 크롤러는 관련 데이터를 수집하는 강력한 도구입니다.

  • 훔쳐보기, 해킹, 스팸 보내기...

QueryList 소개 및 기능

QueryList는 phpQuery를 기반으로 하는 간단하고 우아하며 확장 가능한 PHP 수집 도구(크롤러) 세트입니다.

기능:

  • jQuery와 정확히 동일한 CSS3 DOM 선택기가 있습니다. 시뮬레이션된 로그인, 가짜 브라우저, HTTP 프록시 등과 같은 복잡한 네트워크 요청을 쉽게 구현합니다.

  • 잘못된 솔루션이 있습니다.

  • 강력한 콘텐츠 필터링 기능이 있으며 jQuey 선택기를 사용하여 콘텐츠를 필터링할 수 있습니다

  • 있음 고도로 모듈화된 디자인과 강력한 확장성

  • 표현력이 풍부한 API가 있습니다

  • 고품질 문서가 있습니다

  • 풍부한 플러그인이 있습니다

  • 전문적인 Q&A 커뮤니티와 커뮤니케이션 그룹이 있습니다

  • 플러그인을 통해 다음과 같은 작업을 쉽게 수행할 수 있습니다.

  • 멀티 스레드 수집

  • 이미지 현지화

다음과 같은 브라우저 동작 시뮬레이션: 양식 제출

  • 웹 크롤러

  • 환경 요구 사항
  • PHP >= 7.0

  • PHP 버전이 여전히 PHP5에서 멈춰 있거나 Composer 사용 방법을 모르는 경우 php5.3을 지원하는 QueryList3을 사용하도록 선택할 수 있습니다. 수동 설치. QueryList3 문서: http://v3.querylist.cc

Installation

Composer를 통한 설치:

composer require jaeger/querylist

QueryList::get('http://www.nipic.com')->find('img')->attrs('src');

요소 연산

을 사용하여 "NiTu.com"

$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属性
});

의 모든 이미지 주소를 수집합니다. Baidu 검색 결과 수집

$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());

목록 수집

Baidu 검색 결과 목록의 제목 및 링크 수집:

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();

인코딩 변환

//采集新浪微博需要登录才能访问的页面
$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 네트워크 운영

자동차 리 쿠키 Sina Weibo에 로그인

$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();

Http 프록시 사용

// 用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();

로그인 시뮬레이션

// 获取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;;
}
양식 양식 작업

GitHub에 대한 로그인 시뮬레이션

$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());

Bind 함수 확장

myHttp 메서드 확장 사용자 정의:

$ql->bind(&#39;myHttp&#39;,function ($url){
    return new MyHttp($this,$url);
});

or put 구현 본문은 클래스로 캡슐화되고 다음과 같이 바인딩됩니다.

$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,
]);

플러그인 사용

CURL 멀티 스레드 플러그인, 멀티 스레드 컬렉션 사용 GitHub 순위:

rrreee

For 자세한 내용은 GitHub를 확인하세요: https://github.com /jae-jae/QueryList

추천 학습: "

PHP 비디오 튜토리얼"

위 내용은 PHP를 사용하여 비동기적으로 데이터를 크롤링하는 방법에 대한 간략한 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 PHP自学中心에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제