크롤러라고 하기에는 좀 과장된 부분이 있지만 이름이 딱 맞아서 앞에 심플이라는 단어를 붙여서
거세된 크롤러라는 걸 보여주고 있어요. 사용하거나 아직 놀아도 괜찮습니다.
회사에서는 최근 경쟁 제품의 데이터를 캡처하는 새로운 사업을 진행하고 있습니다. 이전 동급생이 작성한 캡처 시스템을 읽어보니 특정 문제가 있습니다.
규칙이 너무 강력하고 확장성과 다양성이 약간 다릅니다. 약간 약합니다. 이전 시스템에서는 목록을 만들고
이 목록에서 크롤링해야 했으며, 이는 크롤러의 결함이었습니다. 그래서
좀 더 일반적인 크롤러를 만들고, 깊이의 개념을 추가하고, 확장성과 일반성을 향상시키기로 결정했습니다.
처리할 콘텐츠(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 |--------------------------> | +-------+-------+ | | +------------+
크롤링하기 전에 크롤링할 웹사이트에 대한 관련 정보를 인터넷에서 검색하고, 이전에 크롤링한 적이 있는지 확인하고 경험을 흡수할 수 있습니다. 그런 다음 웹사이트 요청이 특별한 매개변수를 가져오는지 확인하기 위해 웹사이트 요청을 직접 주의 깊게 분석해야 합니까? 로그인되지 않은
와 관련된
쿠키
가 있나요? 마지막으로 캡처 빈도를 최대한 높게 설정하려고 했습니다. 크롤링할 웹사이트에 로그인해야 하는 경우에는 일괄 계정을 등록한 다음 성공적인 로그인을 시뮬레이션하고 차례로 요청할 수 있습니다. 로그인에 인증 코드
가 필요한 경우 더욱 번거롭습니다. 수동으로 로그인을 시도한 다음 쿠키 방법을 저장할 수 있습니다(물론
그러니까 로그인이 필요 없는 방법을 찾아보세요. 차단된 계정에 로그인하고, 계정 신청하고, 계정 변경하는 게 번거롭거든요. 크롤링 데이터 소스 및 깊이
초기 데이터 소스 선택도 중요합니다. 제가 하고 싶은 것은 하루에 한 번 크롤링을 하는 것이기 때문에 크롤링 웹사이트가 매일 업데이트되어 초기화 작업이 완전 자동으로 이루어지고, 기본적으로 크롤링을 관리할 필요가 없는 곳을 찾고 있습니다. 매일 시작됩니다
프로덕션 환경에서 실행한 후 여러 곳이 변경되었습니다.
이로 인해 대기열에 점점 더 많은 콘텐츠가 발생하고 메모리 공간이 커집니다. 이제
Recursive
队列(lpush,rpop) => 1000个 修改之后的队列(lpush,lpop) => 28个
위의 두 가지 방법으로 달성할 수 있습니다. 효과는 같지만 큐의 길이가 많이 다르다는 것을 알 수 있으므로 두 번째 방법으로 변경했습니다.
큐에 참가할 때 최대 깊이 제한이 처리됩니다. 최대 깊이를 초과하면 바로 폐기됩니다. 또한 예상치 못한 문제를 방지하기 위해 대기열의 최대 길이도 제한되었습니다.
Code
다음은 길고 지루한 코드입니다. 원래는
git
아아아아
위 내용은 PHP 간단한 크롤러의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!