python scrapy에 쿠키 스크랩 기록 추가 정보

6214 단어 scrapycookie
문제 발견:
얼마 전 프로젝트에서 봉인된 번호(제공된 사용 가능한 계정이 너무 적음)를 방지하기 위해 로그인하지 않고 캡처할 수 있는 내용에 대해 쿠키를 사용하지 않는 정책을 사용하고 필요한 내용만 쿠키를 가지고 방문합니다.
간단하게 생각했어요. 던지는 Request의 메타에 로고 위치를 가지고 Cookie Middleware에서 이 로고 위치를 보고 이 Request에 쿠키를 설치할지 여부를 결정합니다.
구현된 코드는 다음과 같습니다.

class CookieMiddleware(object):
  """
   
  """

  def __init__(self):
    client = pymongo.MongoClient(MONGO_URI)
    self.account_collection = client[MONGO_DATABASE][ACCOUNT_COLLECTION]

  def process_request(self, request, spider):
    if 'target' in request.meta: 
      logging.debug(' process_request ')
      flag = request.meta['target']
      if flag != 'no':
        all_count = self.account_collection.find({'status': 'success'}).count()
        if all_count == 0:
          raise Exception(' ')
        random_index = random.randint(0, all_count - 1)
        random_account = self.account_collection.find({'status': 'success'})[random_index]
        
        request.cookies = json.loads(random_account['cookie'])
      else:
        logging.debug(' XXX ')
    else:
      all_count = self.account_collection.find({'status': 'success'}).count()
      if all_count == 0:
        raise Exception(' ')
      random_index = random.randint(0, all_count - 1)
      random_account = self.account_collection.find({'status': 'success'})[random_index]
      
      request.cookies = json.loads(random_account['cookie'])
설정 중입니다.py의 구성은 다음과 같습니다.

DOWNLOADER_MIDDLEWARES = {
  'eyny.middlewares.CookieMiddleware': 550,
}
여기까지는 아마도 몇몇 사내들이 이미 실마리를 알아볼 수 있을 것이다. 나와 마찬가지로 이렇게 쓰는 것은 아무런 문제가 없다고 생각하는 동지들은 계속 아래를 내려다보았다.
이렇게 작성한 후에 나는 정상적으로 프로젝트를 열었고 합병량을 적당히 높였고 다음날 계좌번호가 봉쇄된 것을 발견했다.debug 과정에서 쿠키를 휴대하지 않아도 되는 URL을 캡처할 때 쿠키를 휴대했고 쿠키는 헤더에 놓여 있었다. 내가 두 시간 넘게 프레임워크 원본을 확인한 후에 그 원인을 발견했다.
원인 & 솔루션:
scrapy의 settings 디렉터리에 있는default_settings.py 파일에서 처음에 DOWNLOADER_MIDDLEWARES_BASE, 이러한 middlewares의 성명은 다음과 같습니다.

DOWNLOADER_MIDDLEWARES_BASE = {
  # Engine side
  'scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware': 100,
  'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware': 300,
  'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware': 350,
  'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware': 400,
  'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': 500,
  'scrapy.downloadermiddlewares.retry.RetryMiddleware': 550,
  'scrapy.downloadermiddlewares.ajaxcrawl.AjaxCrawlMiddleware': 560,
  'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware': 580,
  'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 590,
  'scrapy.downloadermiddlewares.redirect.RedirectMiddleware': 600,
  'scrapy.downloadermiddlewares.cookies.CookiesMiddleware': 700,
  'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 750,
  'scrapy.downloadermiddlewares.stats.DownloaderStats': 850,
  'scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware': 900,
  # Downloader side
}
DOWNLOADER에서 보실 수 있습니다_MIDDLEWARES_BASE에서도 쿠키 미들웨어를 성명했습니다. 700입니다. 즉, 우리가 쓴 쿠키 미들웨어(500)보다 뒤에 실행해야 합니다. 그리고 debug 과정에서 우리가 작성한 쿠키 미들웨어를 실행한 후에 헤더에서 쿠키를 휴대하지 않았지만 scrapy를 실행했습니다.downloadermiddlewares.cookies.Cookies Middleware: 700 이후 헤더에서 쿠키를 보았습니다. 이것은 쿠키가 scrapy가 자동으로 추가한 것을 의미합니다.
우리는 scrapy를 열었다.downloadermiddlewares.cookies.CookiesMiddleware의 실현 원본 코드, 주로process_request 메서드:

class CookiesMiddleware(object):
  """This middleware enables working with sites that need cookies"""

  def __init__(self, debug=False):
    self.jars = defaultdict(CookieJar)
    self.debug = debug

  @classmethod
  def from_crawler(cls, crawler):
    if not crawler.settings.getbool('COOKIES_ENABLED'):
      raise NotConfigured
    return cls(crawler.settings.getbool('COOKIES_DEBUG'))

  def process_request(self, request, spider):
    if request.meta.get('dont_merge_cookies', False):
      return

    cookiejarkey = request.meta.get("cookiejar")
    jar = self.jars[cookiejarkey]
    cookies = self._get_request_cookies(jar, request)
    for cookie in cookies:
      jar.set_cookie_if_ok(cookie, request)

    # set Cookie header
    request.headers.pop('Cookie', None)
    jar.add_cookie_header(request)
    self._debug_cookie(request, spider)

	def process_response(self, request, response, spider):
    if request.meta.get('dont_merge_cookies', False):
      return response

    # extract cookies from Set-Cookie and drop invalid/expired cookies
    cookiejarkey = request.meta.get("cookiejar")
    jar = self.jars[cookiejarkey]
    jar.extract_cookies(response, request)
    self._debug_set_cookie(response, spider)

    return response
위의 코드 중 가장 중요한 것은 process_request 방법의 내용을 볼 수 있습니다. 우선request에서 보실 수 있습니다.meta에서 dont_merge_쿠키 속성, 만약false가 없거나 없으면 나머지 방법, 슬롯을 실행하지 않습니다. 이것이 바로 우리가 찾는 방법입니다!너무 쉬운데...
특히 주의: dont_를 사용하려면merge_cookies=true, 그러면 우리 스스로 cookie를 헤더에 추가해야 합니다. *request를 통해.cookies = json.loads(random_account ['cookie'])** 방식으로 추가된 쿠키, scrapy도 더 이상 헤더에 통합되지 않습니다.
해결 방안: 우리의 해결 방법은 리퀘스트의 메타에 dont_를 넣는 것이다merge_쿠키 속성, 그리고true로 설정합니다. 쿠키 Middleware에서, 우리는 쿠키를 리퀘스트에 값을 부여하지 않고header에 추가합니다.cookies
문제는 해결되었지만 이렇게 간단하면 기분이 좋지 않기 때문에 왜 scrapy가 자동으로 쿠키를 추가할 수 있는지 계속 생각해 보세요. 그러면 다음 코드를 읽어야 합니다.
총결산
python scrapy에 쿠키를 추가하여 구덩이를 밟는 기록에 관한 이 글은 여기에 소개되었습니다. 더 많은 scrapy 쿠키 관련 내용은 저희 이전의 글을 검색하거나 아래의 관련 글을 계속 훑어보십시오. 앞으로 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기