파 이 썬 파충류 프레임 워 크 scrapy downloadermiddleware 설정 proxy 에이전트 기능 예시

이 글 의 사례 는 Python 파충류 프레임 워 크 scrapy 가 다운 로 더 를 실현 하 는 것 을 다 루 었 습 니 다middleware 에서 proxy 프 록 시 기능 을 설정 합 니 다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
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,
}

spiders
httpbin_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 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기