파 이 썬 파충류 프레임 워 크 scrapy downloadermiddleware 설정 proxy 에이전트 기능 예시
8735 단어 Python파충 틀scrapy프 록 시 에이전트
1.배경:
소 편 은 파충류 일 때 반드시 봉쇄 되 는 상황 을 만 날 것 이다.어제 한 사이트 에 올 랐 는데 처음에는 됐 지만 settings 에 DEFAULT 를 설치 했다.REQUEST_HEADERS 는 자신 을 chrome 브 라 우 저 로 위장 하고 처음에는 가능 하 였 으 나 곧이어 상대방 서버 에 의 해 봉쇄 되 었 다.
에이전트:
대리 님,대리 님,홈 페이지 에 올 라 가서 기어 가 는 속 도 를 조금 만 늦 추 면 기본적으로 봉쇄 되 는 것 을 피 할 수 있다 고 생각 했 습 니 다.selenium 을 사용 할 수 있 지만 이 고 비 를 넘 어야 합 니 다.scrapy 의 대 리 는 사실 설정 이 간단 합 니 다.
주의,request.meta['proxy']=프 록 시 ip 의 API
middlewares.py
class HttpbinProxyMiddleware(object):
def process_request(self, request, spider):
pro_addr = requests.get('http://127.0.0.1:5000/get').text
request.meta['proxy'] = 'http://' + pro_addr
#request.meta['proxy'] = 'http://' + proxy_ip
시작 위 에 우리 가 쓴 이 프 록 시 설정settings.py
DOWNLOADER_MIDDLEWARES = {
'httpbin.middlewares.HttpbinProxyMiddleware': 543,
}
spidershttpbin_test.py
import scrapy
class HttpbinTestSpider(scrapy.Spider):
name = "httpbin_test"
allowed_domains = ["httpbin.ort/get"]
start_urls = ['http://httpbin.org/get']
def parse(self, response):
print(response.text)
origin 의 값 은 사실 로 컬 네트워크 주소 입 니 다.그러나 우 리 는 대 리 를 사 용 했 기 때문에 이곳 의 ip 은 미국의 ip 입 니 다.2.그러면 문제 가 생 겼 습 니 다.지금 이런 장면 이 있 습 니 다.앞에서 말 한 바 와 같이 저 는 모든 요청 에 프 록 시 풀 안의 프 록 시 IP 주 소 를 사용 합 니 다.그러나 일부 작업 은 프 록 시 IP 주소 가 필요 하지 않 습 니 다.그러면 어떻게 하면 시간 이 초과 되 었 을 때 프 록 시 풀 의 IP 주 소 를 사용 하여 다시 요청 할 수 있 습 니까?
spider:
1.우 리 는 모두 scrapy 의 기본 적 인 요구 절 차 는 먼저 부모 클래스(scrapy.Spider)안의
start_requests
방법 을 집행 하 는 것 을 알 고 있다.2.그리고
start_requests
방법 도 우리 가 설정 한start_urls
변수 안의 url 주 소 를 가 져 옵 니 다.3.마지막 에
make_requests_from_url
방법 을 실행 하고 하나의 url 변수 만 전달 합 니 다.그러면 우 리 는
make_requests_from_url
방법 을 다시 써 서scrapy.Request()
방법 을 직접 호출 할 수 있다.우 리 는 안의 몇 가지 인 자 를 간단하게 알 아 볼 수 있다.1.
url=url
사실은 마지막start_requests()
방법 에서 얻 은 url 주소 입 니 다.2.meta 여기 서 우 리 는 하나의 인자 만 설정 했다.
download_timeout:10
역할 은 첫 번 째 요청 을 할 때 10 초 를 기다 리 는 것 이다.요청 이 성공 하지 않 으 면 바로download_middleware
안의 방법 을 집행 하 는 것 이다.다음 에 소개 한다.3.콜 백 리 셋 함 수 는 바로 이번 모든 작업 이 끝 난 후에 실 행 된 작업 입 니 다.주의 하 세 요.여기 서 위의 모든 작업 을 수행 한 후에 이 작업 을 수행 하 는 것 이 아 닙 니 다.예 를 들 어 url 을 요청 하고 성공 하면 다음 에 이 방법 을 실행 할 것 입 니 다.
4.
dont_filter=False
이것 은 매우 중요 합 니 다.어떤 사람 이 추가 하지 않 으 면 기본 값 은 False 라 고 했 지만 친 측 은 반드시 추가 해 야 합 니 다.역할 은 바로 scrapy 가 기본 적 으로 무 거 운 방법 이 있 습 니 다.False 와 같 으 면 scrapy 의 재 작업 에 참가 하지 않 는 다 는 것 을 의미 합 니 다.친 측,한 페이지 를 요청 하고 첫 페이지 를 받 은 후 원 하 는 동작 을 캡 처 한 후 두 번 째 페이지 는 안 됩 니 다.그것 을 더 해 야 합 니 다.
import scrapy
class HttpbinTestSpider(scrapy.Spider):
name = "httpbin_test"
allowed_domains = ["httpbin.ort/get"]
start_urls = ['http://httpbin.org/get']
def make_requests_from_url(self,url):
self.logger.debug('Try first time')
return scrapy.Request(url=url,meta={'download_timeout':10},callback=self.parse,dont_filter=False)
def parse(self, response):
print(response.text)
middlewares.py다음은 위 에서 10 초 후에 시간 을 초과 하여 실행 할 것 을 요청 하 는 작업
process_exception
방법 입 니 다.세심 한 동창 회 는 우리 가 spider 파일 에서 log 를 출력 할 때 직접 출력 하 는 것 을 발견 할 수 있 습 니 다.그것 은 scrapy 가 이미 부모 클래스 에서 정 의 를 내 렸 기 때 문 입 니 다.직접 응용 하면 되 지만 middlewares 에서 자신 이 하나의 변 수 를 정의 해 야 인용 을 사용 할 수 있 습 니 다.
class HttpbinProxyMiddleware(object):
logger = logging.getLogger(__name__)
# def process_request(self, request, spider):
# # pro_addr = requests.get('http://127.0.0.1:5000/get').text
# # request.meta['proxy'] = 'http://' + pro_addr
# pass
#
# def process_response(self, request, response, spider):
# # response , ( )
# pass
def process_exception(self, request, response, spider):
self.logger.debug('Try Exception time')
self.logger.debug('Try second time')
proxy_addr = requests.get('http://127.0.0.1:5000/get').text
self.logger.debug(proxy_addr)
request.meta['proxy'] = 'http://{0}'.format(proxy_addr)
settings.py여기 가 관건 입 니 다.우 리 는
middlewares
안의HttpbinProxyMiddleware
류 아래 의 방법 을 실행 해 야 합 니 다.여기 서 주의해 야 할 것 은 제 가 미들웨어 를 다운로드 하 는 retry 미들웨어 를 취소 한 것 입 니 다.scrapy 자체 에 자동 으로 재 시도 하 는 방법 이 있 기 때문에 시험 효 과 를 위해 여기 서 묵 인 된 재 시도 미들웨어 를 취소 합 니 다.
DOWNLOADER_MIDDLEWARES = {
'httpbin.middlewares.HttpbinProxyMiddleware': 543,
# scrapy
'scrapy.downloadermiddlewares.retry.RetryMiddleware':None
}
주의:위 에서 제 가 방문 한 url 은 httpbin.org 입 니 다.이 사 이 트 는 대리 하지 않 아 도 열 수 있 습 니 다.여 기 는 FQ 도 구 를 열지 않 을 때 google.com 을 방문 할 수 있 습 니 다.제 가 공부 하 는 대리 주 소 는 기본적으로 국내 주소 이기 때문에 google 도 열 수 없습니다.
요약:
위 에서 우 리 는 두 가지 scrapy 플러스 대리 의 쓰기 방법 을 소개 했다.
1.첫 번 째 는 방문 할 때마다 프 록 시 IP 를 사용 하여 요청 하 는 것 입 니 다.
2.두 번 째 는 요청 결 과 를 정상적으로 얻 지 못 할 때 프 록 시 ip 을 사용 하 는 것 입 니 다.
3.우 리 는 scrapy 에서 logging 로 그 를 어떻게 인쇄 하 는 지 배 워 서 문제 와 실행 절 차 를 간단하게 판단 합 니 다.
작은 지식:
['scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware',
'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware',
'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware',
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware',
'httpbin.middlewares.HttpbinProxyMiddleware',
'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware',
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware',
'scrapy.downloadermiddlewares.redirect.RedirectMiddleware',
'scrapy.downloadermiddlewares.cookies.CookiesMiddleware',
'scrapy.downloadermiddlewares.stats.DownloaderStats']
2017-11-27 23:36:47 [scrapy.middleware] INFO: Enabled spider middlewares:
['scrapy.spidermiddlewares.httperror.HttpErrorMiddleware',
'scrapy.spidermiddlewares.offsite.OffsiteMiddleware',
'scrapy.spidermiddlewares.referer.RefererMiddleware',
'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware',
'scrapy.spidermiddlewares.depth.DepthMiddleware']
여기 서 우 리 는 Terminal 아래 에 인쇄 를 해서 간단하게 소개 할 수 있 습 니 다.1.scrapy 의 미들웨어 에서 해당 하 는 미들웨어 뒤의 숫자 가 작 을 수록 실행 우선 순위 가 높 습 니 다.
2.만약 에 어떤 것
download_middlewares
을 취소 하고 싶다 면 제 가 위 에 쓴 것 처럼 복사 하고 None 를 추가 하면 실행 하지 않 습 니 다.3.보충,만약 에 scrapy 의 기본 실행 프로 세 스 도 를 보 았 다 면 scrapy 는 미들웨어 를 다운로드 하 는 것 외 에 spider 미들웨어 도 있다 는 것 을 알 게 될 것 이 므 로 사용 할 때 잘못 사용 하지 마 세 요.
D:\ \ \scrapy_day6_httpbin\httpbin>scrapy settings --get=DOWNLOADER_MIDDLEWARES_BASE
{"scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware": 300, "scrapy.downloadermiddlewares.useragent.UserAgentMiddleware": 500, "scrapy.downloadermiddlewares.redirect.MetaRefres
hMiddleware": 580, "scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware": 900, "scrapy.downloadermiddlewares.redirect.RedirectMiddleware": 600, "scrapy.downloadermiddlewares.r
obotstxt.RobotsTxtMiddleware": 100, "scrapy.downloadermiddlewares.retry.RetryMiddleware": 550, "scrapy.downloadermiddlewares.cookies.CookiesMiddleware": 700, "scrapy.downloadermiddle
wares.defaultheaders.DefaultHeadersMiddleware": 400, "scrapy.downloadermiddlewares.stats.DownloaderStats": 850, "scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddlewar
e": 590, "scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware": 750, "scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware": 350, "scrapy.downloadermiddlewar
es.ajaxcrawl.AjaxCrawlMiddleware": 560}
더 많은 파 이 썬 관련 내용 은 본 사이트 의 주 제 를 볼 수 있 습 니 다.본 논문 에서 말 한 것 이 여러분 의 Python 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.