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

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

풀어 주다: 2023-04-11 10:00:01
앞으로
3914명이 탐색했습니다.

크롤러라고 하면 많은 사람들이 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으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿