회사의 분산형 딥 웹 크롤러로 활동하면서 수천 개의 크롤러에 효과적인 프록시를 제공하기 위해 안정적인 프록시 풀 서비스를 구축했습니다. 이를 통해 각 크롤러가 해당 웹 사이트에 대해 유효한 프록시 IP를 얻도록 보장함으로써 크롤러가 빠르고 안정적으로 실행되므로 무료 리소스를 사용하여 간단한 프록시 풀 서비스를 구축하고 싶습니다.
회사의 분산형 딥 웹 크롤러로 활동하면서 수천 개의 크롤러에 효과적인 프록시를 제공하기 위해 안정적인 프록시 풀 서비스를 구축하여 각 크롤러가 해당 웹사이트에 대해 유효한 프록시 IP를 얻도록 했습니다. 이를 통해 크롤러의 빠르고 안정적인 작동을 보장합니다. 물론 회사에서 만든 것들은 오픈 소스로 제공할 수 없습니다. 하지만 여가 시간에 가려움을 느끼기 때문에 무료 리소스를 사용하여 간단한 프록시 풀 서비스를 구축하고 싶습니다.
1.질문
프록시 IP는 어디서 나오나요?
처음 혼자서 크롤링을 배웠을 때는 프록시 IP가 없어서 Xisha, Quick Proxy 등 무료 프록시가 있는 웹사이트를 방문하여 크롤링할 수 있는 프록시가 아직 남아 있습니다. 물론 더 나은 프록시 인터페이스가 있다면 직접 연결할 수도 있습니다. 무료 프록시 컬렉션도 매우 간단합니다. 페이지 방문 페이지 —> 일반/xpath 추출 —> 저장
프록시의 품질을 보장하는 방법은 무엇입니까?
대부분의 무료 프록시 IP를 사용할 수 없는 것은 확실합니다. 그렇지 않으면 왜 다른 사람들이 유료 IP를 제공합니까(그러나 많은 에이전트의 유료 IP는 안정적이지 않고 대부분을 사용할 수 없다는 것이 사실입니다). 따라서 수집된 프록시 IP를 직접 사용할 수는 없습니다. 이러한 프록시를 지속적으로 사용하도록 탐지 프로그램을 작성하여 안정적인 웹 사이트에 접속하여 정상적으로 사용할 수 있는지 확인할 수 있습니다. 프록시 감지는 느린 프로세스이므로 이 프로세스는 다중 스레드이거나 비동기식일 수 있습니다.
수집된 프록시는 어떻게 보관하나요?
여기에서는 Redis 프록시를 위한 여러 데이터 구조를 지원하는 고성능 NoSQL 데이터베이스 SSDB를 추천해야 합니다. 대기열, 해시, 집합, k-v 쌍 및 T 수준 데이터를 지원합니다. 분산 크롤러를 위한 매우 훌륭한 중간 저장 도구입니다.
크롤러가 이러한 프록시를 더 쉽게 사용할 수 있도록 하려면 어떻게 해야 합니까?
대답은 당연히 서비스로 만드는 것입니다. Python에는 웹 프레임워크가 너무 많습니다. 하나를 선택하고 크롤러가 호출할 API를 작성하세요. 예를 들어, 크롤러가 에이전트를 사용할 수 없음을 발견하면 API를 통해 에이전트 IP를 적극적으로 삭제할 수 있습니다. 에이전트 풀 IP가 충분하지 않음을 발견하면 에이전트 풀을 적극적으로 새로 고칠 수 있습니다. . 이는 탐지 프로그램보다 더 안정적입니다.
2. 프록시 풀 설계
프록시 풀은 네 부분으로 구성됩니다.
ProxyGetter:
프록시 획득 인터페이스는 현재 5개입니다. 무료 프록시 소스는 호출될 때마다 이 5개 웹사이트의 최신 프록시가 캡처되어 DB에 저장됩니다. 추가 프록시 획득 인터페이스를 직접 추가할 수 있습니다.
DB:
프록시 IP를 저장하는 것은 현재 SSDB만 지원합니다. SSDB를 선택하는 이유는 이 기사를 참조하세요. 저는 개인적으로 SSDB가 좋은 Redis 대안이라고 생각합니다. SSDB를 사용하지 않았다면 설치가 매우 간단합니다.
일정:
예약된 작업 사용자는 정기적으로 DB에서 에이전트 가용성을 확인하고 사용할 수 없는 에이전트를 삭제합니다. 동시에 ProxyGetter를 통해 최신 프록시를 가져와서 DB에 저장하는 작업도 수행합니다.
ProxyApi:
프록시 풀의 외부 인터페이스는 다음과 같습니다. 이제 상대적으로 간단해졌습니다. 저는 Flask를 살펴보는 데 2시간을 투자했습니다. 저는 Flask를 사용하여 결정을 내리게 되어 기뻤습니다. 이 기능은 크롤러가 직접 사용할 수 있도록 크롤러에 가져오기/삭제/새로 고침 및 기타 인터페이스를 제공하는 것입니다.
[HTML_REMOVED] 디자인
3. 코드 모듈
동적 Python의 상위 수준 데이터 구조 유형과 동적 바인딩 덕분에 신속한 애플리케이션 개발에 매우 적합하며 기존 소프트웨어 구성 요소를 연결하는 접착 언어로도 적합합니다. 이 프록시 IP 풀을 생성하기 위해 Python을 사용하는 것도 매우 간단합니다.
Api: api 인터페이스 관련 코드는 현재 Flask로 구현되어 있습니다. 단순한. 클라이언트 요청이 Flask로 전달되고 Flask는 get/delete/refresh/get_all
현재 프록시 풀은 프록시 관리만 담당합니다. . 향후에는 프록시 및 크롤러 바인딩, 에이전트 및 계정 바인딩 등 더 많은 기능이 있을 수 있습니다. get/delete/refresh/get_all
일정: 예약된 작업 관련 코드는 이제 예약된 새로 고침 코드만 구현하고 다중 프로세스 방법을 사용하여 사용 가능한 에이전트를 확인합니다.
Util: GetConfig
: 구성 파일 config.ini를 읽는 클래스, ConfigParse
: 대소문자를 구분하도록 ConfigParser
의 통합 재작성 클래스, : 싱글톤을 구현합니다. Singleton
: 클래스 속성의 지연 계산을 구현합니다. LazyProperty
코드 다운로드:
git clone git@github.com:jhao104/proxy_pool.git 或者直接到https://github.com/jhao104/proxy_pool 下载zip文件
종속성 설치:
pip install -r requirements.txt
시작:
需要分别启动定时任务和api 到Config.ini中配置你的SSDB 到Schedule目录下: >>>python ProxyRefreshSchedule.py 到Api目录下: >>>python ProxyApi.py
ProxyApi.py를 시작한 후 브라우저에서 사용할 수 있습니다. 인터페이스가 프록시를 가져오면 다음은 브라우저의 스크린샷입니다.
색인 페이지:import requests def get_proxy(): return requests.get("http://127.0.0.1:5000/get/").content def delete_proxy(proxy): requests.get("http://127.0.0.1:5000/delete/?proxy={}".format(proxy)) # your spider code def spider(): # .... requests.get('https://www.example.com', proxies={"http": "http://{}".format(get_proxy)}) # ....