2012-11-19 3 views
3

일부 웹 스크래핑 작업을 위해 파이썬을 사용하여 웹 페이지를 다운로드하고 싶습니다. 문제는 웹 사이트에서 쿠키를 사용하도록 설정해야하며 그렇지 않으면 다른 버전의 페이지를 제공한다는 것입니다. 문제를 해결하는 솔루션을 구현했지만 저의 의견으로는 비효율적입니다. 그것을 개선하기 위해 당신의 도움이 필요합니다!파이썬에서 쿠키 사용 페이지 가져 오기

import requests 
import cookielib 

cj = cookielib.CookieJar() 
user_agent = {'User-agent': 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'} 
#first request to get the cookies 
requests.get('https://ccirecruit.cox.com/psc/RECRUIT/EMPLOYEE/HRMS/c/HRS_HRAM.HRS_CE.GBL?JobOpeningId=42845&SiteId=1&Page=HRS_CE_JOB_DTL&PostingSeq=1&',headers=user_agent, timeout=2, cookies = cj) 
# second request reusing cookies served first time 
r = requests.get('https://ccirecruit.cox.com/psc/RECRUIT/EMPLOYEE/HRMS/c/HRS_HRAM.HRS_CE.GBL?JobOpeningId=42845&SiteId=1&Page=HRS_CE_JOB_DTL&PostingSeq=1&',headers=user_agent, timeout=2, cookies = cj) 
html_text = r.text 

는 기본적으로, 나는 CookieJar 객체를 생성 한 후 같은 URL에 대한 두 개의 연속 된 요청을 보낼 : 지금 그것을 통해 이동하는 방법

이입니다. 처음으로 나에게 나쁜 페이지를 제공하지만 보상으로 쿠키가 제공됩니다. 두 번째 요청은이 쿠키를 재사용하고 올바른 페이지를 얻습니다.

질문 : 하나의 요청을 사용하고 여전히 올바른 쿠키 사용 버전을 얻을 수 있습니까?

트래픽을 최소화하기 위해 GET 대신 처음으로 HEAD 요청을 보내려고했습니다.이 경우 쿠키는 제공되지 않습니다. 그것으로 인터넷 검색도 나에게 대답을주지 않았다. 그래서 효율적으로 만드는 방법을 이해하는 것은 흥미 롭습니다! 어떤 아이디어?

+0

요청에서 시작하는'CookieJar'로 수동 작업 할 필요가 없습니다. 0.6.0 http://kennethreitz.com/requests-v060-released.html#dict-cookies – yonilevy

+0

그래, @yonilevy 좋은 캐치! 그런 식으로 사용할 것입니다. – Nik

+0

링크가 끊어졌습니다 @yonilevy – goldisfine

답변

2

쿠키를 가져 오라는 요청을해야하므로 쿠키를 구하고 두 가지 별도의 요청을하지 않고 다시 사용할 수 없습니다. "쿠키 사용"쿠키를 가진 것으로 스크립트를 인식 버전 의미는, 다음의 모든 서버에 의존하여 경우에 당신은 시도 할 수 :

  • 을 첫 번째 요청을하기 전에 쿠키를 하드 코딩,
  • 일부 요청
  • 일부 walkaroung을 찾으려고 시도합니다. (일부 GET 인수를 추가하면 사이트가 쿠키를 가지고 있다고 믿게 될 것입니다.하지만 이걸 찾아야 할 것입니다. 특정 사이트),
+0

Thanks @Tadeck! 나는 실제로 페이지를 미리 알지 못하며, 쿠키가 있거나없는 쿠키가 자신의 편에서 어떤 행동이 될지 예측할 수 없습니다. 따라서이 경우에는 귀하의 의견을 고려하여 2 건의 요청이 필요하다고 생각합니다. BTW, 쿠키를 사용할 수있게 설정하려면 올바른 페이지를 제공하기 위해 서버가 쿠키를 요구합니다. 브라우저에 예제에 나와있는 페이지를로드 할 때 올바른 페이지가 표시되기 전에 서버가 여러 메시지를 교환하는 것처럼 보입니다. – Nik

+0

또한 적어도 내 DB의 모든 페이지에 대해이 순차적 요청을 수행하는 방법이있을 수 있습니까?! 일부 페이지가 처음부터 페이지에 표시되지만, 때로는이 문제가 발생한다고 가정 해보십시오. 해당 페이지가 첫 번째 요청에서 ** 서로 게이트 **인지 여부를 판단 할 수있는 방법이 있습니까?나는 아직도, 당신은 어떻게 생각하십니까? – Nik

+0

@Nick : 페이지를 긁어내는 것을 원치 않으므로 쉽게 식별 할 수없는 것처럼 보입니다. 나는 여러 다른 사이트에 대해 이러한 사례를 확인하는 보편적 인 방법이 없다고 생각합니다. 이 특정한 경우에는 차이점을 파악할 수 있습니다 (예 : 첫 번째 응답에는 "respondwithsignonpage"헤더가 "true"로 설정되어 있습니다.이 헤더는 검사에 사용할 수 있습니다. 그러나 이것은 비표준 HTTP 헤더이며 대부분 다른 사이트에서는 찾을 수 없습니다. – Tadeck

2

나는 여기서 우승자가 requestssession 프레임 워크를 사용하여 쿠키를 처리 할 수 ​​있다고 생각합니다.

import requests 
import cookielib 

user_agent = {'User-agent': 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)'} 
s = requests.session(headers=user_agent, timeout=2) 

r = s.get('https://ccirecruit.cox.com/psc/RECRUIT/EMPLOYEE/HRMS/c/HRS_HRAM.HRS_CE.GBL?JobOpeningId=42845&SiteId=1&Page=HRS_CE_JOB_DTL&PostingSeq=1&') 
html_text = r.text 

것을 시도하고 그것이 작동하는지 확인 :

다음과 같이 보일 것입니다 그?

+1

아니요, @jdotjdot, 작동하지 않았습니다. 그 이유는 세션도 쿠키를 업데이트하기위한 첫 번째 상호 작용이 필요하기 때문입니다. 이 경우에도 두 가지 요청이 필요합니다. 그래도 고마워! – Nik

+0

그래, 나는's.head (...)'를 사용하여 다시 시도해 보았는데, 그 중 하나가 작동하지 않았다. 이상한 문제의 종류. – jdotjdot