>백엔드 개발 >PHP 튜토리얼 >PHP 간단한 크롤러

PHP 간단한 크롤러

大家讲道理
大家讲道理원래의
2018-05-14 14:45:458851검색

심플한 크롤러 디자인

소개

크롤러라고 하기에는 좀 과장된 부분이 있지만 이름이 딱 맞아서 앞에 심플이라는 단어를 붙여서
거세된 크롤러라는 걸 보여주고 있어요. 사용하거나 아직 놀아도 괜찮습니다.
회사에서는 최근 경쟁 제품의 데이터를 캡처하는 새로운 사업을 진행하고 있습니다. 이전 동급생이 작성한 캡처 시스템을 읽어보니 특정 문제가 있습니다.
규칙이 너무 강력하고 확장성과 다양성이 약간 다릅니다. 약간 약합니다. 이전 시스템에서는 목록을 만들고
이 목록에서 크롤링해야 했으며, 이는 크롤러의 결함이었습니다. 그래서
좀 더 일반적인 크롤러를 만들고, 깊이의 개념을 추가하고, 확장성과 일반성을 향상시키기로 결정했습니다.

Design

처리할 콘텐츠(URL, 사용자 이름 등)를 엔터티라고 부르기로 합의했습니다.
확장성을 고려하여 queue 개념을 채택했습니다. 처리할 모든 엔터티는 처리될 때마다
큐에서 엔터티를 꺼내어 처리가 완료된 후 가져옵니다. 엔터티에 대한 새 엔터티는 대기열에 저장됩니다. 물론, 여기서
처리 프로그램이 불필요한 작업을 수행하지 않도록 스토리지 중복 제거 처리와 대기열 중복 제거 처리도 수행해야 합니다.

  +--------+ +-----------+ +----------+
  | entity | |  enqueue  | |  result  |
  |  list  | | uniq list | | uniq list|
  |        | |           | |          |
  |        | |           | |          |
  |        | |           | |          |
  |        | |           | |          |
  +--------+ +-----------+ +----------+

각 엔터티가 대기열에 들어갈 때 enqueue and requeue는 enqueue 엔터티 플래그를 1로 설정한 다음 더 이상 대기열에 들어가지 않습니다. 入队排重队列设置入队实体标志为一后边不再入队,当处理完
实体,得到结果数据,处理完结果数据之后将结果诗句标志如结果数据排重list 엔터티가 처리되면 결과 데이터가 얻어지고 결과가 나옵니다. 그런 다음 결과 구절을 결과 데이터 정렬 목록으로 표시합니다. 물론 여기에서
update처리도 할 수 있으며 코드가 호환될 수 있습니다.

                     +-------+                     |  开始 |                     +---+---+                         |                         v                     +-------+  enqueue deep为1的实体                     | init  |-------------------------------->                      +---+---+  set 已经入过队列 flag                         |                             v                        +---------+ empty queue  +------+            +------>| dequeue +------------->| 结束 |            |       +----+----+              +------+            |            |                                       |            |                                       |            |                                       |            v                                       |    +---------------+  enqueue deep为deep+1的实体                         |    | handle entity |------------------------------>             |    +-------+-------+  set 已经入过队列 flag                         |            |                                   |            |                                   |            v                                   |    +---------------+  set 已经处理过结果 flag            |    | handle result |-------------------------->             |    +-------+-------+                         |            |                                 +------------+


크롤링 전략(부정행위 방지 대응)

특정 웹사이트를 크롤링할 때 가장 두려운 것은 IP를 차단하고 프록시도 없으면 ㅋㅋㅋㅋㅋㅋ 따라서 크롤링 전략은 여전히 ​​매우 중요합니다.


크롤링하기 전에 크롤링할 웹사이트에 대한 관련 정보를 인터넷에서 검색하고, 이전에 크롤링한 적이 있는지 확인하고 경험을 흡수할 수 있습니다. 그런 다음 웹사이트 요청이 특별한 매개변수를 가져오는지 확인하기 위해 웹사이트 요청을 직접 주의 깊게 분석해야 합니까? 로그인되지 않은

상태

와 관련된
쿠키
가 있나요? 마지막으로 캡처 빈도를 최대한 높게 설정하려고 했습니다. 크롤링할 웹사이트에 로그인해야 하는 경우에는 일괄 계정을 등록한 다음 성공적인 로그인을 시뮬레이션하고 차례로 요청할 수 있습니다. 로그인에 인증 코드
가 필요한 경우 더욱 번거롭습니다. 수동으로 로그인을 시도한 다음 쿠키 방법을 저장할 수 있습니다(물론

가능하다면 OCR 인식을 시도해 볼 수도 있습니다). 물론, 로그인한 후에도 이전 단락에서 언급한 문제를 고려해야 합니다. 그렇다고 로그인한 후에 모든 것이 괜찮을 것이라는 의미는 아닙니다. 일부 웹사이트는 로그인 후 너무 자주 크롤링되면 계정이 차단됩니다.


그러니까 로그인이 필요 없는 방법을 찾아보세요. 차단된 계정에 로그인하고, 계정 신청하고, 계정 변경하는 게 번거롭거든요. 크롤링 데이터 소스 및 깊이

초기 데이터 소스 선택도 중요합니다. 제가 하고 싶은 것은 하루에 한 번 크롤링을 하는 것이기 때문에 크롤링 웹사이트가 매일 업데이트되어 초기화 작업이 완전 자동으로 이루어지고, 기본적으로 크롤링을 관리할 필요가 없는 곳을 찾고 있습니다. 매일 시작됩니다

업데이트가 자동으로 수행됩니다.

크롤링 깊이도 매우 중요합니다. 이는 특정 웹사이트, 요구 사항, 크롤링된 콘텐츠를 기반으로 결정되어야 하며 웹사이트의 데이터는 최대한 완벽하게 캡처되어야 합니다.

Optimization


프로덕션 환경에서 실행한 후 여러 곳이 변경되었습니다.

첫번째는 스택형 구조로 변경된 큐입니다. 이전 대기열에서는 항상 깊고 작은 엔터티가 먼저 실행되었기 때문에

이로 인해 대기열에 점점 더 많은 콘텐츠가 발생하고 메모리 공간이 커집니다. 이제
Recursive

엔티티를 처리합니다. 먼저 깊이를 지정하고 다음 엔터티로 진행합니다. 예를 들어 초기 10개 엔터티(deep=1)의 경우 최대 크롤링 깊이

는 3입니다. 각 엔터티 아래에는 10개의 하위 엔터티가 있으며 해당 대기열의 최대 길이는 다음과 같습니다.

    队列(lpush,rpop)              => 1000个
    修改之后的队列(lpush,lpop)   => 28个

위의 두 가지 방법으로 달성할 수 있습니다. 효과는 같지만 큐의 길이가 많이 다르다는 것을 알 수 있으므로 두 번째 방법으로 변경했습니다.

큐에 참가할 때 최대 깊이 제한이 처리됩니다. 최대 깊이를 초과하면 바로 폐기됩니다. 또한 예상치 못한 문제를 방지하기 위해 대기열의 최대 길이도 제한되었습니다.
Code
다음은 길고 지루한 코드입니다. 원래는
git

hub에 올리고 싶었지만 프로젝트 규모가 좀 작아서 친구들이 직접 올려볼까 생각 중입니다. 코드든 디자인이든 나쁜 점을 말할 수 있습니다.

아아아아

위 내용은 PHP 간단한 크롤러의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:PHP 오류 차폐 방법다음 기사:PHP 오류 차폐 방법