Scrapy 프레임워크 일반 파충류 메커니즘에 대한 대응 전략
파충류와 반파충류, 이 서로 사랑하는 한 쌍은 그야말로 장관인 투쟁사를 쓸 수 있다.빅데이터 시대에 데이터는 돈이다. 많은 기업들이 자신의 사이트를 위해 반파충류 메커니즘을 운용하여 웹 페이지의 데이터가 파충류에 기어가는 것을 방지한다.그러나 만약에 반기어오르기 메커니즘이 너무 엄격하면 진정한 사용자의 요구를 손상시킬 수 있다.파충류와 부딪히고 낮은 오상률도 보장해야 한다면 연구 개발 원가도 높아질 것이다.
간단하고 저급한 파충류는 속도가 빠르고 위장도가 낮기 때문에 반기어오르기 메커니즘이 없으면 대량의 데이터를 빨리 잡을 수 있다. 심지어 요청이 너무 많아서 서버가 정상적으로 작동하지 못하게 된다.위장도가 높은 파충류는 기어오르는 속도가 느려 서버에 대한 부담도 적다.그래서 사이트 기어오르기의 중점도 간단하고 거친 파충류이다. 기어오르기 메커니즘도 위장도가 높은 파충류를 허용하고 데이터를 얻을 수 있다.위장도가 높은 파충류는 실제 사용자와 큰 차이가 없기 때문이다.
이 글은 주로 Scrapy 프레임워크를 사용할 때 일반적인 기어오르기 메커니즘에 어떻게 대응하는지 토론한다.
헤더 검사
가장 간단한 반전 메커니즘은 HTTP가 요청한 Headers 정보를 검사하는 것이다. 이는 User-Agent, Referer, Cookies 등을 포함한다.
User-Agent
User-Agent는 사용자가 사용하는 클라이언트의 종류와 버전을 검사하는 것으로 Scrapy에서 다운로드 중간부품에서 처리됩니다.예를 들면 설정.py에 많은 브라우저 User-Agent를 포함하는 목록을 만들고 random_user_에이전트 파일:
class RandomUserAgentMiddleware(object): @classmethod defprocess_request(cls, request, spider): ua = random.choice(spider.settings['USER_AGENT_LIST']) if ua: request.headers.setdefault('User-Agent', ua)
이렇게 하면 요청할 때마다 실제 브라우저의 User-Agent를 무작위로 선택할 수 있습니다.
Referer
Referer는 이 요청이 어디에서 왔는지 검사하는 것으로 보통 그림의 도난 사슬 판단을 할 수 있습니다.Scrapy에서 만약에 어떤 페이지 URL이 이전에 기어오른 페이지를 통해 추출된다면, Scrapy는 자동으로 이전에 기어오른 페이지 URL을 Referfer로 합니다.위의 방법으로 Referfer 필드를 정의할 수도 있습니다.
Cookies
사이트에서 쿠키의 session_ 을 감지할 수 있습니다id의 사용 횟수, 제한을 초과하면 반기어오르기 정책을 촉발합니다.그래서 Scrapy에서 COOKIES를 설정할 수 있습니다 _ENABLED=False는 요청에 쿠키를 가져오지 않습니다.
쿠키를 강제로 여는 사이트도 있으니 좀 귀찮아질 거예요.간단한 파충류를 따로 써서 목표 사이트에 쿠키가 없는 요청을 보내고 응답 중의 Set-cookie 필드 정보를 추출하여 저장할 수 있습니다.웹 페이지를 찾을 때 저장된 쿠키를 Headers에 가져옵니다.
X-Forwarded-For
요청 헤더에 X-Forwarded-For 필드를 추가하여 투명한 프록시 서버로 설명하면 일부 사이트는 프록시 서버에 약하다.
X-Forwarded-For 헤드 형식은 다음과 같습니다.
X-Forwarded-For:client1,proxy1,proxy2
여기서client1,proxy1을 랜덤 IP 주소로 설정하여 자신의 요청을 에이전트의 랜덤 IP로 위장하여 발생하는 요청입니다.그러나 X-Forwarded-For는 마음대로 변경할 수 있기 때문에 많은 사이트들이 이 값을 믿지 않는다.
IP 요청 수 제한
만약 어떤 IP의 요청 속도가 너무 빠르면 반기어오르기 메커니즘을 촉발한다.물론 기어오르는 속도를 늦추어 돌아갈 수 있다. 기어오르는 시간이 크게 늘어나는 대가를 치러야 한다.또 다른 방법은 에이전트를 추가하는 것이다.
간단합니다. 다운로드 중간부품에 추가:
request.meta['proxy'] = 'http://' + 'proxy_host' + ':' + proxy_port
그리고 요청할 때마다 다른 프록시 IP를 사용합니다.그러나 문제는 어떻게 대량의 프록시 IP를 얻습니까?
스스로 IP 에이전트를 써서 시스템을 얻고 유지할 수 있다. 정시에 각종 무료 에이전트 IP를 공개하는 사이트에서 무료 IP 에이전트를 찾은 다음에 정시에 이 IP와 포트가 사용할 수 있는지 검사하여 사용할 수 없는 에이전트 IP를 제때에 정리할 수 있다.이렇게 하면 동적 프록시 라이브러리가 있습니다. 요청할 때마다 라이브러리에서 무작위로 프록시를 선택하십시오.그러나 이 방안의 단점도 뚜렷하다. 개발 에이전트가 시스템을 얻고 유지하는 것 자체가 매우 힘들고 이런 무료 에이전트의 수량이 많지 않으며 안정성도 비교적 떨어진다.만약 반드시 대리를 써야 한다면, 안정적인 대리 서비스를 살 수도 있다.이 서비스들은 대부분 인증된 에이전트에 쓰일 것이다.
Requests 라이브러리에 인증된 에이전트를 추가하는 것은 간단합니다.
proxies = { "http": "http://user:[email protected]:3128/", }
그러나 Scrapy는 이러한 인증 방식을 지원하지 않습니다. 인증 정보 base64를 인코딩한 후 Headers의 Proxy-Authorization 필드에 추가해야 합니다.
importbase64 # Set the location of the proxy proxy_string = choice(self._get_proxies_from_file('proxies.txt')) # user:pass@ip:port proxy_items = proxy_string.split('@') request.meta['proxy'] = "http://%s" % proxy_items[1] # setup basic authentication for the proxy user_pass=base64.encodestring(proxy_items[0]) request.headers['Proxy-Authorization'] = 'Basic ' + user_pass
동적 로드
현재 점점 더 많은 사이트들이 aax 동적 불러오는 내용을 사용하고 있습니다. 이때 aax 요청을 캡처하여 분석할 수 있습니다. aax 요청에 따라 해당하는 API 요청의 URL을 구성하면 원하는 내용을 직접 얻을 수 있습니다. 보통 json 형식이기 때문에 오히려 HTML을 해석할 필요가 없습니다.
그러나 aax 요청은 백엔드 감시권을 거치기 때문에 URL을 직접 구성하여 얻을 수 없는 경우가 많다.이 때 PhantomJS+Selenium을 통해 브라우저 동작을 시뮬레이션하여 js 렌더링을 거친 페이지를 캡처할 수 있습니다.
주의해야 할 것은 Selenium을 사용하면 요청이 더 이상 Scrapy Downloader에서 실행되지 않기 때문에 이전에 추가한 요청의 일등 정보는 효력을 상실합니다. Selenium에 다시 추가해야 합니다
headers = {...} for key, valuein headers.iteritems(): webdriver.DesiredCapabilities.PHANTOMJS['phantomjs.page.customHeaders.{}'.format(key)] = value
또한 PhantomJs를 호출하려면 PhantomJs의 실행 가능한 파일 경로를 지정해야 합니다. 보통 이 경로를 시스템의 path 경로에 추가하여 프로그램이 실행할 때 자동으로 path에서 찾을 수 있도록 합니다.우리의 파충류는 항상crontab에 넣고 정해진 시간에 실행되지만crontab의 환경 변수는 시스템의 환경 변수와 다르기 때문에 PhamtonJs가 필요로 하는 경로를 불러올 수 없기 때문에 설명할 때 경로를 지정하는 것이 가장 좋다.
driver = webdriver.PhantomJS(executable_path='/usr/local/bin/phantomjs')
총결산
이상은 바로 본고가 Scrapy 프레임워크의 일반적인 파충류 메커니즘에 대한 대응 전략에 관한 모든 내용입니다. 여러분께 도움이 되기를 바랍니다.관심 있는 친구는 본 사이트를 계속 참조할 수 있습니다.
scrapy 파충류 실례 공유
Python 로그인 및 CSDN 블로그 모든 글 목록 코드 인스턴스 가져오기
python 프로그래밍은 12306의 작은 파충류 실례를 실현한다
부족한 점이 있으면 댓글로 지적해 주십시오.여러분의 본 사이트에 대한 지지에 감사 드립니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.